求各位大神有没有at89c52温度系统设计的仿真及程序

2019-07-18 10:41发布

求各位大神有没有at89c52温度系统设计的仿真及程序,,,,多谢各位大神了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
lovezjf234
1楼-- · 2019-07-18 14:48
接单片机设计Q279712817
颩憅
2楼-- · 2019-07-18 20:45
/***************************************************/
#include "reg52.h"
#include "intrins.h"                                        //_nop_();延时函数用
#include "math.h"
#define  disdata P0                //段码输出口
#define  discan  P2                //扫描口
#define  uchar unsigned char
#define  uint  unsigned int
sbit     duqu=P3^6;                 //温度输入口
sbit     dian=P0^7;                 //LED小数点控制
sbit     beep=P1^6;                                        //蜂鸣器
sbit         key0=P3^0;                                       
sbit         key1=P3^1;
sbit     key02=P3^2;
sbit         key03=P3^3;
sbit     led0=P1^0;                                        //红灯
sbit     led1=P1^1;                                        //绿灯       
sbit          led2=P1^2;                                        //黄灯
uint     h;
uint     temp;
uchar    r;
char          high=38,low=10;
uchar         sign;
uchar    st=1;
uchar    ti;
uchar    pp;
uchar    ee;
uchar         nn;
//**************温度小数部分用查表法***********//
Uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,
0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
Uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};
//共阴LED段码表   "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-" "H"  "L"  "C"  //      
uchar code scan_con[4]={0x70,0xb0,0xd0,0xe0};    //列扫描控制字
uchar data temp_data[2]={0x00,0x00};       //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};  
//显示单元数据,共4个数据和一个运算暂用
/*****************11us延时函数*************************/
void delay(uint t)
{
  for (;t>0;t--);
}
/****************显示扫描函数********************/
void scan()
{
          char k;
        for(k=0;k<4;k++)                 //4位LED扫描控制
        {
                discan=scan_con[k];          //位选
                disdata=dis_7[display[k]];   //数据显示
                if (k==1){dian=1;}           //小数点显示
                delay(200);
        }
}
/****************DS18B20复位函数******************/
ow_reset(void)
{
        char presence=1;
        while(presence)
        {
                  while(presence)
                   {
                    duqu=1;_nop_();_nop_(); //从高拉倒低
                        duqu=0;                                       
                        delay(50);              //550 us
                        duqu=1;                                       
                        delay(6);               //66 us
                        presence=duqu;//presence=0 复位成功,继续下一步
                   }
                   delay(45);                  //延时500 us
                   presence=~duqu;         
        }
        duqu=1;                         //拉高电平
}
/****************DS18B20写命令函数******************/
//向1-WIRE 总线上写1个字节
void write_byte(uchar val)
{
  uchar i;
  for(i=8;i>0;i--)
  {
           duqu=1;_nop_();_nop_();               //从高拉倒低
           duqu=0;_nop_();_nop_();_nop_();_nop_();  //5 us
           duqu=val&0x01;                        //最低位移出
           delay(6);                                //66 us
           val=val/2;                              //右移1位
   }
   duqu=1;
   delay(1);
}


/****************DS18B20读1字节函数******************/
//从总线上取1个字节//
uchar read_byte(void)
{
        uchar i;
        uchar value=0;
        for(i=8;i>0;i--)
        {
                duqu=1;_nop_();_nop_();
                value>>=1;
                duqu=0;_nop_();_nop_();_nop_();_nop_();     //4 us
                duqu=1;_nop_();_nop_();_nop_();_nop_();     //4 us
                if(duqu)value|=0x80;
                delay(6);                                  //66 us
        }
        duqu=1;
        return(value);
}
/****************读出温度函数************************/
uint read_temp()
{
        ow_reset();                  //总线复位
        delay(200);
        write_byte(0xcc);            //发命令
        write_byte(0x44);            //发转换命令
        ow_reset();
        delay(1);
        write_byte(0xcc);            //发命令
        write_byte(0xbe);
        temp_data[0]=read_byte();    //读温度值的第字节
        temp_data[1]=read_byte();    //读温度值的高字节
        temp=temp_data[1];
        temp<<=8;                                               
        temp=temp|temp_data[0];    // 两字节合成一个整型变量。
        return temp;                 //返回温度值
}
/****************温度数据处理函数******************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分
/*****************************************************/
work_temp(uint tem)
{
        uchar n=0;
        nn=0;
        if(tem>6348)                   // 温度值正负判断
    {tem=65536-tem;n=1;nn=1;}  // 负温度求补码,标志位置1
        display[4]=tem&0x0f;           // 取小数部分的值
        display[0]=ditab[display[4]];  // 存入小数部分显示值
        display[4]=tem>>4;       // 取中间八位,即整数部分的值
        display[3]=display[4]/100;     // 取百位数据暂存
        display[1]=display[4]%100;     // 取后两位数据暂存display[2]=display[1]/10;      // 取十位数据暂存
        display[1]=display[1]%10;
        r=display[1]+display[2]*10+display[3]*100;
/******************符号位显示判断*********************/
        if(!display[3])
          {
            display[3]=0x0a;       //最高位为0时不显示
            if(!display[2])
                {
                           display[2]=0x0a;   //次高位为0时不显示
                }
          }
          if(n){display[3]=0x0b;}    //负温度时最高位显示"-"
}
/******************蜂鸣器报警函数*********************/
void BEEP()
{
        if(r>=high||r<=low)
        {
                   beep=1;led1=1;
                if(r>=high)
                {
                        led0=0;led2=1;
                }
                else if        (r<=low)
                {
                        led2=0;led0=1;
                }
        }
        else if        ((nn==1)&&(r>=abs(low)))
        {
                led2=0;led0=1;beep=1;led1=1;
        }
        else
        {
                beep=0;led1=0;led0=1;led2=1;
        }
}
/******************初始化函数**************************/
void init()
{       
    beep=0;
        EA=1;
        EX0=0;
        EX1=0;
        IT0=1;
        IT1=1;
        TMOD=0x11;
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        TH1=(65536-833)/256;
        TL1=(65536-833)%256;
        sign=0;
        ti=high;       
}
/******************温度/上下限调整切换****************/
void key11()
{
        while(key1==0)
        {
                delay(300);
                if(key1==0)
                {
                        st++;               
                        if(st==4)
                                st=1;
                }
                while(!key1);
                delay(300);
                while(!key1);
        }
}
/******************切换调整上下限*******************/
void key10()
{
        while(key0==0)
        {                     
                delay(300);          //消抖动
                if(key0==0)
                {
                        sign=!sign;
                }
            while(!key0);
                delay(300);
                while(!key0);
        }
}
/******************上下限加1************************/
void key2()
{
        while(key02==0)
        {
                delay(400);
                if(key02==0)
                {
                        if(sign)
                        {        low=low+1;
                                if(low>high)
                                {pp=low;low=high;high=pp;}
                        }
                        else
                        {high=high+1;ti=high;}       
                }
            while(!key02);
                delay(400);
                while(!key02);
        }
               
}
/******************上下限减1***********************/
void key3()
{
                while(key03==0)
        {
                delay(400);
                if(key03==0)
                {
                        if(sign)
                                low=low-1;
                        else
                        {        high=high-1;ti=high;
                                if(low>high)
                                {pp=low;low=high;high=pp;}               
                        }       
                }
            while(!key03);
                delay(400);
                while(!key03);
        }         
}
/******************上限温度显示*********************/
void high1()
{
        uchar k;
        if(high<100)
        {        display[0]=high%10;
                display[1]=high/10;
                display[2]=10;
                display[3]=12;                               
                for(k=0;k<4;k++)                     
                {
                        discan=scan_con[k];              
                        disdata=dis_7[display[k]];        
                        if (k==1){dian=0;}                                         
                        delay(300);
                        disdata=0x00;
                        delay(100);
                }       
        }
        else
        {
                display[0]=high%10;
                display[1]=high%100/10;
                display[2]=high/100;
                display[3]=12;                               
                for(k=0;k<4;k++)                     
                {
                        discan=scan_con[k];              
                        disdata=dis_7[display[k]];        
                        if (k==1){dian=0;}                                         
                        delay(300);
                        disdata=0x00;
                        delay(100);
                }
        }
}
/******************下限温度显示*********************/
void low1()
{
        uchar ki;
        if(low>=0)
        {   display[0]=low%10;
                display[1]=low/10;
                display[2]=10;
                display[3]=13;
                for(ki=0;ki<4;ki++)                     
                {
                        discan=scan_con[ki];              
                        disdata=dis_7[display[ki]];        
                        if (ki==1){dian=0;}               
                        delay(100);
                        disdata=0x00;
                        delay(100);
                }
        }
        else
        {
                ee=abs(low);
                display[0]=ee%10;
                display[1]=ee/10;
                display[2]=11;
                display[3]=13;
                for(ki=0;ki<4;ki++)                     
                {
                        discan=scan_con[ki];              
                        disdata=dis_7[display[ki]];        
                        if (ki==1){dian=0;}               
                        delay(100);
                        disdata=0x00;
                        delay(100);
                }
        }
}
/****************主函数************************/
void main()
{
        init();       
    disdata=0x00;                 //初始化端口
    discan=0x00;
    for(h=0;h<4;h++)              //开机显示"0000"
    {display[h]=0;}
    ow_reset();                   //开机先转换一次
    write_byte(0xcc);             //Skip ROM
    write_byte(0x44);             //发转换命令
    for(h=0;h<100;h++)            //开机显示"0000"
    {scan();}
    while(1)
    {
                switch(st)   //分支
                {
                        case 1:{                                
                                                work_temp(read_temp());
                                                scan();                //显示温度
                                                   BEEP();
                                        break;                               
                                        }                                       
                    case 2: {
                        high1();   // 显示上限温度         
                                                key10();
                                                key2();
                                                key3();
                                                break;
                                        }
                        case 3: {
                                            low1();   //显示下限温度
                                            key10();
                                            key2();
                                            key3();
                                            break;
                                       }
                }
                key11();
        }
}
//***********************结束*******************//




求大神看看此程序是否有错误!!!!
风中倩影
3楼-- · 2019-07-18 23:11
路过学习,谢谢分享。。。。。。。。。。。。

一周热门 更多>