第49节:利用DS18B20做一个温控器
时间:11-22
来源:互联网
点击:
- 鸣器鸣叫的原子锁
- unsigned char ucDigShow8;//第8位数码管要显示的内容
- unsigned char ucDigShow7;//第7位数码管要显示的内容
- unsigned char ucDigShow6;//第6位数码管要显示的内容
- unsigned char ucDigShow5;//第5位数码管要显示的内容
- unsigned char ucDigShow4;//第4位数码管要显示的内容
- unsigned char ucDigShow3;//第3位数码管要显示的内容
- unsigned char ucDigShow2;//第2位数码管要显示的内容
- unsigned char ucDigShow1;//第1位数码管要显示的内容
- unsigned char ucDigDot8;//数码管8的小数点是否显示的标志
- unsigned char ucDigDot7;//数码管7的小数点是否显示的标志
- unsigned char ucDigDot6;//数码管6的小数点是否显示的标志
- unsigned char ucDigDot5;//数码管5的小数点是否显示的标志
- unsigned char ucDigDot4;//数码管4的小数点是否显示的标志
- unsigned char ucDigDot3;//数码管3的小数点是否显示的标志
- unsigned char ucDigDot2;//数码管2的小数点是否显示的标志
- unsigned char ucDigDot1;//数码管1的小数点是否显示的标志
- unsigned char ucDigShowTemp=0; //临时中间变量
- unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
- unsigned char ucWd=1;//因为本程序只有1个窗口,在实际项目中,此处的ucWd也可以省略不要
- unsigned char ucWd1Part1Update=1;//在窗口1中,局部1的更新显示标志
- unsigned char ucWd1Part2Update=1; //在窗口1中,局部2的更新显示标志
- unsigned char ucTemp1=0;//中间过渡变量
- unsigned char ucTemp2=0;//中间过渡变量
- unsigned char ucTemp3=0;//中间过渡变量
- unsigned char ucTemp4=0;//中间过渡变量
- unsigned char ucTemp5=0;//中间过渡变量
- unsigned char ucTemp6=0;//中间过渡变量
- unsigned char ucTemp7=0;//中间过渡变量
- unsigned char ucTemp8=0;//中间过渡变量
- //根据原理图得出的共阴数码管字模表
- code unsigned char dig_table[]=
- {
- 0x3f,//0 序号0
- 0x06,//1 序号1
- 0x5b,//2 序号2
- 0x4f,//3 序号3
- 0x66,//4 序号4
- 0x6d,//5 序号5
- 0x7d,//6 序号6
- 0x07,//7 序号7
- 0x7f,//8 序号8
- 0x6f,//9 序号9
- 0x00,//无 序号10
- 0x40,//- 序号11
- 0x73,//P 序号12
- };
- void main()
- {
- initial_myself();
- delay_long(100);
- initial_peripheral();
- while(1)
- {
- key_service(); //按键服务的应用程序
- ds18b20_sampling(); //ds18b20采样程序
- temper_control_service(); //温控程序
- display_service(); //显示的窗口菜单服务程序
- }
- }
- /* 注释一:
- * 做温控设备的时候,为了避免继电器在临界温度附近频繁跳动切换,应该设置一个
- * 缓冲温差。本程序的缓冲温差是2度。
- */
- void temper_control_service(void) //温控程序
- {
- if(ucSignFlag==0) //是正数的前提下
- {
- if(ulCurrentTemper>=ulSetTemper)//当实际温度大于等于设定温度时
- {
- led_dr=0; //模拟继电器的LED灯熄灭
- }
- else if(ulCurrentTemper<=(ulSetTemper-2))//当实际温度小于等于设定温度2读以下时,这里的2是缓冲温差2度
- {
- led_dr=1; //模拟继电器的LED灯点亮
- }
- }
- else//是负数,说明是零下多少度的情况下
- {
- led_dr=1; //模拟继电器的LED灯点亮
- }
- }
- void ds18b20_sampling(void) //ds18b20采样程序
- {
- ++uiSampingCnt;//累计主循环次数的时间
- if(uiSampingCnt>const_ds18b20_sampling_time)//每隔一段时间就更新采集一次Ds18b20数据
- {
- uiSampingCnt=0;
- ET0=0;//禁止定时中断
- uiTemperTemp=get_temper();//读取一次没有经过换算的温度数值
- ET0=1; //开启定时中断
- if((uiTemperTemp&0xf800)==0xf800) //是负号
- {
- ucSignFlag=1;
- uiTemperTemp=~uiTemperTemp;//求补码
- uiTemperTemp=uiTemperTemp+1;
- }
- else //是正号
- {
- ucSignFlag=0;
- }
- ulCurrentTemper=0; //把int数据类型赋给long类型之前要先清零
- ulCurrentTemper=uiTemperTemp;
- ulCurrentTemper=ulCurrentTemper*10; //为了先保留一位小数点,所以放大10倍,
- ulCurrentTemper=ulCurrentTemper>>4;//往右边移动4位,相当于乘以0.0625. 此时保留了1位小数点,
- ulCurrentTemper=ulCurrentTemper+5;//四舍五入
- ulCurrentTemper=ulCurrentTemper/10; //四舍五入后,去掉小数点
- ucWd1Part2Update=1; //局部2更新显示实时温度
- }
- }
- //ds18b20驱动程序
- unsigned int get_temper()//读取一次没有经过换算的温度数值
- {
- unsigned char temper_H;
- unsigned char temper_L;
- unsigned int ds18b20_data=0;
- ds18b20_reset(); //复位ds18b20的时序
- ds_write_byte
DS18B20温控 相关文章:
- 51单片机+DS18B20温控保温汇编程序(11-30)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)