引用 DS18B20温度报警设计C语言.docx
- 文档编号:4326727
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:12
- 大小:185.13KB
引用 DS18B20温度报警设计C语言.docx
《引用 DS18B20温度报警设计C语言.docx》由会员分享,可在线阅读,更多相关《引用 DS18B20温度报警设计C语言.docx(12页珍藏版)》请在冰点文库上搜索。
引用DS18B20温度报警设计C语言
引用
jiangshun1251的DS18B20温度报警设计(C语言)
一直在用汇编,现在自学C语言了,刚接触C,还不怎么了解。
写了个DS18B20的测温报警程序,折腾了两天,终于把它调试好了,挺开心的!
效果图:
初始化界面1 初始化界面2
温度显示界面 上、下限温度报警值修改界面
C语言程序:
开机显示初始化等待界面,温度显示一位小数,报警上下限值可通过4个按键修改,修改后延时一段时间,自动返回温度显示界面。
/*************************************************/
/* 2009年10月27日 */
/* 设计者:
jiangshun */
/*************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/*************************************************/
//函数申明//
/*************************************************/
voiddelay(uchark); //标准延时函数
voiddelay1(uints); //LCD延时函数
voidinit(); //初始化显示
voidinit_18b20(); //复位ds18b20
voidwrite_18b20(uchardat); //写ds18b20数据
ucharread_18b20(); //读ds18b20数据
voidread_word_18b20(); //读数据并转换温度,进行显示
voiddisp_tp(); //温度显示
voidinit_LCD(); //初始化LCD1602
voidwrite_data(uchardate); //写LCD1602显示数据
voidwrite_com(ucharcom); //写LCD1602指令
voidsw(); //按键扫描,修改报警上下限值
voidsw_disp(); //显示修改报警上下限界面
sbitDQ=P1^7; //ds18b20数据线引脚
sbitrs=P2^0;
sbitrw=P2^1;
sbiten=P2^2;
sbitP10=P1^0; //蜂鸣器报警引脚,P10=1时报警
sbitk0=P3^0; //4个按键:
k0--加上限值,k1--减上限值,k2--加下限值,k3--减下限值
sbitk1=P3^1;
sbitk2=P3^2;
sbitk3=P3^3;
uinttvalue; //温度值
uchartflag; //温度正负标志
uinti,j,kk=0,key=0; //kk控制上下限值修改界面显示,key控制温度界面显示
uinttemph=30; //初始上限值
uinttempl=25; //初始下限值
ucharcodedis0[]={"Welcome!
"};
ucharcodedis1[]={0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x00}; //初始化等待界面,进程的代码
ucharcodedis2[]={"temperature:
"};
ucharcodedis3[]={0x06,0x09,0x06,0x00,0x00,0x00,0x00,0x00, //温度符号代码(。
)
0x00,0x00,0x06,0x09,0x08,0x08,0x09,0x06};//温度符号代码(C)
ucharcodedis4[]={"Changepassword:
"};
ucharcodedis5[]={"H:
L:
"};
uchardatatemp_data[5]; //储存温度值的数据
/*************************************************/
//主函数//
/*************************************************/
voidmain()
{
init(); //初始化显示
init_LCD(); //初始化LCD1602
ss:
init_18b20(); //复位ds18b20
read_word_18b20(); //读数据并计算转换温度,显示温度值
if(((tvalue/10)%100) elseif(((tvalue/10)%100)>=temph)P10=1; //温度高于或等于上限值,报警 elseP10=0; kk=0; sw(); gotoss; } /*************************************************/ //开机初始化显示----欢迎等待界面// /*************************************************/ voidinit() //初始化显示 { ucharn,a,b,temp; P10=0; P3=0x0f; init_LCD(); //初始化LCD1602 write_com(0x84); for(n=0;n<8;n++) { write_data(dis0[n]); delay1(10); } delay1(100); write_com(0x40); //写1602,RAM地址 for(a=0;a<8;a++) //写入自定义字符,用于LCD显示 { write_data(dis1[a]); } temp=0xc0; //赋初始化显示,进程标志的初始地址 for(b=0;b<16;b++) //显示进程标志的进度 { write_com(temp); //写进程命令 write_data(0); //显示进程标志 delay1(80); temp++; } delay1(500); } /*************************************************/ voidinit_LCD() //初始化LCD1602 { write_com(0x01); //清屏 write_com(0x38); //8位数据,双列,5*7字形 write_com(0x0c); //开启显示屏,关光标,光标不闪烁 write_com(0x06); //显示地址递增,即写一个数据后,显示位置右移一位 write_com(0x80); //写LCD初始显示地址 } /*************************************************/ voidwrite_com(ucharcom) //写LCD1602指令 { rs=0; //选择指令寄存器 rw=0; //选择写 P0=com; //把命令字送入P0 delay1(5); //延时一小会儿,让1602准备接收数据 en=1; //使能线电平变化,命令送入1602的8位数据口 en=0; } /*************************************************/ voidwrite_data(uchardate) //写LCD显示数据 { rs=1; //选择数据寄存器 rw=0; //选择写 P0=date; //把要显示的数据送入P0 delay1(5); //延时一小会儿,让1602准备接收数据 en=1; //使能线电平变化,数据送入1602的8位数据口 en=0; } /*************************************************/ //复位ds18b20// /*************************************************/ voidinit_18b20() { uchartext=1; while(text) { while(text) { DQ=1; _nop_(); _nop_(); //从高拉倒低 DQ=0; delay(50); //550us DQ=1; delay(6); text=DQ; //判断DS18B20是否存在 // P3=0x80; //存在,则蜂鸣器发出短暂鸣声,若不存在,则一直蜂鸣报警 } delay(45); text=~DQ; // P3=0x00; } DQ=1; } /*************************************************/ //写18b20数据// /*************************************************/ voidwrite_18b20(uchardat) { uchart; for(t=8;t>0;t--) { DQ=1; DQ=0; //从高拉倒低 _nop_(); _nop_(); _nop_(); _nop_(); DQ=dat&0x01; //写数据,从地位开始 delay(6); dat>>=1; //8位数据,一位一位的写入ds18b20 } DQ=1; } /*************************************************/ //读18b20数据// /*************************************************/ ucharread_18b20() { uchart; ucharvalue=0; for(t=8;t>0;t--) { DQ=1; value>>=1; DQ=0; _nop_(); _nop_(); _nop_(); _nop_(); DQ=1; _nop_(); _nop_(); _nop_(); _nop_(); if(DQ)value|=0x80; delay(6); } DQ=1; return(value); } /*************************************************/ voidread_word_18b20() { ucharx,y; write_18b20(0xcc); //发命令: SkipROM,跳过读序列号 write_18b20(0x44); //启动温度转换 init_18b20(); write_18b20(0xcc); //发命令: SkipROM,跳过读序列号 write_18b20(0xbe); //读取温度 x=read_18b20(); //温度值低8为存入x y=read_18b20(); //温度值高8为存入y tvalue=y; //整合温度值的低8位与高8位: tvalue<<=8; //左移8位,即将温度值的高8位数据移入16位整形变量tvalue的高位, tvalue|=x; //再与温度值的低8位相或,即将低8位数据存入tvalue低位中,完成数据整合 if(tvalue<0xfff)tflag=0; else { tflag=1; tvalue=(~tvalue)+1; } tvalue=tvalue*0.625;//扩大10倍,换算出温度值,显示一位小数。 (若扩大100倍,则可通过换算显示出2位小数) temp_data[0]=tvalue/1000+0x30; //百位(加0x30,将数据转换为ASCII码,LCD才能正常显示) temp_data[1]=(tvalue/100)%10+0x30; //十位 temp_data[2]=(tvalue%100)/10+0x30; //个位 temp_data[3]='.'; //小数点 temp_data[4]=tvalue%10+0x30; //小数位 disp_tp(); //调用温度显示 } /*************************************************/ voiddisp_tp() //温度显示 { ucharm,z; ucharu=0; if(key==1) init_LCD(),key=0; //清屏 write_com(0x80); for(m=0;m<12;m++) { write_data(dis2[m]); //显示temperature: delay1(5); } write_com(0xc6); if(temp_data[0]==0x30) //若百位为0,则不显示 { u=1; if(temp_data[1]==0x30) //若百位与十位都为0,则不显示 u=2; } for(m=u;m<5;m++) { write_data(temp_data[m]); //显示转换的温度数值 } write_com(0x40); //写1602,RAM地址 for(z=0;z<16;z++) //写入自定义字符(温度符号),用于LCD显示 { write_data(dis3[z]); } write_com(0xcb); //显示温度符号 for(z=0;z<2;z++) { write_data(z); } } /*************************************************/ //按键扫描// /*************************************************/ voidsw() { uintv; if(P3! =0x0f) { delay1(10); if(P3! =0x0f) { for(v=0;v<100;v++) //循环扫描按键一段时间后自动退出,返回到温度显示界面 { sw_disp(); if(! k0) { delay1(10); if(! k0)temph++; } if(! k1) { delay1(10); if(! k1)temph--; } if(! k2) { delay1(10); if(! k2)templ++; } if(! k3) { delay1(10); if(! k3)templ--; } } key=1; } } } /*************************************************/ voidsw_disp() { ucharc; if(kk==0)write_com(0x01),kk=1; write_com(0x80); for(c=0;c<16;c++) { write_data(dis4[c]); //显示Changepassword: } write_com(0xc1); //上限标志显示(H: ) write_data(dis5[0]); write_data(dis5[1]); write_com(0xc5); //上限温度符号显示(。 C) write_data(0); write_data(1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 引用 DS18B20温度报警设计C语言 DS18B20 温度 报警 设计 语言