课程设计名称: 智能仪表课程设计 题目 : 温度控制器 指导教师 : 王桂荣
班级 : 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 #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_TempZ if(DS18B20_TempZ } }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;i for (i=0;i<4;i++) { LCD1602_MoveTo(x,y+i);//在第一行第12列位置显示心图案的上半部 LCD1602_WriteData(i); LCD1602_DelayS(); } for (i=0;i = LCD1602_DelayS(); } }}else{ if(m>4) m4; for (i=0;i 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(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 因篇幅问题不能全部显示,请点此查看更多更全内容