武夷学院实验报告
课程名称:单片机及接口技术实验 项目名称:LCD显示的温度报警器 姓名:_吴锦生_ 专业:_10电信_ 班级:_1班_ 学号_20104081001_ 一、实验预习部分: 1、设计要求 设计一个温度测量控制系统,以美国MAXIM/DALLAS半导体公司的单总线温度传感器DS18为核心,设计一个结构简单、测温准确、具有一定控制功能的智能温度控制器。 功能要求如下: 增加温度报警功能,可以通过按键设置一个报警温度,当用DS18B20测得的温度超过预设值,用蜂鸣器报警。 2、实验程序 #include #include #include #define uint unsigned int #define uchar unsigned char #define lcd_date P0 LCD并行数据传输端口定义 sbit LEDCLK=P3^4; 1时钟输入端 sbit LEDDIN=P2^3; 1数据输入端 sbit Key_Input=P1^0; 按键输出端 sbit lcd_en=P2^2; LCD功能端口定义 sbit lcd_rs=P2^4; sbit lcd_rw=P2^3; sbit ACC0=ACC^0; sbit ACC7=ACC^7; sbit DQ=P3^2; 温度输出端 sbit sound=P1^2; 蜂鸣器输入端 uchar keytemp=0; uchar keyval=0; uchar keyback; KEY备份值 bit tflag; 温度正负标志位 uint tvalue,bai,shi,ge,xiao; 温度输出值及其百位、十位、个位和小数位值 int temp_set,temp_set_l; 温度上限及下限值(有正负分) uint temp_set_zhi,temp_set_l_zhi; 温度上下限值 uint keynum; 按键的值 int t_zhi; DS18B20温度值(有正负分) bit keyup; bit flag,flag4,temp_mod; bit flag_zong; void delay_18b20(uint i) 18b20延时函数 { while(i--);} void delayms(uint z) 1ms延时函数 { uint x; uchar y; for(x=z;x>0;x--) for(y=123;y>0;y--); } void close_led() 关闭1 { uchar i; for(i=0;i<8;i++) { LEDCLK=0;LEDDIN=1;_nop_();LEDCLK=1;} } void Write_com(uchar com) LCD写指令函数 { lcd_rs=0;lcd_date=com;delayms(2); lcd_en=1;delayms(2);lcd_en=0; } void Write_dat(uchar dat) LCD写数据函数 {lcd_rs=1;lcd_date=dat;delayms(2); lcd_en=1;delayms(2);lcd_en=0; } void Read_Key() //**键值读取函数**// { keytemp<<=1; if(Key_Input==1) {keytemp++;} } void keyscan() //键值确认函数 { if(keytemp==0xff) { keyup=1; //按键已经放开 keyback=0; //清除按键备份值 keyval=0; //清除按键存放单元 } else if(keytemp==keyback&&keyup==1)两次的检测的值一样且按键已经放开 { keyval=keytemp; //存放按键值 keyup=0; //按下按键 keyback=0; //清除按键备份值 } else { keyback=keytemp; } } void Key_job() //**键值工作程序**// { switch(keyval) { case 0x7f: { if(temp_mod==0) 模式0:上限温度加0.1 { temp_set++;} if(temp_mod==1) 模式1:下限温度加0.1 { temp_set_l++; } keynum=1;keyval=0;break; } case 0xbf: { if(temp_mod==0) 模式0:上限温度减0.1 { temp_set--;} if(temp_mod==1) 模式1:下限温度减0.1 { temp_set_l--;} keynum=2; keyval=0; break; } case 0xdf:{ if(temp_mod==0) 模式0:上限温度加1 { temp_set=temp_set+10;} if(temp_mod==1) 模式1:下限温度加1 { temp_set_l=temp_set_l+10;} keynum=3;keyval=0;break; } case 0xef:{ if(temp_mod==0) 模式0:上限温度减1 {temp_set=temp_set-10;} if(temp_mod==1) 模式1:下限温度减1 {temp_set_l=temp_set_l-10;} keynum=4;keyval=0;break; } case 0xf7:{ flag4=~flag4; 蜂鸣器开关控制 keynum=5;keyval=0;break; } case 0xfb:{ temp_mod=~temp_mod; 模式切换 keynum=6;keyval=0;break; } case 0xfd:keynum=7;break; case 0xfe:keynum=8;break; default: keynum=0;keyval=0;break; } } void lcd_init() LCD初始化 {lcd_rw=0;lcd_en=0;delayms(15); Write_com(0x38);delayms(5); Write_com(0x38);delayms(5); Write_com(0x38);//显示模式设置 Write_com(0x08);//显示关闭 Write_com(0X01);//清屏 Write_com(0x06);//显示光标移动设置 Write_com(0X0c);//显示开及光标设置 } void rst_ds18b20(void) DS18b20复位 { DQ=1;delay_18b20(4); DQ=0;delay_18b20(100); DQ=1;delay_18b20(40); } uchar read_ds18b20(void) 读DS18b20数据 { uchar i=0;uchar dat=0; for(i=8;i>0;i--) { DQ=0;dat>>=1;DQ=1; if(DQ) dat|=0x80; delay_18b20(10); } return(dat); } void write_ds18b20(uchar wdata) 向DS18b20写数据 { uchar i=0; for(i=8;i>0;i--) { DQ=0;DQ=wdata&0x01; delay_18b20(10); DQ=1;wdata>>=1; } } void read_ds18b20_temp(void) 读取温度值并转换 { uchar a,b; rst_ds18b20(); write_ds18b20(0xcc); write_ds18b20(0x44); rst_ds18b20(); write_ds18b20(0xcc); write_ds18b20(0xbe); a=read_ds18b20(); b=read_ds18b20(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) { tflag=0;} else { tvalue=~tvalue+1;tflag=1;} tvalue=tvalue*(0.625); } void disp_ds18b20() 显示温度、温度上下限 { uint count; if(flag_zong==1) 滤除由于上电时DS18b20产生的初始值 { while(tvalue>600) { tvalue=temp_set;count++; if(count==50) { flag_zong=0;} } } if(tvalue>=0) { bai=tvalue/1000; 取温度值的百位、十位、个位及小数位并显示 shi=tvalue%1000/100; ge=tvalue%100/10; xiao=tvalue%10; if(temp_set<0) 上限温度值小于0,把负值转换为正值 { temp_set_zhi=~(temp_set-1); } if(temp_set>=0) { temp_set_zhi=temp_set;} if(temp_set_l<0) 下限温度值小于0,把负值转换为正值 { temp_set_l_zhi=~(temp_set_l-1); } if(temp_set>=0) { temp_set_l_zhi=temp_set_l; } Write_com(0x00+0x80);Write_dat('t'); 固定显示‘temp:’ Write_com(0x01+0x80);Write_dat('e'); Write_com(0x02+0x80); Write_dat('m'); Write_com(0x03+0x80);Write_dat('p'); Write_com(0x04+0x80);Write_dat(':'); if(tflag==0) 温度值大于零,百位显示0 {Write_com(0x05+0x80); Write_dat('0'+bai);} if(tflag==1) 温度小于0百位显示‘-’ {Write_com(0x05+0x80);Write_dat('-');} Write_com(0x06+0x80);Write_dat('0'+shi); Write_com(0x07+0x80);Write_dat('0'+ge); Write_com(0x08+0x80);Write_dat('.'); Write_com(0x09+0x80);Write_dat('0'+xiao); Write_com(0x40+0x80);Write_dat('s'); 固定显示‘set:’ Write_com(0x41+0x80);Write_dat('e'); Write_com(0x42+0x80);Write_dat('t'); Write_com(0x43+0x80);Write_dat(':'); if(temp_set>=0) {Write_com(0x44+0x80);Write_dat('0'+temp_set_zhi/1000); Write_com(0x45+0x80);Write_dat('0'+temp_set_zhi%1000/100); Write_com(0x46+0x80);Write_dat('0'+temp_set_zhi%100/10); Write_com(0x47+0x80);Write_dat('.'); Write_com(0x48+0x80); Write_dat('0'+temp_set_zhi%10); } if(temp_set<0) 上限温度为负值,转换为正值,并且最高位显示‘-’ {Write_com(0x44+0x80);Write_dat('-'); Write_com(0x45+0x80);Write_dat('0'+temp_set_zhi%1000/100); Write_com(0x46+0x80);Write_dat('0'+temp_set_zhi%100/10); Write_com(0x47+0x80); Write_dat('.'); Write_com(0x48+0x80);Write_dat('0'+temp_set_zhi%10); } if(temp_set_l>=0) { temp_set_l_zhi=temp_set_l; Write_com(0x4a+0x80);Write_dat('0'+temp_set_l_zhi/1000); Write_com(0x4b+0x80);Write_dat('0'+temp_set_l_zhi%1000/100); Write_com(0x4c+0x80);Write_dat('0'+temp_set_l_zhi%100/10); Write_com(0x4d+0x80);Write_dat('.'); Write_com(0x4e+0x80);Write_dat('0'+temp_set_l_zhi%10); } if(temp_set_l<0) 下限温度为负值,转换为正值,并且最高位显示‘-’ { temp_set_l_zhi=~(temp_set_l-1); Write_com(0x4a+0x80);Write_dat('-'); Write_com(0x4b+0x80);Write_dat('0'+temp_set_l_zhi%1000/100); Write_com(0x4c+0x80);Write_dat('0'+temp_set_l_zhi%100/10); Write_com(0x4d+0x80);Write_dat('.'); Write_com(0x4e+0x80);Write_dat('0'+temp_set_l_zhi%10); } } } void display_key() 按键值显示 { Write_com(0x0b+0x80);Write_dat('K'); Write_com(0x0c+0x80);Write_dat('E'); Write_com(0x0d+0x80);Write_dat('Y'); Write_com(0x0e+0x80);Write_dat(':'); Write_com(0x0f+0x80);Write_dat('0'+keynum); } void compare() 温度范围比较及蜂鸣器工作函数 { if(flag4==1) { if(tflag==0) { t_zhi=tvalue;} else { t_zhi=~(tvalue-1); } if(t_zhi>temp_set||t_zhi三、实验结果与讨论: 本次实验较成功。通过本次实验,我了解LCD1602及温度芯片DS18b20的工作原理;并据此了解了如何利用LCD1602和DS18b20以及按键制作一个温度报警器。实验报告成绩(百分制)__________ 实验指导教师签字:__________