您的当前位置:首页正文

【智能仪表课程设计】报告

2020-11-03 来源:易榕旅网


课程设计名称: 智能仪表课程设计 题目 : 温度控制器 指导教师 : 王桂荣

班级 : 06自动化1班 姓名 : 张晓杰 王明星 俞甫

时间 : 2009/06/15—2009/06/30

2009年 6月 25 日

中国计量学院 课程设计

目 录

1、简介........................................................................................................................................- 2 - 2、设计目的................................................................................................................................- 2 - 3、设计要求................................................................................................................................- 2 - 4、系统方案................................................................................................................................- 2 -

(1)电源方案:................................................................................................................- 3 - (2)显示方案:................................................................................................................- 3 - (3)串口通讯方案论证:................................................................................................- 4 - (4)温度上下限超限报警部分........................................................................................- 5 - (5)键盘部分....................................................................................................................- 5 - 5、方案设计................................................................................................................................- 6 -

(1)硬件设计....................................................................................................................- 6 -

1、DS18B20的性能特点...........................................................................................- 6 - 2、DS18B20的内部结构...........................................................................................- 7 - (2)软件设计....................................................................................................................- 8 - (3)C51程序流程图......................................................................................................- 10 - (4)串口通信..................................................................................................................- 11 - (5)设计实物图..............................................................................................................- 12 - (6)、设计心得................................................................................................................- 14 - 参考文献 ................................................................................................................................- 15 - 附录...........................................................................................................................................- 15 -

(1)元件清单:..............................................................................................................- 15 - (2)完整电路图:..........................................................................................................- 16 - (3)VB串口通讯程序代码:........................................................................................- 17 - (4)单片机源程序:......................................................................................................- 19 -

- 1 -

中国计量学院 课程设计

1、简介

本系统是基于AT89S52单片机为核心的,由DS18B20作为温度传感器

来测量温度,具有一定的精度,并可通过设置温度SP值用继电器通断来实现对温度的位式控制,使用LM016L液晶来显示相关参数。除此之外,系统还具有温度上下限超限报警功能及通过MAX232电路与PC进行通信。

温度控制器,作为智能仪表的一种,目前主流大多采用PID控制方法,具有温度测量、显示、控制、报警、通讯等功能,测量和控制精度也可以做的很高。在科学研究和生产实践的诸多领域中,温度控制占有着极为重要的地位,特别是在冶金、化工、建材、食品、机械、是有等工业中,具有举足轻重的作用。

2、设计目的

只能仪表课程设计是自动化专业的专业实践课程。本课程的目的是通过“温度控制器的设计”的设计过程,结合所学课程,使学生掌握目前自动化仪表的一般设计要求、工程设计方法、开发及设计工具的使用方法,通过这一设计实践过程,锻炼学生的动手能力和分析、解决问题的能力;积累经验,

培养按部就班、一丝不苟的工作和对所学知识的综合应用能力。

3、设计要求

1、 2、 3、 4、 5、

对环境温度进行测量,测量范围-10~+50℃;

将温度测量值在四位LED数码管或LCM液晶显示模块显示; 可以通过按键输入设定值;

能根据设定值和实际输入进行位式输出控制; 带有一定的扩展功能:

①、具有温度上下限超限报警功能; ②、具有数据传送功能;

4、系统方案

单片机采用AT89S52,AT89S52是一种带8K(2DPTR)字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

- 2 -

中国计量学院 课程设计

图1 单片机最小系统

(1)电源方案:

由变压器输入7805的1脚,2脚接地,3脚+5V输出,中间加2个104电容和1000u的电解电容分别为了退耦和稳压。使+5V更稳定地输出。下图是电源接线图。

图 2 电源接线图

(2)显示方案:

由于用数码管作为显示电路,结构单一,扩展空间太小,显示效果不理想,最终我们放弃了数码管显示。而采用1602作为显示不但实现了用数码管难以显示的功能,而且适合做各类扩展,使得温度控制器功能更完善,使用效果更好。 其中7-14脚为数据口脚,3脚为背景灯亮度调节脚,EN、RW、RS命令状态字脚。我们可以通过程序使1602显示各类字符。

- 3 -

中国计量学院 课程设计

图3 1602显示电路 (3)串口通讯方案论证:

采用MAX232作为RS232的电平转换芯片,它将单片机输出的TTL电平转换成PC机能接收的232电平或将 PC机输出的232电平转换成单片机能接收的TTL电平。通过电平转换,单片机可以和上位机实现波特率在9600的串口通讯功能,实现由上位机输入模式转换信号,系统实现模式切换的功能。接线图如图4

图4 串口通讯接线图

- 4 -

中国计量学院 课程设计

(4)温度上下限超限报警部分

如图所示,如果P2.3状态为高电平的话,蜂鸣器报警,如果P2.3为低电平,蜂鸣器不报警,8550用来增加驱动能力,1K欧姆电阻用来限流。通过软件可以很好地控制它的工作状态来实现温度上下限超限报警,这样就可以使温度控制在安全的范围内。

图5 报警电路

(5)键盘部分

通过程序的扫描,判断按键,并切换到不同的功能模式中。实现模式切换后可以实现温度控制器各功能。主要为光标的移动、温度设定值的设定(增大和减小)及计时器的清零键,另外

图6 键盘硬 件电路 图

- 5 -

中国计量学院 课程设计

5、方案设计 (1)硬件设计

电源 Ds18b20温度传感器 AT89S52 1602液晶显示 继电器 RS232 串口通讯控制 键盘 上下限超限报警 下载模式 电源 图7 系统硬件框图

电源部分提供整个系统的电能,单片机部分控制系统,显示部分显示测量结果以,模数转换采集电压以及电阻值发送到单片机,如果电压过高超过量程或者测量短路,单片机控制蜂鸣器报警。通过程序烧录模块可以通过烧录线烧入程序。通过串口通讯可以实现上位机与电压表的通讯,通过上位机选择,可以切换电压表模式,从而实现上位机功能选择的功能。 温度传感器DS18B20介绍:

1、DS18B20的性能特点

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,他能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读书方式。DS18B20的性能特点可归纳如下:

● 独特的单线接口仅需要一个端口引脚进行通信;

● 多个DS18B20可以并联在唯一的3线上,实现多点组网功能; ● 无需外部部件,零待机功耗; ● 温度以9或12位数字量读出;

- 6 -

中国计量学院 课程设计

● 用户可定义的非易失性温度报警设置;

● 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件; ● 负电压特性,电源极性接反时,温度计不会因发热而烧毁,只是不能正常工作;

2、DS18B20的内部结构

DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图所示。

I/O 存储器与控制逻辑 温度传感器 64位ROM 和 高 高温触发器TH C 单线接口 速 缓 低温触发器TL 存 配置寄存器 VDD 8位CRC发生器 图 8 DS18B20内部结构图

非易失性温度报警触发器TH和TL,可通过软件写入报警上下限。 高速ROM中还存放着相应的分辨率转化的相应精度的数值。 2、DS18B20测温原理

- 7 -

中国计量学院 课程设计

斜率累加器 预置 低温度系数振荡器 减法计数器1 增加 减到0 温度寄存器 计数器比较器 预置 停止 高温度系数振荡器 减法计数器2 减到0 图 9 DS18B20测温原理图

减法计数器1对低温度系数晶振产生的脉冲信号进行剑法技术,当其预置数减到0时,温度寄存器的值将加1,减法计数器1的预置值将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数。如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加。此时温度寄存器中的数值就是所测得温度值。

图10 DS18B20封装图 (2)软件设计

单片机程序采用keil uvision2编程软件和C 编程语言来实现,串口使用Visual Basic 6.0 软件实现。

- 8 -

中国计量学院 课程设计

KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强, 使用户可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编 器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三 方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。

Visual Basic 是一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发 Windows 环境下的各类应用程序。它简单易学、效率高,且功能强大可以与 Windows 专业开发工具SDK相媲美。在Visual Basic环境下,利用事件驱动的编程机制、新颖易用的可视化设计工具,使用Windows内部的广泛应用程序接口(API)函数,动态链接库(DLL)、对象的链接与嵌入(OLE)、开放式数据连接(ODBC)等技术,可以高效、快速地开发Windows环境下功能强大、图形界面丰富的应用软件系统。随着版本的提高,Visual Basic的功能也越来越强。

- 9 -

中国计量学院 课程设计

(3)C51程序流程图

主程序流程图: 开始 系统初始化 显示时间 N 有键按下? Y 模式判断改变系统功能 串口通讯 显示 结束 图11 程序流程图

定时中断流程:图: 开始 定时器开启 显示时间 N 交流采样? Y 采样显示 Y 是否计时? N 结束 - 10 -

中国计量学院 课程设计

(4)串口通信

1)vb界面设计如下图

图12 VB串口通讯界面

2)功能说明

1.使用COM1端口与单片机相连,波特率为9600。

2.可以设定温度值,通过“下载”键可以下载在单片机从而来控制单片机,并把设定的温度值转化成ASCII码显示。

3.可以读取实时的温度值和时间值,可手动接收也可自动接收。 4.可以把读取的数据保存为Excel文件。 5.通讯协议:

握手字 0xA0

同步头 0xFA

数据高字节 数据低字节 结束命令字 0x8F

- 11 -

中国计量学院 课程设计

(5)设计实物图

图13 ISP下载器

- 12 -

中国计量学院 课程设计

图14 液晶显示

图 15 最小系统

- 13 -

中国计量学院 课程设计

图 16 系统说明图

(6)、设计心得:

硬件电路乍看起来很简单,但是要把电路完全焊接正确也是相当困难的,我

们采用模块焊接法,就是根据模块划分来一个一个焊接,每焊完一个模块就进行测试,测试正确则下一个模块,错误就不断检查,这样就大大减少了我们的焊接时间,也提高电路焊接的正确率。

在软件联合调试上,总是会出现这样那样的问题,往往会有程序的死角或是许多错误,通过细心的调试,学到了很多,也学到了一些编程的技巧,尤其是多中断的理解更加深刻。问题虽然解决了,但是还有很多东西值得我们思考,尤其在程序的效率,还有很多需要改进的地方,这个我们觉得自己做的远远不够。做编程的工作不但锻炼了我们编程的能力,更培养了细心、严谨的作风,我觉得对以后的工作中很有用。

经过几天的程序设计和硬件设计,我感触颇深的是解决问题的方法、技巧。在这几天中,我们遇到许许多多问题,对待问题要多方法处理,多角度处理。通过这几天的课程设计,我们不但增强了实践能力和协作精神,而且懂得了联系实际的重要性,也懂得了什么叫团队合作,这对我们以后的学习和工作不无裨益。当然,我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请各位老师批评指正。

- 14 -

中国计量学院 课程设计

参考文献 

[1] 赵亮.《单片机C语言编程与实例》,人民邮电出版社 [2] 范逸之.《利用Visual Basic实现串并口通讯技术》,清华大学出版社

附录

(1)元件清单:

AT89S52一片;1602显示屏一块;MAX232电平转换芯片一片;7805稳压管一片;开关6个;蜂鸣器一个;8550三极管2个;10K电阻4个;串口借口一个;程序烧录接口一个;1000u电容两个;104电容6个;25PF电容2个;11.0592M晶振一个;发光二极管一个;排线插针若干;

- 15 -

中国计量学院 课程设计

(2)完整电路图:

- 16 -

中国计量学院 课程设计

(3)VB串口通讯程序代码:

Public Sub Sendbit(ByVal a As Integer) If a > 255 Then a = 255 End If

If a < 0 Then a = 0 End If

Dim mm(0 To 0) As Byte mm(0) = a

MSComm1.OutBufferCount = 0 MSComm1.InBufferCount = 0 MSComm1.Output = mm() End If End Sub

Private Sub Command5_Click()

CommonDialog1.Filter = \"文档文件(*.xls)|*.xls|所有文件(*.*)|*.*\" CommonDialog1.ShowSave

MsgBox \"保存完毕\

If CommonDialog1.FileName = \"\" Then Exit Sub Open CommonDialog1.FileName For Output As #1 Print #1, Text2.Text Close #1

End Sub

Private Sub Command6_Click() Text2.Text = \"\" End Sub

Private Sub Command7_Click() End End Sub

Private Sub Form_Load() MSComm1.PortOpen = True

End Sub

Public Sub delay(ByVal a As Integer) For i = 1 To 550000

- 17 -

中国计量学院 课程设计

Next End Sub

Private Sub Command1_Click()

If Len(Text1.Text) > 2 Or Text1.Text = \"\" Then Label1.Caption = \"数据设定错误\" Else

Dim ll, hh As String s = Text1.Text

For i = 1 To Len(s)

ss = ss + Hex(Asc(Mid(s, i, 1)))

ll = ss \\ 100 hh = ss Mod 100 hhh = \"&h\" & hh lll = \"&h\" & ll Text3.Text = hhh Text4.Text = lll Sendbit (&HA0) delay (12) Sendbit (&HFA) delay (12) Sendbit (hhh) delay (12) Sendbit (lll) delay (12) Sendbit (&H8F)

Label1.Caption = \"发送完毕\" End If End Sub

Private Sub Command2_Click() Text1.Text = \"\" Text3.Text = \"\" Text4.Text = \"\" Label1.Caption = \"\" End Sub

Private Sub Command3_Click() Timer1.Enabled = False Dim buf$ buf = \"\"

buf = MSComm1.Input

- 18 -

中国计量学院 课程设计

Text2.Text = Text2.Text & buf & vbCr End Sub

Private Sub Command4_Click() Timer1.Enabled = True End Sub

Private Sub Timer1_Timer() If Timer1.Enabled = True Then

Dim buf$ buf = \"\"

buf = MSComm1.Input

Text2.Text = Text2.Text & buf & vbCr End If End Sub

(4)单片机源程序:

- 19 -

单片机课程设计 张晓杰 俞甫 王明星.c1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

//**<程序名>:温度控制器//**<版本说明>:v1.0.0

//**<完成时间>:2009年6月20日//**<作者>:CrazyApple#include #include

#define LCD1602_DATAPORT P0

//#define reset() {WDT = 0x1e; WDT = 0xe1;}//sfr WDT = 0xa6;

sbit LCD1602_RS = P2^0;sbit LCD1602_RW = P2^1;sbit LCD1602_EN = P2^2;sbit BJOUT = P2^3;sbit JDQOUT = P2^4;sbit DS18B20_TSOR = P2^5;sbit DownLoad = P2^7;bit ON_OFF;bit outflag;

#define Break_Code 0x8F//下载结束字符#defineACK0 0xa0//握手首字节#defineACK1 0xfa//握手次字节#defineACK2 0x0f//握手确认字节

** ** ** **

2009-6-25 19:05

/*------------------------------------------全局变量声明------------------------------------------------*/

static unsigned char DS18B20_TempZ,DS18B20_TempX,DS18B20_Fflag=0;//温度值的整数部分,小数部分,负温度。static char line[] =\"PV: . C SET: C\";

static unsigned char cnt,deda,sec,min,hour;//时间变量char T = 21;//温度设定值,规定大于等于0度static unsignedchar set;//模式标识符

unsigned char Tmax=55,Tmin=5;//温度高底限

char code str0[] =\" \";

char code str1[] =\"Design For KCSJ \";char str2[] =\" 2009 06 20 \";char code str3[] =\" Zhang Xiao Jie \";char code str4[] =\" NO.0600102121 \";char code str5[] =\" Wang Ming Xin \";char code str6[] =\" NO.0600102135 \";char code str7[] =\" YU FU \";

char code str8[] =\" NO.0600102126 \";char code str9[] =\" System Init \";char strA[] =\"--- : : --- \";

/*------------------------------------------自定义字符集------------------------------------------------*///字符℃ 年月日

unsigned char idata table0[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00,//℃ 0x00 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//年 0x01 0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11,//月 0x02

0x0f,0x09,0x09,0x09,0x0f,0x09,0x09,0x0f,//日 0x03 0x05,0x1e,0x1c,0x1d,0x1d,0x1c,0x1e,0x05};//喇叭0x04

//*------------------------------------------温度传感器驱动----------------------------------------------*///---小数部分二进制值------------ 0 1 2 3 4 5 6 7 8 9 A B C D E F//---转换后的十进制值------------ 0 1 1 2 3 3 4 4 5 6 6 7 8 8 9 9

unsigned code DS18B20_XStab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,void DS18B20_Delay15();void DS18B20_Delay60();

void DS18B20_Delay100ms();void DS18B20_Write0TS();void DS18B20_Write1TS();bit DS18B20_ReadTS();void DS18B20_ResetTS();

void DS18B20_WriteByteTS(unsigned char byte);unsigned char DS18B20_ReadByteTS();void DS18B20_InitTS();

void DS18B20_GetTempTS();

/*-------------------------------------------LCD驱动函数------------------------------------------------*/void LCD1602_DelayL(); //长延时

LCD1602_DelayS(); //短延时void

页号: 1 / 15

单片机课程设计 张晓杰 俞甫 王明星.c72737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142

2009-6-25 19:05

void LCD1602_WriteCommand(unsigned char c); //写命令字void LCD1602_WriteData(unsigned char c);//写数据void LCD1602_ShowChar(unsigned char pos,unsigned char c);//打印一个字符void LCD1602_ShowString(unsigned char line,char *ptr); //打印一个字符串,带初始行void LCD1602_Printf(unsigned char *str); //打印一个字符串,不带初始行void LCD1602_MoveTo(unsigned char x, unsigned char y);//行列坐标设定void LCD1602_XYString(unsigned char x,unsigned char y,char *ptr);//在XY处打印字符串,精确定位

void LCD1602_XYChar(unsigned char x,unsigned char y,unsigned char c);//在XY处打印一个字符,精确定位//unsigned char LCD1602_ReadData();//读数据-只读取光标处的一个字void LCD1602_ShowHanZi(unsigned char x,unsigned char y,unsigned char m);//在X,Y出显示一个自己画的图形,可void LCD1602_WriteCGRAM(unsigned char k,unsigned char table[]);//向CGRAM中写自己画的图或者是数据,汉字等void LCD1602_Init(); //液晶初始化1602

/*-------------------------------------------定时器T0初始化--------------------------------------------*/void Init_Timer0(void);//定时器T0初始化

/*-------------------------------------------开机动画--------------------------------------------------*/void KaiJDH(void);//开机动画

/*-------------------------------------------液晶工作模式函数集----------------------------------------*/void LCD_Mod0(void);void LCD_Mod1(void);void LCD_Mod2(void);void LCD_Mod3(void);

/*-------------------------------------------键盘扫描函数----------------------------------------------*/void Key_Scan(void); //扫描P2口键盘,共5个健void Key_Set();//\"MS\"键void Key_Inc();//\"+\"键void Key_dec();//\"-\"键

void delay(unsigned int k);

/*-------------------------------------------串口下载函数----------------------------------------------*/unsigned char Check_DownLoad(void);//检测是否可下载void DownLoad_Mode(void);//下载模式

void UART_Send_1B(unsigned char sdat);//向UART发送一字节数据unsigned char UART_Recive_1B(void);//从UART接收一字节数据void RS232_Init(void);

/*--------------------------------------------主程序---------------------------------------------------*/void main (void){

LCD1602_DelayL();

LCD1602_Init();//初始化LCD LCD1602_DelayL();KaiJDH();//开机启动动画 LCD1602_ShowString(1,line);LCD1602_ShowHanZi(1,7,1);LCD1602_ShowHanZi(1,15,1);Init_Timer0();RS232_Init();

LCD1602_ShowString(0,strA); LCD1602_DelayS();

DS18B20_InitTS(); //初始化温度计

DS18B20_GetTempTS();//读取测得的环境温度 while(1) {

if(Check_DownLoad()) //检测下载状态

DownLoad_Mode(); //如果Download管脚为0电平,进入下载模式

//========================================================================

switch(set)//LCD根据工作模式进行显示{

case 0:LCD_Mod0();break;//正常工作显示case 1:LCD_Mod1();break;//调整时显示case 2:LCD_Mod2();break;// 调整分显示case 3:LCD_Mod3();break;//设置控温值显示default:break;}

delay(300);

DS18B20_GetTempTS();//读取测得的环境温度if(DS18B20_Fflag == 0)//温度高底限报警{

if(DS18B20_TempZ>=Tmax||DS18B20_TempZ<=Tmin){

BJOUT = 0;

strA[14]=0x04;

页号: 2 / 15

单片机课程设计 张晓杰 俞甫 王明星.c143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213

}else{

BJOUT = 1;strA[14]=' ';}

}else{

BJOUT = 0;}

if(ON_OFF==1)//若控温标志为1,控制继电器动作,进行位式控制{

if(DS18B20_Fflag == 0){

if(DS18B20_TempZ>=T){

delay(1000);//

if(DS18B20_TempZ>=T) //测得的温度大于等于控温值+1度时,停止继电器工作加热

{

outflag=1;JDQOUT=1;}}

if(DS18B20_TempZdelay(1000);

if(DS18B20_TempZoutflag=1;JDQOUT=0;}

}

}else{

outflag=1;JDQOUT=0;}

}

else // 否则控温标志为0,不进行位式控制{

outflag=0;JDQOUT=1;}

if(deda>10){

UART_Send_1B(hour/10+0x30);

UART_Send_1B(hour%10+0x30);UART_Send_1B(':');

UART_Send_1B(min/10+0x30);UART_Send_1B(min%10+0x30);UART_Send_1B(':');

UART_Send_1B(sec/10+0x30);UART_Send_1B(sec%10+0x30);UART_Send_1B('-');UART_Send_1B('-');UART_Send_1B('>');UART_Send_1B('T');UART_Send_1B('=');

UART_Send_1B(DS18B20_TempZ/10+0x30);UART_Send_1B(DS18B20_TempZ%10+0x30);UART_Send_1B('.');

UART_Send_1B(DS18B20_TempX+0x30);UART_Send_1B('C');UART_Send_1B(0x0a);}

2009-6-25 19:05

页号: 3 / 15

单片机课程设计 张晓杰 俞甫 王明星.c214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284

2009-6-25 19:05

}}

void Time_zd0(void) interrupt 1 using 1{

TH0 = -(50235/256);TL0 = -(50235%256);deda++;cnt++;

if(deda>=20){

sec++;deda = 0;}

if(sec>=60){

min++;sec = 0;}

if(min>=60){

hour++;min = 0;}

if(cnt>=6)cnt = 0;Key_Scan();}

/*--------------------------------------LCD驱动子程序--------------------------------------------------*/void LCD1602_DelayL(){unsigned char i,j; i=0xF0; j=0xFF; while(i--) while(j--);}

void LCD1602_DelayS(){

unsigned char i; i=0x1F; while(i--);}

void LCD1602_WriteCommand(unsigned char c){

LCD1602_DelayS(); LCD1602_EN=0; LCD1602_RS=0; LCD1602_RW=0; _nop_();

LCD1602_EN=1;

LCD1602_DATAPORT=c; LCD1602_EN=0;}

void LCD1602_WriteData(unsigned char c){

LCD1602_DelayS(); LCD1602_EN=0; LCD1602_RS=1; LCD1602_RW=0; _nop_();

LCD1602_EN=1;

LCD1602_DATAPORT=c; LCD1602_EN=0; LCD1602_RS=0;}

页号: 4 / 15

单片机课程设计 张晓杰 俞甫 王明星.c285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355

2009-6-25 19:05

void LCD1602_ShowChar(unsigned char pos,unsigned char c){

unsigned char p; if(pos>=0x10) p=pos+0xB0; else

p=pos+0x80;

LCD1602_WriteCommand(p); LCD1602_WriteData(c);}

void LCD1602_ShowString(unsigned char line,char *ptr){

unsigned char l,i; l=line<<4;

for(i=0;i<16;i++)

LCD1602_ShowChar(l++,*(ptr+i));}

void LCD1602_MoveTo(unsigned char x, unsigned char y){

if(x==0)

LCD1602_WriteCommand(0x80|y);if(x==1)

LCD1602_WriteCommand(0xc0|y);}

void LCD1602_XYString(unsigned char x,unsigned char y,char *ptr){

LCD1602_MoveTo(x,y);LCD1602_Printf(ptr);}

void LCD1602_XYChar(unsigned char x,unsigned char y,unsigned char c){

LCD1602_MoveTo(x,y);LCD1602_WriteData(c);}

void LCD1602_Printf(unsigned char *str){

while(*str!='\\0'){

LCD1602_WriteData(*str);str++;}}

/*

unsigned char LCD1602_ReadData(){

unsigned char i; LCD1602_DelayS(); LCD1602_EN=0; LCD1602_RS=1; LCD1602_RW=1; _nop_();

LCD1602_EN=1;

i=LCD1602_DATAPORT; LCD1602_EN=0; LCD1602_RS=0;i; return

}*/

void LCD1602_ShowHanZi(unsigned char x,unsigned char y,unsigned char m){

页号: 5 / 15

单片机课程设计 张晓杰 俞甫 王明星.c356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426

unsigned char i;if(x==0){

if(m<5) {

for (i=0;iLCD1602_MoveTo(x,y+i);//在第一行第12列位置显示心图案的上半部 LCD1602_WriteData(i); LCD1602_DelayS(); } } else {

for (i=0;i<4;i++) {

LCD1602_MoveTo(x,y+i);//在第一行第12列位置显示心图案的上半部 LCD1602_WriteData(i); LCD1602_DelayS(); }

for (i=0;iLCD1602_MoveTo(x+1,y+i);//在第二行第12列位置显示心图案的下半部 LCD1602_WriteData(i+4);

= LCD1602_DelayS();

} }}else{

if(m>4) m4;

for (i=0;iLCD1602_MoveTo(x,y+i);//在第一行第12列位置显示心图案的上半部 LCD1602_WriteData(i); LCD1602_DelayS(); }}}

void LCD1602_WriteCGRAM(unsigned char k,unsigned char table[]){

unsigned char i,j,LCD1602_Tmp;

LCD1602_Tmp=0x40;//设置CGRAM地址的格式字

//设置CGRAM地址从头开始k=0;

for( i=0;i<8;i++) {

for( j=0;j<8;j++) {

LCD1602_WriteCommand(LCD1602_Tmp+j); // 设置自定义字符的 CGRAM 地址 LCD1602_DelayS();

LCD1602_WriteData(table[k]); // 向CGRAM写入自定义字符表的数据 k++;

LCD1602_DelayS(); }

LCD1602_Tmp=LCD1602_Tmp+8; }}

void LCD1602_Init(){

LCD1602_DelayL();

LCD1602_WriteCommand(0x38); LCD1602_WriteCommand(0x38); LCD1602_WriteCommand(0x06); LCD1602_WriteCommand(0x0C); LCD1602_WriteCommand(0x01); LCD1602_WriteCommand(0x80);}

2009-6-25 19:05

页号: 6 / 15

单片机课程设计 张晓杰 俞甫 王明星.c427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497

2009-6-25 19:05

/*------------------------------------------温度传感器子程序-------------------------------------------*/void DS18B20_Delay100ms() //延时100ms{

unsigned char i,j,k; for(i=0;i<8;i++) for(j=0;j<25;j++)

for(k=0;k<250;k++);}

void DS18B20_Delay15() //延时15us{

unsigned char i; for(i=0;i<8;i++);}

void DS18B20_Delay60() //延时60us{

unsigned char i; for(i=0;i<30;i++);}

void DS18B20_Write0TS() //写bit 0{

DS18B20_TSOR=1; DS18B20_TSOR=0; DS18B20_Delay15(); DS18B20_Delay15(); DS18B20_Delay15(); DS18B20_Delay15(); DS18B20_TSOR=1; _nop_(); _nop_();}

void DS18B20_Write1TS() //写bit 1{

DS18B20_TSOR=1; DS18B20_TSOR=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

DS18B20_TSOR=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

DS18B20_Delay15(); DS18B20_Delay15(); DS18B20_Delay15();}

bit DS18B20_ReadTS(){

bit b;

DS18B20_TSOR=1; DS18B20_TSOR=0; _nop_(); _nop_(); _nop_(); _nop_();

DS18B20_TSOR=1; _nop_();

页号: 7 / 15

单片机课程设计 张晓杰 俞甫 王明星.c498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568

_nop_(); _nop_(); _nop_(); _nop_();

b=DS18B20_TSOR; DS18B20_Delay15(); DS18B20_Delay15(); DS18B20_Delay15(); _nop_(); _nop_(); return b;}

void DS18B20_ResetTS() //复位{unsigned char i;

DS18B20_TSOR=1; DS18B20_TSOR=0; for(i=0;i<8;i++)

DS18B20_Delay60(); DS18B20_TSOR=1;

while(DS18B20_TSOR); for(i=0;i<8;i++)

DS18B20_Delay60();}

void DS18B20_WriteByteTS(unsigned char byte) //写一个字节(byte){unsigned char i; for(i=0;i<8;i++) {

if(byte&0x01)

DS18B20_Write1TS(); else

DS18B20_Write0TS(); byte=byte>>1; }}

unsigned char DS18B20_ReadByteTS() //读一个字节(byte){

unsigned char i,j; bit b; j=0;

for(i=0;i<8;i++) {

b=DS18B20_ReadTS(); if(b) j+=1;

j=_cror_(j,1); }

return j;}

void DS18B20_InitTS() //初始化温度转换{

DS18B20_ResetTS();

DS18B20_WriteByteTS(0xCC); DS18B20_WriteByteTS(0x4E); DS18B20_WriteByteTS(0x64); DS18B20_WriteByteTS(0x8A); DS18B20_WriteByteTS(0x1F);}

void DS18B20_GetTempTS() //获取温度{

DS18B20_ResetTS();

DS18B20_WriteByteTS(0xCC);//发Skip ROM命令 DS18B20_WriteByteTS(0x44);//发转换命令 DS18B20_Delay100ms(); DS18B20_ResetTS();

DS18B20_WriteByteTS(0xCC);//发Skip ROM命令

页号: 8 / 15

2009-6-25 19:05

单片机课程设计 张晓杰 俞甫 王明星.c569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639

DS18B20_WriteByteTS(0xBE); //发读命令

DS18B20_TempX=DS18B20_ReadByteTS(); //温度低8位 DS18B20_TempZ=DS18B20_ReadByteTS(); //温度高8位 DS18B20_ReadByteTS(); DS18B20_ReadByteTS(); DS18B20_ReadByteTS(); DS18B20_ReadByteTS(); DS18B20_ReadByteTS(); DS18B20_ReadByteTS(); DS18B20_ReadByteTS();

DS18B20_TempZ=DS18B20_TempZ<<4;

DS18B20_TempZ+=(DS18B20_TempX&0xF0)>>4; if(DS18B20_TempZ>127) {

DS18B20_TempZ(256-DS18B20_TempZ); DS18B20_Fflag 1; } else {

DS18B20_Fflag 0; }

DS18B20_TempXDS18B20_XStab[DS18B20_TempX&0x0F];}

/*-------------------------------------------定时器T0初始化--------------------------------------------*/void Init_Timer0(void){=TMOD = 0x01;

TH0 = -(50235/256);=TL0 = -(50235%256);TR0 = 1;

=ET0 = 1;

=

EA = 1;}

/*-------------------------------------------开机动画--------------------------------------------------*/void KaiJDH(void){

unsigned char i,j;

LCD1602_DelayL();

LCD1602_WriteCGRAM(0,table0); //写自定义字符集LCD1602_DelayL();

DS18B20_TSOR=1; //1-wire总线释放

LCD1602_ShowString(0,str1);//启动画面1str2[6]=0x01;str2[9]=0x02;str2[12]=0x03;

LCD1602_ShowString(1,str2); LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();

for(i=0;i<17;i++) //字幕滚动 {

LCD1602_ShowString(0,str1+i); LCD1602_ShowString(1,str2+i); for(j=0;j<120;j++) LCD1602_DelayS(); }LCD1602_ShowString(0,str3);//启动画面2LCD1602_ShowString(1,str4); LCD1602_DelayL();LCD1602_DelayL();

页号: 9 / 15

2009-6-25 19:05

单片机课程设计 张晓杰 俞甫 王明星.c640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710

LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();

for(i=0;i<17;i++) //字幕滚动 {

LCD1602_ShowString(0,str3+i); LCD1602_ShowString(1,str4+i); for(j=0;j<120;j++) LCD1602_DelayS(); }

2009-6-25 19:05

LCD1602_ShowString(0,str5);//启动画面3LCD1602_ShowString(1,str6); LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();

for(i=0;i<17;i++) //字幕滚动 {

LCD1602_ShowString(0,str5+i); LCD1602_ShowString(1,str6+i); for(j=0;j<120;j++) LCD1602_DelayS(); }LCD1602_ShowString(0,str7);//启动画面4LCD1602_ShowString(1,str8); LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();

for(i=0;i<17;i++) //字幕滚动 {

LCD1602_ShowString(0,str7+i); LCD1602_ShowString(1,str8+i); for(j=0;j<120;j++) LCD1602_DelayS(); }

LCD1602_ShowString(0,str0);LCD1602_ShowString(1,str0); LCD1602_DelayL();

LCD1602_ShowString(1,str9); //启动画面5 LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();

LCD1602_MoveTo(1,12);LCD1602_WriteData('.');LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();

LCD1602_WriteData('.'); LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();

LCD1602_WriteData('.');LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();LCD1602_DelayL();}

/*-------------------------------------------液晶工作模式函数集----------------------------------------*/void LCD_Mod0(void){

LCD1602_DelayS();

LCD1602_WriteCommand(0x0c);//显示屏打开,光标不显示,不闪烁

//======================================================================== LCD1602_ShowString(1,line);

页号: 10 / 15

单片机课程设计 张晓杰 俞甫 王明星.c711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781

2009-6-25 19:05

LCD1602_ShowHanZi(1,7,1);LCD1602_ShowHanZi(1,15,1); LCD1602_ShowString(0,strA);

//========================================================================LCD1602_XYChar(0,3,hour/10+0x30); //液晶上显示小时LCD1602_XYChar(0,4,hour%10+0x30);

//======================================================================== LCD1602_XYChar(0,6,min/10+0x30);//液晶上显示分钟LCD1602_XYChar(0,7,min%10+0x30);

//========================================================================LCD1602_XYChar(0,9,sec/10+0x30); //液晶上显示秒数LCD1602_XYChar(0,10,sec%10+0x30);

//======================================================================== LCD1602_XYChar(1,13,T/10+0x30);//液晶上显示设定的温度值 LCD1602_XYChar(1,14,T%10+0x30);

//======================================================================== if(DS18B20_Fflag == 0){

LCD1602_XYChar(1,3,DS18B20_TempZ/10+0x30);//液晶上显示测得的温度值 LCD1602_XYChar(1,4,DS18B20_TempZ%10+0x30); LCD1602_XYChar(1,6,DS18B20_TempX+0x30);}else{

LCD1602_XYChar(1,3,'-');

LCD1602_XYChar(1,4,DS18B20_TempZ%10+0x30); LCD1602_XYChar(1,6,DS18B20_TempX+0x30);}

//========================================================================if(ON_OFF == 0) //如果温控标志为0{

//液晶上显示不控温的图标

LCD1602_XYChar(0,15,'F');}else{

//否则显示控温的图标

LCD1602_XYChar(0,15,'N');}

if(outflag == 1)

LCD1602_XYChar(0,0,'O');else

LCD1602_XYChar(0,0,'*');}

void LCD_Mod1(void){

LCD1602_DelayS();

LCD1602_WriteCommand(0x0c);//显示屏打开,光标不显示,不闪烁

//======================================================================== LCD1602_ShowString(1,line);LCD1602_ShowHanZi(1,7,1);LCD1602_ShowHanZi(1,15,1); LCD1602_ShowString(0,strA);

//======================================================================== LCD1602_XYChar(0,6,min/10+0x30);//液晶上显示分钟LCD1602_XYChar(0,7,min%10+0x30);

//========================================================================LCD1602_XYChar(0,9,sec/10+0x30); //液晶上显示秒数LCD1602_XYChar(0,10,sec%10+0x30);

//======================================================================== LCD1602_XYChar(1,13,T/10+0x30);//液晶上显示设定的温度值 LCD1602_XYChar(1,14,T%10+0x30);

//======================================================================== if(DS18B20_Fflag == 0){

LCD1602_XYChar(1,3,DS18B20_TempZ/10+0x30);//液晶上显示测得的温度值 LCD1602_XYChar(1,4,DS18B20_TempZ%10+0x30); LCD1602_XYChar(1,6,DS18B20_TempX+0x30);}else

页号: 11 / 15

单片机课程设计 张晓杰 俞甫 王明星.c782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852

2009-6-25 19:05

{

LCD1602_XYChar(1,3,'-');

LCD1602_XYChar(1,4,DS18B20_TempZ%10+0x30); LCD1602_XYChar(1,6,DS18B20_TempX+0x30);}

//======================================================================== LCD1602_WriteCommand(0x0f);//显示屏打开,光标显示,闪烁

//========================================================================LCD1602_XYChar(0,3,hour/10+0x30); //液晶上显示小时LCD1602_XYChar(0,4,hour%10+0x30);}

void LCD_Mod2(void){

LCD1602_DelayS();

LCD1602_WriteCommand(0x0c);//显示屏打开,光标不显示,不闪烁

//======================================================================== LCD1602_ShowString(1,line);LCD1602_ShowHanZi(1,7,1);LCD1602_ShowHanZi(1,15,1); LCD1602_ShowString(0,strA);

//========================================================================LCD1602_XYChar(0,3,hour/10+0x30); //液晶上显示小时LCD1602_XYChar(0,4,hour%10+0x30);

//========================================================================LCD1602_XYChar(0,9,sec/10+0x30); //液晶上显示秒数LCD1602_XYChar(0,10,sec%10+0x30);

//======================================================================== LCD1602_XYChar(1,13,T/10+0x30);//液晶上显示设定的温度值 LCD1602_XYChar(1,14,T%10+0x30);

//======================================================================== if(DS18B20_Fflag == 0){

LCD1602_XYChar(1,3,DS18B20_TempZ/10+0x30);//液晶上显示测得的温度值 LCD1602_XYChar(1,4,DS18B20_TempZ%10+0x30); LCD1602_XYChar(1,6,DS18B20_TempX+0x30);}else{

LCD1602_XYChar(1,3,'-');

LCD1602_XYChar(1,4,DS18B20_TempZ%10+0x30); LCD1602_XYChar(1,6,DS18B20_TempX+0x30);}

//======================================================================== LCD1602_WriteCommand(0x0f);//显示屏打开,光标显示,闪烁

//========================================================================LCD1602_XYChar(0,6,min/10+0x30); //液晶上显示分钟LCD1602_XYChar(0,7,min%10+0x30);}

void LCD_Mod3(void){

LCD1602_DelayS();

LCD1602_WriteCommand(0x0c);//显示屏打开,光标不显示,不闪烁

//======================================================================== LCD1602_ShowString(1,line);LCD1602_ShowHanZi(1,7,1);LCD1602_ShowHanZi(1,15,1); LCD1602_ShowString(0,strA);

//========================================================================LCD1602_XYChar(0,3,hour/10+0x30); //液晶上显示小时LCD1602_XYChar(0,4,hour%10+0x30);

//======================================================================== LCD1602_XYChar(0,6,min/10+0x30);//液晶上显示分钟LCD1602_XYChar(0,7,min%10+0x30);

//========================================================================LCD1602_XYChar(0,9,sec/10+0x30); //液晶上显示秒数LCD1602_XYChar(0,10,sec%10+0x30);

//======================================================================== if(DS18B20_Fflag == 0){

页号: 12 / 15

单片机课程设计 张晓杰 俞甫 王明星.c853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923

2009-6-25 19:05

LCD1602_XYChar(1,3,DS18B20_TempZ/10+0x30);//液晶上显示测得的温度值 LCD1602_XYChar(1,4,DS18B20_TempZ%10+0x30); LCD1602_XYChar(1,6,DS18B20_TempX+0x30);}else{

LCD1602_XYChar(1,3,'-');

LCD1602_XYChar(1,4,DS18B20_TempZ%10+0x30); LCD1602_XYChar(1,6,DS18B20_TempX+0x30);}

//======================================================================== LCD1602_WriteCommand(0x0f);//显示屏打开,光标显示,闪烁

//======================================================================== LCD1602_XYChar(1,13,T/10+0x30);//液晶上显示设定的温度值 LCD1602_XYChar(1,14,T%10+0x30);}

/*-------------------------------------------键盘扫描函数----------------------------------------------*/void Key_Scan(void)//扫描键盘{

unsigned char xx;// 局部变量P1=0xff;if(P1!=0xff){

delay(10);if(P1!=0xff){

xx=P1;

switch(xx)// 根据按键状态,调用不同的子函数{

case 0xfe:Key_Set();

break; //\"MS\"键按下,调用Key_Set()子函数case 0xfd:ON_OFF=!ON_OFF;

break;// \"ON/OFF\"键按下,ON_OFF标志取反case 0xfb:Key_Inc();

break; //\"+\"键按下,调用Key_Inc()子函数case 0xf7:Key_dec();

break; //\"-\"键按下,调用Key_dec()子函数case 0xef:deda = 0;

cnt = 0; sec = 0; min = 0; hour = 0; break;default:break;}}}}

void Key_Set(){

if(cnt == 5){

set++;if(set>=4)set = 0;}}

void Key_Inc(){

if(cnt == 5){

switch(set){

case 0: if(P1==0xf7)

ON_OFF=!ON_OFF;break;

case 1:hour++;

if(hour>=23)hour=23;

页号: 13 / 15

单片机课程设计 张晓杰 俞甫 王明星.c924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994

break;

case 2:min++;

if(min>=59)min=59;break;

case 3:T++;

if(T>=99)T=99;break;default:break;}}

}

void Key_dec(){

if(cnt == 5){

switch(set){

case 0: if(P1==0xf7)

ON_OFF=!ON_OFF;break;

case 1:hour--;

if(hour<=0)hour=0;break;

case 2: min--;

if(min<=0)min=0;break;

case 3:T--;

if(T<=0)T=0;break;

default:break;}}}

2009-6-25 19:05

//********延时K*1mS,12.000MHz*********

void delay(unsigned int k)//函数名为delay的延时子函数。定义k为无符号整型变量{ //delay函数开始

unsigned int i,j; //定义i、j为无符号整型变量for(i=0;i{ //for循环语句开始

for(j=0;j<60;j++) // for循环语句开始{;}

//reset()

} //两个for循环体} //delay函数结束

unsigned char Check_DownLoad(void){

DownLoad=1; //置位引脚if(DownLoad==0){

delay(100);//延时消抖DownLoad=1;if(DownLoad==0) return 1;else

return 0;}

return 0;}

页号: 14 / 15

单片机课程设计 张晓杰 俞甫 王明星.c9959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057

void DownLoad_Mode(void){

unsigned char temp,TT[5];unsigned int iii=0;re:RI=0;

while(!RI); //等待串行数据

if(SBUF!=ACK0)//如不符合首握手字节goto re;RI=0;

while(!RI); //等待串行数据

if(SBUF!=ACK1)//如不符合次握手字节=goto re;RI=0; TI0;

SBUFACK2;//向上位机发送0x0f握手确认字节,建立通信 while(!TI); TI0;

temp=UART_Recive_1B();

while(temp != Break_Code){

TT[iii]=temp;

temp=UART_Recive_1B();iii++;}

iii=0;

T=(TT[0]-0x30)*10+(TT[1]-0x30);}

void RS232_Init(void){

ES=0;//EA=0;

=SCON=0x50;TMOD==0x21;=TH1=0xfd;TL1=0xfd;TR1=1;TI=1;}

void UART_Send_1B(unsigned char sdat){

TI=0;

SBUF=sdat;while(!TI); TI0;}

unsigned char UART_Recive_1B(void){

RI=0;

while(!RI);RI=0;

return SBUF;}

2009-6-25 19:05

页号: 15 / 15

因篇幅问题不能全部显示,请点此查看更多更全内容