第49节:利用DS18B20做一个温控器
时间:11-22
来源:互联网
点击:
- (0xCC);
- ds_write_byte(0x44);
- ds18b20_reset(); //复位ds18b20的时序
- ds_write_byte(0xCC);
- ds_write_byte(0xBE);
- temper_L=ds_read_byte();
- temper_H=ds_read_byte();
- ds18b20_data=temper_H; //把两个字节合并成一个int数据类型
- ds18b20_data=ds18b20_data<8;
- ds18b20_data=ds18b20_data|temper_L;
- return ds18b20_data;
- }
- void ds18b20_reset() //复位ds18b20的时序
- {
- unsigned char x;
- dq_dr_sr=1;
- delay_short(8);
- dq_dr_sr=0;
- delay_short(80);
- dq_dr_sr=1;
- delay_short(14);
- x=dq_dr_sr;
- delay_short(20);
- }
- void ds_write_byte(unsigned char date) //写一个字节
- {
- unsigned chari;
- for(i=0;i<8;i++)
- {
- dq_dr_sr=0;
- dq_dr_sr=date&0x01;
- delay_short(5);
- dq_dr_sr=1;
- date=date>>1;
- }
- }
- unsigned char ds_read_byte(void ) //读一字节
- {
- unsigned char i;
- unsigned char date=0;
- for(i=0;i<8;i++)
- {
- dq_dr_sr=0;
- date=date>>1;
- dq_dr_sr=1;
- if(dq_dr_sr)
- {
- date=date|0x80;
- }
- delay_short(5);
- }
- return (date);
- }
- void display_service(void) //显示的窗口菜单服务程序
- {
- switch(ucWd)//因为本程序只有1个窗口,在实际项目中,此处的ucWd也可以省略不要
- {
- case 1:
- if(ucWd1Part1Update==1)//局部设定温度更新显示
- {
- ucWd1Part1Update=0;
- ucTemp8=10; //显示空
- if(ulSetTemper>=100)
- {
- ucTemp7=ulSetTemper%1000/100; //显示设定温度的百位
- }
- else
- {
- ucTemp7=10; //显示空
- }
- if(ulSetTemper>=10)
- {
- ucTemp6=ulSetTemper%100/10; //显示设定温度的十位
- }
- else
- {
- ucTemp6=10; //显示空
- }
- ucTemp5=ulSetTemper%10; //显示设定温度的个位
- ucDigShow8=ucTemp8; //数码管显示实际内容
- ucDigShow7=ucTemp7;
- ucDigShow6=ucTemp6;
- ucDigShow5=ucTemp5;
- }
- if(ucWd1Part2Update==1)//局部实际温度更新显示
- {
- if(ucSignFlag==0)//正数
- {
- ucTemp4=10; //显示空
- }
- else//负数,说明是零下多少度的情况下
- {
- ucTemp4=11; //显示负号-
- }
- if(ulCurrentTemper>=100)
- {
- ucTemp3=ulCurrentTemper%100/100; //显示实际温度的百位
- }
- else
- {
- ucTemp3=10; //显示空
- }
- if(ulCurrentTemper>=10)
- {
- ucTemp2=ulCurrentTemper%100/10;//显示实际温度的十位
- }
- else
- {
- ucTemp2=10;//显示空
- }
- ucTemp1=ulCurrentTemper%10; //显示实际温度的个数位
- ucDigShow4=ucTemp4; //数码管显示实际内容
- ucDigShow3=ucTemp3;
- ucDigShow2=ucTemp2;
- ucDigShow1=ucTemp1;
- }
- break;
- }
- }
- void key_scan(void)//按键扫描函数 放在定时中断里
- {
- if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
- {
- ucKeyLock1=0; //按键自锁标志清零
- uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
- }
- else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
- {
- uiKeyTimeCnt1++; //累加定时中断次数
- if(uiKeyTimeCnt1>const_key_time1)
- {
- uiKeyTimeCnt1=0;
- ucKeyLock1=1;//自锁按键置位,避免一直触发
- ucKeySec=1; //触发1号键
- }
- }
- if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
- {
- ucKeyLock2=0; //按键自锁标志清零
- uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
- }
- else if(ucKeyLock2==0)//有按键按下,且是第一次被按下
- {
- uiKeyTimeCnt2++; //累加定时中断次数
- if(uiKeyTimeCnt2>const_key_time2)
- {
- uiKeyTimeCnt2=0;
- ucKeyLock2=1;//自锁按键置位,避免一直触发
- ucKeySec=2; //触发2号键
- }
- }
- }
- void key_service(void) //按键服务的应用程序
- {
- switch(ucKeySec) //按键服务状态切换
- {
- case 1:// 加按键 对应朱兆祺学习板的S1键
- switch(ucWd) //因为本程序只有1个窗口,在实际项目中,此处的ucWd也可以省略不要
- {
- case 1: //在窗口1下设置设定温度
- ulSetTemper++;
DS18B20温控 相关文章:
- 51单片机+DS18B20温控保温汇编程序(11-30)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)