发表于:2010/8/2 21:25:15
#0楼
本人菜鸟,目前在做一个温度显示并报警的装置,程序烧进去后在面包板上搭好了元件,接通电源后发现复位时数码管显示8888,复位结束后显示02??(后面两位没有显示)。本人怀疑是程序问题,但经多方修改实在不知道如何继续,请高人指教,大谢!附程序:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//*定义*//
sbit Warn_light = P1^3; // P1.3为报警LED灯输入口
sbit Warn_sound = P1^4; // P1.4为蜂鸣器输入口
sbit 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) ;
}
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//*定义*//
sbit Warn_light = P1^3; // P1.3为报警LED灯输入口
sbit Warn_sound = P1^4; // P1.4为蜂鸣器输入口
sbit 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) ;
}