完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
主程序代码为: #include #include "LCD1602.h" //包含对1602读写操作的头文件 #include "Delay.h" //延时操作头文件 #include "18B20.h" //包含对18B20操作的头文件 #include ***it beep = P3^0; //定义蜂鸣器信号线 ***it led0=P1^0; //定义发光二极管端口 ***it led1=P1^1; ***it led2=P1^2; ***it led3=P1^3; uint warn_l1=250; //定义温度下限值 温度*10 uint warn_l2=220; uint warn_h1=370; uint warn_h2=350; /****************************************************** 函数名称:deal(uint t) * * 函数功能:对18B20获取的温度进行相应的处理 * 入口参数:temp * 出口参数:无 * *******************************************************/ void deal(uint t) { if((t>warn_l2)&&(t<=warn_l1)) //22~25 度 { led0=0; //第一个闪烁 Delayms(20); led0=1; mdi(); //蜂鸣器慢“滴” } //模拟开启制热 else if(t<=warn_l2) // <22 度 { led0=0; led1=0; //第一二灯闪烁 Delayms(10); led0=1; led1=1; kdi(); //蜂鸣器快“滴” } //模拟加大制热功率 else if((t>warn_h2)&&(t<=warn_h1)) //35~37度 { led2=0; //第三个灯闪烁 Delayms(20); led2=1; mdi(); //蜂鸣器慢“滴” } //模拟开启制冷 else if(t>=warn_h1) // >37度 { led2=0; //第三四个灯闪烁 led3=0; Delayms(10); led2=1; led3=1; kdi(); //蜂鸣器慢“滴” } //模拟加大制冷功率 else beep=1; //温度正常 } /****************************************************** 函数名称:display(uint t); * 函数功能:显示温度 * 入口参数:t * 出口参数:无 * *******************************************************/ void display(uint t) { write_com(0x80+12); // 第一行第13列 write_data(t/100+0x30); // 十位+0X30转换为字符显示 write_com(0x80+14); write_data(t%100/10+0x30); write_com(0x80+15); write_data(t%10+0x30); } /****************************************************** 函数名称:main(void); * * 函数功能:主函数 * 入口参数:无 * * 出口参数:无 * *******************************************************/ void main(void) { uchar i = 0; uint temp = 0; while(1) { init(); //LCD 初始化 tempchange(); //温度转换 _nop_(); //稍作延时 temp = get_temp(); deal(temp); //温度处理 _nop_(); for(i=10;i>0;i--) { display(temp()); //温度处理 } } } 18B20.H 头文件 #ifndef __18B20_h__ //防止重复定义 #define __18B20_h__ #include #include #include"18B20.h" #include"Delay.h" extern void dsreset(void); //函数声明 外部可见 extern void tempwritebyte(uchar dat); extern bit tempreadbit(void); extern uchar tempreadbyte(void); extern void tempchange(void); extern uint get_temp(void); #endif 18B20.C 文件 #include"18B20.h" ***it beep = P3^0; //定义蜂鸣器信号线 ***it ds = P2^7; //定义18B20信号线 static uint temp = 0; static float f_temp = 0.0; /************************************** * 函数名称:dsreset(void) * * 函数功能:18B20 初始化 * * 入口参数:无 * * 出口参数:无 * ***************************************/ void dsreset(void) { ds = 1; //将数据线置高电平 _nop_(); //稍作延时,要尽可能短 ds = 0; // 拉低数据线 Delayus(40); //延时 _nop_(); ds = 1; //将数据线拉高 Delayus(14); //延时 ds = 1; //拉高数据线 } /******************************************** * 函数名称:temwritebyte(uchar dat) * * 函数功能:向18B20写一个字节 * * 入口参数:dat * * 出口参数:无 * ********************************************/ void tempwritebyte(uchar dat) { uint i; for(i=0;i<8;i++) // 一个字节有8位 { ds=0; //将数据线拉低 _nop_(); //稍作延时,待数据稳定 ds=dat&0x01; //低位在前,高位在后 Delayus(3); //延时45us _nop_(); _nop_(); ds=1; //将数据线拉高 dat>>=1; //左移一位,继续发送下一位 } } /************************************** * 函数名称:tempreadbit(void) * * 函数功能:读一位数据 * * 入口参数:无 * * 出口参数:dat * ***************************************/ bit tempreadbit(void) { uint i = 0; //定义i,做延时用 bit dat; //定义一位数据 ds = 0;i++; ds = 1;i++;i++; dat = ds; i = 8;while(i>0)i--; return(dat); //返回一位数据 } /************************************** * 函数名称:tempreadbyte(void) * * 函数功能:读一个字节 * * 入口参数:无 * * 出口参数:dat * ***************************************/ uchar tempreadbyte(void) { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tempreadbit(); dat=(j<<7)|(dat>>1); //读出的数据低位在前,刚好在一个字节dat里 } return(dat); } /************************************** * 函数名称:tempchange(void) * * 函数功能:获取18B20温度转换 * * 入口参数:无 * * 出口参数:无 * ***************************************/ void tempchange(void) { dsreset(); //18B20复位 Delayms(1); //稍作延时 tempwritebyte(0xcc);//跳过读ROM指令 tempwritebyte(0x44);//写温度转换指令 } /**************************************** * * * 函数名称:get_temp(void) * * 函数功能:获取18B20寄存器中的数据* * 入口参数:无 * * 出口参数:temp * ****************************************/ uint get_temp(void) { uchar a,b; dsreset(); Delayms(1); tempwritebyte(0xcc); //跳过ROM tempwritebyte(0xbe); //读暂存器 a = tempreadbyte();//读低8位 b = tempreadbyte();//读高8位 temp = b; temp <<= 8;//将两个字节合为一个字 temp = temp|a; f_temp = temp*0.0625;//温度在寄存器中为12为,分辨率为0.0625 temp = f_temp*10+0.5; //温度修正 四舍五入 return temp; } |
|
相关推荐
3个回答
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-11 21:10:15
|
|
|
|
|
|
2013-10-11 21:11:35
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16902 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 08:48 , Processed in 0.706346 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3550