1、综合实验报告doc00嘉应学院电子信息工程学院单片机综合性设计实验报告20102011学年度第1学期温度监控系统(计时功能)专 业自动化班 级082姓 名座 号任课教师 电子信息工程学院编引言单片机已经在测控领域中获得了广泛的应用,它除了可以测量电信以外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛应用很多领域。本次设计,就是用单片机实现温度控制,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。本次采用DS18B20数字温度传感器来实现基于52单片机的数字温
2、度计的设计ds18b20简介ds18B20数字温度传感器,是美国DALLAS公司生产的可组网数字温度传感器,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的ds18b20具有可编程的分辨率为91
3、2位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温。本次设计实验采用12位精度的分辨率实现测温功能。此次选用外部电源供电方式工作。Ds18b20内部结构图一、 系统组成框图如下二、温度监控系统电路图如下:三、 程序流程图如下图示 四、 /*延时函数*/void delays(uint z)uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);/*初始化函数*/void InitUART (void) TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1;
4、TR0=1; tempmax=30; p14=0; p15=0; SCON = 0x50; / SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; / TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFD; / TH1: 重装值 9600 波特率 晶振 11.0592MHz TR1 = 1; / TR1: timer 1 打开 EA = 1; /打开总中断 /ES = 1; /打开串口中断 /*串口发送数据函数*/ void SendByte(temp) SBUF = temp; while(!TI); TI = 0;源程序#i
5、nclude#include#define uchar unsigned char#define uint unsigned intuchar temp;uchar tempmax;uchar shi,fen,miao,count;uchar mshi,mge,fshi,fge,sshi,sge;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0sbit p14=P14;sb
6、it p15=P15;sbit DQ=P22; sbit p20=P20;sbit p21=P21;sbit beep=P23;sbit bt1=P24;sbit bt2=P21;sbit bt3=P20;sbit RS = P25; /定义端口 sbit RW = P26;sbit EN = P27;void init_ds18b20(void);void delay(uint t);void write_byte(uchar dat);uchar read_byte(void);uchar readtemperature(void);void step_motor();void step_
7、motor1();void anjian();void LCD_Init(void);void Lcd_User_Chr(void);void LCD_Write_Com(unsigned char com);void LCD_Write_Data(unsigned char Data);void LCD_Clear(void);void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);void LCD_Write_Char(unsigned char x,unsigned char y,unsigned c
8、har Data);/*延时函数*/void delay(uint t) while(t-);void init_ds18b20(void) uchar n; DQ=1; delay(8); DQ=0; delay(80); DQ=1; delay(8); n=DQ; delay(4);/*DS18B20写字节函数*/void write_byte(uchar dat) uchar i; for(i=0;i=1; delay(4);/*DS18B20读字节函数*/uchar read_byte(void) uchar i,value; for(i=0;i=1; DQ=1; if(DQ) val
9、ue|=0x80; delay(4); return value;/*主函数*/void main(void) unsigned char data byTempeartue; LCD_Init(); /初始化液晶 delay(20); /延时有助于稳定 LCD_Clear(); /清屏 Lcd_User_Chr(); LCD_Write_String(0,0,T:); LCD_Write_String(0,1,W(); LCD_Write_String(12,1,)Y); LCD_Write_String(4,1,00:00:00); LCD_Write_Char(5,0,0x01);/写入
10、温度右上角点 LCD_Write_Char(6,0,C); /写入字符C LCD_Write_Char(14,0,0x01);/写入温度右上角点 LCD_Write_Char(15,0,C); /写入字符C InitUART(); while(1) byTempeartue = readtemperature(); temp = readtemperature(); LCD_Write_Char(2,0,0+byTempeartue/100); LCD_Write_Char(3,0,0+(byTempeartue%100)/10); LCD_Write_Char(4,0,0+byTempear
11、tue%10); LCD_Write_String(9,0,A:); LCD_Write_Char(11,0,0+tempmax/100); LCD_Write_Char(12,0,0+(tempmax%100)/10); LCD_Write_Char(13,0,0+tempmax%10); SendByte(temp); anjian(); if(temp=tempmax) p15=1; p14=0; beep=1; delays(200); beep=beep; delays(200); else beep=1; p15=0; p14=1; /*DS18B20读温度数据函数*/uchar
12、readtemperature(void) uchar a,b; init_ds18b20(); write_byte(0xcc); write_byte(0x44); delay(300); init_ds18b20(); write_byte(0xcc); write_byte(0xbe); a=read_byte(); b=read_byte(); b4; return b; /*电机正转工作函数*/void step_motor() uchar code table=0x03,0x09,0x0c,0x06; uchar i=0; for(i=0;i4;i+) P1=tablei; de
13、lay(4000); /*电机正转工作函数*/void step_motor1() uchar code table=0x03,0x06,0x0c,0x09; uchar i=0; for(i=0;i=tempmax) if(bt1=0) step_motor1(); else step_motor();/*1602写命令函数*/ void LCD_Write_Com(unsigned char com) delay(100); /延时等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; delay(5); EN_CLR; /*1602写数据函数*/ void L
14、CD_Write_Data(unsigned char Data) delay(100); /延时等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; delay(1); EN_CLR; /*定义液晶右上角温度标号”*/void Lcd_User_Chr(void) /第一个自定义字符 LCD_Write_Com(0x40); /01 000 000 第1行地址 (D7D6为地址设定命令形式 D5D4D3为字符存放位置(0-7),D2D1D0为字符行地址(0-7)) LCD_Write_Data(0x00); /XXX 11111 第1行数据(D7D6D5为XX
15、X,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭) LCD_Write_Com(0x41); /01 000 001 第2行地址 LCD_Write_Data(0x04); /XXX 10001 第2行数据 LCD_Write_Com(0x42); /01 000 010 第3行地址 LCD_Write_Data(0x0e); /XXX 10101 第3行数据 LCD_Write_Com(0x43); /01 000 011 第4行地址 LCD_Write_Data(0x0e); /XXX 10001 第4行数据 LCD_Write_Com(0x44);
16、/01 000 100 第5行地址 LCD_Write_Data(0x0e); /XXX 11111 第5行数据 LCD_Write_Com(0x45); /01 000 101 第6行地址 LCD_Write_Data(0x1f); /XXX 01010 第6行数据 LCD_Write_Com(0x46); /01 000 110 第7行地址 LCD_Write_Data(0x04); /XXX 11111 第7行数据 LCD_Write_Com(0x47); /01 000 111 第8行地址 LCD_Write_Data(0x00); /XXX 00000 第8行数据 /第二个自定义字符
17、/*1602清屏函数*/ void LCD_Clear(void) LCD_Write_Com(0x01); delay(5);/*1602写字符串函数*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); /表示第一行else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*1602写字符函数*/void LCD_Write_Char(
18、unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*1602初始化函数*/ void LCD_Init(void) LCD_Write_Com(0x38);/*显示模式设置*/ delay(5); LCD_Write_Com(0x38); delay(5); LCD_Write_Com(0x38); delay(5); LCD_Write_Com(0x38); L
19、CD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ delay(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ LCD_Write_Com(0x48); /01 001 000 第1行地址 LCD_Write_Data(0x03); /XXX 00001 第1行数据 LCD_Write_Com(0x49); /01 001 001 第2行地址 LCD_Write_Data(0x03); /XXX 11011 第2行数据 LCD_Wri
20、te_Com(0x4a); /01 001 010 第3行地址 LCD_Write_Data(0x00); /XXX 11101 第3行数据 LCD_Write_Com(0x4b); /01 001 011 第4行地址 LCD_Write_Data(0x00); /XXX 11001 第4行数据 LCD_Write_Com(0x4c); /01 001 100 第5行地址 LCD_Write_Data(0x00); /XXX 11101 第5行数据 LCD_Write_Com(0x4d); /01 001 101 第6行地址 LCD_Write_Data(0x00); /XXX 11011 第
21、6行数据 LCD_Write_Com(0x4e); /01 001 110 第7行地址 LCD_Write_Data(0x00); /XXX 00001 第7行数据 LCD_Write_Com(0x4f); /01 001 111 第8行地址 LCD_Write_Data(0x00); /XXX 00000 第8行数据 void zhongduan()interrupt 1TH0=(65536-50000)/256; TL0=(65536-50000)%256; count+; LCD_Write_Char(12,1,0x29); if(count=20) count=0; miao+; ms
22、hi=miao/10; mge=miao%10; if(miao=59) miao=0; fen+; fshi=fen/10; fge=fen%10; if(fen=59) fen=0; shi+; sshi=shi/10; sge=shi%10; if(shi=23) shi=0; LCD_Write_Char(5,1,0+sge); LCD_Write_Char(4,1,0+sshi); LCD_Write_Char(8,1,0+fge); LCD_Write_Char(7,1,0+fshi); LCD_Write_Char(11,1,0+mge); LCD_Write_Char(10,1
23、,0+mshi); 五:系统功能描述本系统是基于AT89C52RC单片机控制的温度监控报警系统。利用DS18B20温度传感器测温,并将数据传送给单片机进行数据处理,最后将数据利用1602液晶显示。本系统可以设置报警温度,报警温度初值设置为30C,可以通过按键轻触开关“+”、“-”报警设置温度,当环境温度高于报警温度时,蜂鸣器发出“嘀嗒,嘀嗒”的报警声,同时红色发光二极管闪烁,同时本系统可以利用串口发送数据至计算机,也可以通过计算机下载单片机程序;另外本系统预设计时功能,在上电时开始计时,采用二十四小时制计时。六:总结通过这次综合设计性实验,对c语言在单片机中应用更加熟悉,初步掌握了温度传感器以及LCD和按键等的程序写法。而且通过实物制作,知道现实与理想的差距,仿真成功不一定实物就能如理想般理想。需要不断的检测和调试,需要一定的耐心和毅力。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1