4.2 子程序
4.2.1温度数据显示处理函数
首先使用DS18B20进行温度数据采集,经过处理后的数据在由4个数码管进行数据显示。其中要进行温度值正负判断,负温度求补码,标志位置1等问题。
void tem_deal(uint tem) {
/*************温度数据处理*****************/ if(!flag) {
if(tem>6348) // 温度值正负判断
{tem=65536-tem;flag1=1;} // 负温度求补码,标志位置1 Dis_play[4]=tem&0x0f; // 取小数部分的值 Dis_play[3]=ditab[Dis_play[4]]; // 存入小数部分显示值
Dis_play[4]=tem>>4; // 取中间八位,即整数部分的值 Dis_play[0]=Dis_play[4]/100; // 取百位数据暂存 Dis_play[2]=Dis_play[4]0; // 取后两位数据暂存 Dis_play[1]=Dis_play[2]/10; // 取十位数据暂存 Dis_play[2]=Dis_play[2]; // 取个位数据暂存 if(!Dis_play[0]) // 最高位为0都不显示 {
Dis_play[0]=0x0a; // 先判断百位是否为0 if(!Dis_play[1]) {
Dis_play[1]=0x0a; // 再判断十位是否为0 } }
// if(flag1) // {
// Dis_play[3]=0x0b; // 为负数时,最高位显示 \ // } } }
/******************************************/ /* 温度数据显示 */ /******************************************/ void display() {
char k;
11
for(k=0;k<4;k++) //4位LED扫描控制 { Disdata=table[Dis_play[k]]; //数据显示 if (k==2){DIN=0;} //小数点显示 discan=scan_con[k]; //位选 delay(90); //延时 discan=0x0; } }
4.2.2超温报警可控程序
程序设定好三个按键来用来设定用户预想设定的报警值,和BS18B20采集过来的温度数据进行对比,如果超出了原来预定设的值时,就会立刻调用程序执行报警命令。
void Annu(void) { uchar temp,tim; temp=Dis_play[1]*10+Dis_play[2]; if(KEY1==0) { delay(5000); if(KEY1==0) { while(!KEY1) display(); flag3=0; display(); flag++; BUZ=0; BUZ1=1; if(flag==3) { flag3=1; flag=0; } } } if(flag==1) { DC1=0; if(KEY2==0) { delay(5000);
12
if(KEY2==0) { while(!KEY2) display(); tem1++; } }
if(KEY3==0) { delay(5000); if(KEY3==0) { while(!KEY3) display(); tem1--; } } }
if(temp>tem1) { if(!flag) { BUZ=1; BUZ1=0; } } else { BUZ=0; BUZ1=1; }
if(tem1==-1) tem1=50; if(tem1==51) tem1=0;
if(flag==2) { if(KEY2==0) { delay(5000); if(KEY2==0) { while(!KEY2)
13
{ display(); DC_change(tim); } tem2++; } }
if(KEY3==0) { delay(5000); if(KEY3==0) { while(!KEY3) { display(); DC_change(tim); } tem2--; } } Dis_play[1]=tem2/10; Dis_play[2]=tem2; Dis_play[3]=0; if(!Dis_play[1]) Dis_play[1]=0x0a; // 再判断十位是否为0 display(); if(tem2==0) { DC_clos(); } if(tem2==1) { flag3=1; tim=50; DC_change(tim); } if(tem2==2) { flag3=1; tim=125; DC_change(tim); } if(tem2==3) {
14
flag3=1; tim=200; DC_change(tim); } if(tem2==4) { DC_max(); } if(tem2==5) tem2=0; if(tem2==-1) tem2=4; }
// BUZ=0; if(flag==1) { Dis_play[1]=tem1/10; Dis_play[2]=tem1; Dis_play[3]=0; if(!Dis_play[1]) { Dis_play[1]=0x0a; // 再判断十位是否为0 } display(); } }
4.2.3定时器0函数
设置好定时器0的工作方式。 void timer0_int(void) interrupt 1 {
TR0=0; TH0=(65536-100)/256; TL0=(65536-100)%6; TR0=1; timer++; }
15