本人菜鸟,目前在做一个温度显示并报警的装置, 程序烧进去后在面包板上搭好了 元件,接通 电源后发现复位时数码管显示8888,复位结束后显示02??(后面两位没有显示)。本人怀疑是程序问题,但经多方修改实在不知道如何继续,请高人指教,大谢!附程序: #include #include #define uchar unsigned char #define uint unsigned int
//*定义*// ***it Warn_light = P1^3; // P1.3为报警LED灯输入口 ***it Warn_sound = P1^4; // P1.4为蜂鸣器输入口 ***it DQ = P3^7; //定义DS18B20端口DQ uint TempH,TempL; uint temp; bit presence;
uint data temp_data[2] = {0x0000,0x0000} ; //温度数据缓存 uchar data dis_data[5]={0,0,0,0,0}; //温度值百十个小数位及一个数据缓存
uchar code ditab[16] = {0x3F,0x06,0x06,0x5B,0x4F,0x4F,0x66,0x66, 0x6D,0x7D,0x7D,0x07,0x7F,0x7F,0x6F,0x6F}; //温度小数部分查表 uchar code LEDtab[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管0到9的显示代码表 uchar code DS18B20_GOODtab[4] = {0x7D,0x3F,0x3F,0x5E}; //DS18B20正常时数码管的显示代码 uchar code DS18B20_BADtab[3] = {0x7C,0x77,0x5E}; //DS18B20非正常时数码管的显示代码
void LEDDelay(void) //LED选通延时函数 {uint num; for(num = 0; num<=800; num++); }
//*数码管显示函数*//
LED_Display(uchar bai, uchar shi, uchar ge, uchar fen) { if (bai!=0) { P2 = 0x01 ; //如果百位不为0,则选通百位数码管并显示百位 P0 = bai; LEDDelay(); P2 <<=1 ; //选通十位数码管并显示十位 P0 = shi ; LEDDelay(); } else { if (shi != 0) //如果百位为0,则跳过百位,判断十位是否为0 { P2=0x02 ; P0= shi ; LEDDelay() ;} //如果十位不为0,则选通十位并显示 else {P2 = 0x04 ; P0= ge ; LEDDelay() ; //如果十位为0,则直接选通个位并显示 P2<<= 1 ; P0= fen ; LEDDelay() ;} //选通十分位并显示 } }
//*DS18B20相关函数定义*// void delay(unsigned int i)//延时函数 { while(i--); }
bit Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(10); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5); return(x); }
unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(5); } return(dat); }
void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } delay(5); }
unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay(200); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位
b<<=8; t=a+b;
return(t); }
TemperatureDisplay() //温度数据转换和显示函数 { temp = Readtemperature(); TempH = temp>>4; TempL = temp&0x0F; dis_data[3]=ditab[TempL] ; //查表得小数位的值 dis_data[2]=LEDtab[(TempH%100)%10]|0x80 ; //个位 dis_data[1]=LEDtab[(TempH%100)/10] ; //十位 dis_data[0]=LEDtab[TempH/100] ; //百位
LED_Display(dis_data[0], dis_data[1], dis_data[2],dis_data[3]) ; //显示温度 }
void DS18B20_GOOD() //DS18B20 OK 菜单显示函数 { uchar i = 0 ; uchar j = 0 ; P2= 0x01 ;
for(i=0;i<4;i++) { P0= DS18B20_GOODtab[j]; LEDDelay(); ; P2<<=1; j++; } }
void DS18B20_BAD () //DS18B20 ERROR 菜单显示函数 { uchar i = 0 ; uchar j = 0 ; P2 = 0x01 ; for(i=0;i<3;i++) { P0= DS18B20_BADtab[j]; LEDDelay(); ; P2<<=1; j++; } }
void LED_Init () //检查LED数码管是否正常 { P2 = 0x0F ; P0 = 0xFF ; LEDDelay(); ; P2 = 0x00 ; P0 = 0X00 ; LEDDelay(); ; }
//*报警函数*// void WarnFans() { uint Temperature = temp*0.0625; if( Temperature<50) //当温度50度以下时,不报警 { delay(100) ; Warn_light = 1 ; Warn_sound = 1 ; } else //当温度50度以上时,报警 LED亮 蜂鸣器响 { delay(100) ; Warn_light = 0 ; Warn_sound = 0 ; } }
//*主函数*// void main() { LED_Init () ; DS18B20_GOOD () ; presence = Init_DS18B20(); do { TemperatureDisplay() ; WarnFans(); } while(!presence) ;
DS18B20_BAD () ;
do { DS18B20_Init() ; } while(presence) ; }
1
|
|
|
|