微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机求助(课程设计 急!)

51单片机求助(课程设计 急!)

时间:10-02 整理:3721RD 点击:
自己写了一段程序 是一个温度报警器 但是当设定温度时显示不正常 哪位能给调试一下include<reg51.h>#define uchar unsigned char
#define uint unsigned int
sbit led1=P0^0; /*****百位数码管*****/
sbit led2=P0^1; /*****十位数码管*****/
sbit led3=P0^2; /*****个位数码管*****/
sbit DQ=P0^6; // 单总线
sbit clk=P2^5;  //74ls164时钟端
sbit da_ta=P2^4;//74ls164数据端
sbit k1=P1^2; // 键盘1
sbit k2=P1^3; // 键盘2
sbit speak=P2^0;
uchar num,i,bai,shi,ge;
/*共阳数码管段码*/
uchar code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/***********子函数声明**************/
void delay(char w);          /**************延迟子函数************/
void delay_18B20(uint M);/*********18b20的延迟子函数********/
void move(uchar z);
void display(ge,shi,bai);
void Init_DS18B20(void);
read_temp(void);
uint SegBuf[3];
uchar ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void Init_Timer0();
/**********子函数声明结束*************/
void main()
{  
        uint TempData,ge,shi,bai,I=20;
        speak=0;
    while(1)
    {  
                   Init_DS18B20();
        TempData=read_temp();
          
     if((k1&k2)==0)
        {
                delay(50);
                  if((k1&k2)==0)
                  {       
                   
                                
                 
                  if(k2==0)
               {
                           I--;
                          
                   }
                   if(k1==0)
               {       
                                   I++;
               }
                   TempData=I;
                   ge  =disp[TempData%10];
               shi =disp[TempData/10%10]&0x7f;
               bai =disp[TempData/100%10];
                   display(ge,shi,bai);
                            delay(5);
                         }
                         }
                         delay(5000);
                        TempData=read_temp();
    /*******以下将读18b20的数据送到LED数码管显示*************/
                 //把实际温度送到TempData变量中
         if(TempData>=I)
          {        speak=1;
            delay(50000);
                speak=0;
          }
          ge  =disp[TempData%10];
          shi =disp[TempData/10%10]&0x7f;
          bai =disp[TempData/100%10];
      display(ge,shi,bai);
          delay(5);
          }
          }


/*************显示子函数************/
void display(ge,shi,bai)
{  
    {move(ge);   
        led3=1;
        delay(6);
        led3=0;
        }
    {
         
        move(shi);   
        led2=1;
        delay(6);
        led2=0;
        }
    {move(bai);   
        led1=1;
        delay(6);
        led1=0;
        }

       
}  
/********74ls164移位寄存指令**********/
void move(uchar z)
{
   uint i;
    for(i=0;i<8;i++)   
        { clk=0;
          z<<=1;      
          da_ta=CY;        
          clk=1;        
         }
         
}
/*********18b20的延迟子函数********/
void delay_18B20(uint s)
{
while(s--);
}
/**************延迟子函数************/
void delay(char w)
{  char X,Y;
   for(X=w;X>0;X--)
   for(Y=120;Y>0;Y--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;          //DQ复位
delay_18B20(2); //稍做延时
DQ = 0;          //单片机将DQ拉低
delay_18B20(60); //精确延时 大于 480us
DQ = 1;          //拉高总线
delay_18B20(2);
x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(15);
}
/***********ds18b20读一个字节**************/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
    DQ = 0; // 给脉冲信号
    dat>>=1;
    DQ = 1; // 给脉冲信号
    if(DQ)
    dat |=0x80;
    delay_18B20(4);
}
   return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat)
{
   unsigned char i=0;
   for (i=8; i>0; i--)
   {
    DQ = 0;
    DQ = dat&0x01;
    delay_18B20(2);
    DQ = 1;
    dat>>=1;
}
}
/*********获取温度***********/
   read_temp()
{
        uint temp;
        float f_temp;
        uint a,b;
        Init_DS18B20();
        WriteOneChar(0xcc);
        WriteOneChar(0x44);        //启动温度测量
        delay(300);        //有一定时间去测量温度
                                //并把数值存储在高速暂存器的温度寄存器中
    Init_DS18B20();
        WriteOneChar(0xcc);
        WriteOneChar(0xbe);        //开始读数据命令
        a=ReadOneChar();        //读出温度的低位LSB
        b=ReadOneChar();        //读出温度的高位MSB  
    temp=b;
    temp<<=8;
    temp=temp|a;     //两字节合成一个整型变量。
        if(temp<0x0fff)        //12位转化后得到的12位数据,存储在18B20的两个高低字节的两个8位的RAM中;
                        //二进制中的前面五位是符号位。如果测得温度大于0,这5位为0,只要将测得的数值乘以0.0625即可得到实际温度
                                        //如果温度小于0,这五位为1,测得的数值要取反加1再乘以0.0625才能得到实际温度
        {        uint tflag;
                tflag=0;//测得的温度为正值
        }
        else
        {         uint tflag;
                temp=~temp+1;
                tflag=1;  //测得的温度为负值
        }
        f_temp=temp*0.0625;// 温度在寄存器中为12位,分辨率为0.0625
        temp=f_temp*10+0.5;    //乘以10表示小数点后面只取1位,加0.5时四舍五入
    return temp;     //返回温度值       
}

电路仿真图


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top