找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1473|回复: 5
打印 上一主题 下一主题
收起左侧

基于51的温控系统温度问题

[复制链接]
跳转到指定楼层
楼主
我的温度 显示不能随传感器温度的改变而变化是为什么?
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P3^5;                //温度传感器
sbit beep=P3^7;            
sbit  rs=P2^4;            //控制发光二极管
sbit rw=P2^3;
sbit lcde=P2^2;       
                uchar tp,tpx,num,count,miao,fen,shi;
        uchar code table[]="happy everyday!";
        uchar code table1[]=": :";
        uchar code table2[]="weather:cold";
        uchar code table3[]="weather:hot";
        void delay(uint z)   //延时
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
        void delay2(uint i)
        {
        while(i--);
               
}
  ////***ds18b20*****///
void init_ds18b20()             //DS18B20复位,初始化函数
{
       
        ds=1;
        delay2(8);
        ds=0;
        delay2(90);
        ds=1;
        delay2(4);
        if(ds==0)
                delay2(14);
        ds=1;
}

uchar read_ds18b20_byte()            //读1字节数据函数(MSB)
{
        uchar i,dat;
        dat=0;
        for(i=0;i<8;i++)
        {
                ds=0;
                dat=dat>>1;
                ds=1;
                if(ds==1)
                {
                        dat=dat|0x80;//最高位或上一个1,使得最高位为1
                }
                delay2(4);
        }
        return dat;//循环8次完成一个字节,并返回数据

}
void write_ds18b20_byte(uchar date)//向ds8b20写1字节数据函数
{

        uchar j=0;
       
        for(j=0;j<=8;j++)
        {
                ds=0;
                ds=date&0x01;  //取出数据最低位送到数据线
                delay2(5);
                ds=1;
                date=date>>1;//字节右移一位,接着取第二位
delay2(5);       
        }       
}
int read_ds18b20_temp()        //DS18B20开始获取温度并转换
{
        uchar  a=0;//低8位
        uint b=0;//高8位
        uint t=0;//组成新温度
        init_ds18b20();
        write_ds18b20_byte(0xcc);
        write_ds18b20_byte(0x44);
        init_ds18b20();
        write_ds18b20_byte(0xcc);
        write_ds18b20_byte(0xbe);
        a=read_ds18b20_byte();
        b=read_ds18b20_byte();
        a=a&0x00ff;
        b=(b&0x000f)<<8;
        t=a|b;
        return t;
}
       
void writecom(uchar com)
{
        rs=0;
        rw=0;
        lcde=0;
        delay(5);
        lcde=0;
        P1=com;
        delay(5);
        lcde=1;
        delay(5);
        lcde=0;
}
void writedate(uchar date)
{
        rs=1;
        rw=0;
        delay(5);
        lcde=0;
        P1=date;
        delay(5);
        lcde=1;
        delay(5);
        lcde=0;
}


void wendudisplay()//显示温度数值函数,t传递的是整型的温度值
{
        uint tp,tpz;
        uchar tp2,tpshi,tpge,tpxiao;
tp=read_ds18b20_temp();
        tp2=tp&0x000f;
        tpxiao=tp2*0.0625;
        tpz=(tp&0x0ff0)>>4;
        tpz=tpz*0.0625;
        tpshi=tpz/10;
        tpge=tpz%10;
        writecom(0x80+0x40+10);
        writedate(tpshi+0x30);
        writedate(tpge+0x30);
        writedate('.') ;
        writedate(tpxiao+0x30);
        writedate(0xdf);
        writedate('C');
        if(tpz<15)
        {
                writecom(0x80);
                for(num=0;num<16;num++)
                {
                        writedate(table2[num]);
                        delay(5);
                        beep=0;
                }
        }
        if((tpz<25)&&(tpz>=15))
        {
                writecom(0x80);
                for(num=0;num<15;num++)
                {
                        writedate(table[num]);
                        delay(5);
                        beep=1;
                }
        }
        if(tpz>25)
        {
                writecom(0x80);
                for(num=0;num<16;num++)
                {
                        writedate(table3[num]);
                        delay(5);
                       
                }
        }
}
void writesfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        writecom(0x80+0x40+add);
        writedate(0x30+shi);
        writedate(0x30+ge);
        writecom(0x80+0x40+add);
}
void init()
{
        lcde=0;
        writecom(0x38);
        writecom(0x0c);
        writecom(0x06);
        writecom(0x01);
        delay(5);
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        miao=15;
        fen=12;
        shi=12;
}

       

void main()
{
init();
        while(1)
        {
                wendudisplay();
                writesfm(0,shi);
                        writesfm(3,fen);
                        writesfm(6,miao);
                writecom(0x80+0x40+2);
                writedate(':');
                writecom(0x80+0x40+5);
                writedate(':');
        }
}
        void timer0() interrupt 1
        {
                TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
                count++;
                if(count==20)
                {
                        count=0;
                        miao++;
                        if(miao==60)
                        {
                                miao=0;
                                fen++;
                                if(fen==60)
                                {
                                        shi++;
                                        fen=0;
                                        if(shi==24)
                                                shi=0;
                                }
                        }
                }
        }
               

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:168926 发表于 2019-4-20 14:49 | 只看该作者
中断会影响18b20   的读值     我以前遇到过,这个属于模拟I2C的时序问题
回复

使用道具 举报

板凳
ID:213173 发表于 2019-4-20 15:57 | 只看该作者
给你改好了,仿真和程序的LCD用的是P0,你自己改回P1



  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DS=P3^5;                //温度传感器
  6. sbit beep=P3^7;            
  7. sbit  rs=P2^4;            //控制发光二极管
  8. sbit rw=P2^3;
  9. sbit lcde=P2^2;        
  10. uchar tp,tpx,num,count,miao,fen,shi;
  11. uchar code table[]= "happy everyday! ";
  12. uchar code table1[]=": :";
  13. uchar code table2[]="weather:cold    ";
  14. uchar code table3[]="weather:hot     ";

  15. void delay_us(uchar us)//约2us延时函数
  16. {
  17.         while(--us);
  18. }
  19. void delay(uchar z)//约1ms延时函数
  20. {
  21.         while(z--)
  22.         {
  23.                 delay_us(245);
  24.                 delay_us(245);
  25.         }
  26. }
  27. //读一个字节
  28. uchar read_byte()
  29. {
  30.         uchar i,dat;
  31.         for(i=0;i<8;i++)
  32.         {
  33.                 DS=0;
  34.                 dat>>=1;
  35.                 DS=1;
  36.                 if(DS)
  37.                         dat|=0x80;
  38.                 delay_us(25);
  39.         }
  40.         return (dat);
  41. }  
  42. //写一个字节
  43. void write_byte(uchar dat)
  44. {
  45.         uchar i;
  46.         for(i=0;i<8;i++)
  47.         {
  48.                 DS=0;
  49.                 DS=dat&0x01;
  50.                 delay_us(25);//延时
  51.                 DS=1;//释放总线准备下一次数据的写入
  52.                 dat>>=1;
  53.         }
  54. }
  55. //单总线初始化时序         
  56. bit ds_init()
  57. {
  58.         bit i;
  59.         DS=1;
  60.         delay_us(5);
  61.         DS=0;
  62.         delay_us(200);//拉低总线499.45us,总线上的温度传感器将会被全部复位
  63.         delay_us(200);
  64.         DS=1;//释放总线
  65.         delay_us(50);//延时37.95us,等待温度传感器发回存在信号       
  66.         i=DS;
  67.         delay_us(25);//延时141.95us,读取温度传感器存在的时间
  68.         return (i);
  69. }
  70. uint ReadTemperature()
  71. {
  72.         uint H,i;
  73.         uchar L;
  74.         ds_init();//初始化温度传感器
  75.         write_byte(0xcc);//发送跳跃ROM指令
  76.         write_byte(0x44);//发送温度转换指令
  77.         delay(10);
  78.         ds_init();//初始化温度传感器
  79.         write_byte(0xcc);//发送跳跃ROM指令
  80.         write_byte(0xbe);//读取温度传感器暂存器的值
  81.         L=read_byte();
  82.         H=read_byte();
  83.         H<<=8;
  84.         i=L+H;
  85.         return(i);
  86. }
  87.         
  88. void writecom(uchar com)
  89. {
  90.         rs=0;
  91.         rw=0;
  92.         lcde=0;
  93.         delay(5);
  94.         lcde=0;
  95.         P0=com;
  96.         delay(5);
  97.         lcde=1;
  98.         delay(5);
  99.         lcde=0;
  100. }
  101. void writedate(uchar date)
  102. {
  103.         rs=1;
  104.         rw=0;
  105.         delay(5);
  106.         lcde=0;
  107.         P0=date;
  108.         delay(5);
  109.         lcde=1;
  110.         delay(5);
  111.         lcde=0;
  112. }
  113. void wendudisplay()//显示温度数值函数,t传递的是整型的温度值
  114. {
  115.         uint tp,tpz;
  116.         uchar tpshi,tpge,tpxiao;
  117.         tp=ReadTemperature();
  118.         if(tp>0x0630 || (tp&0x8000)>0)//限制在0~99范围
  119.                 tp=0;
  120.         tpz=tp>>4;                //分解为整数;
  121.         tpxiao=tp&0x0f;//分解为小数
  122.         tpxiao=tpxiao*6/10;//保留一位小数
  123. /*
  124.         tp2=tp&0x000f;
  125.         tpxiao=tp2*0.0625;
  126.         tpz=(tp&0x0ff0)>>4;
  127.         tpz=tpz*0.0625;
  128. */
  129.         tpshi=tpz/10;
  130.         tpge=tpz%10;
  131.         writecom(0x80+0x40+10);
  132.         writedate(tpshi+0x30);
  133.         writedate(tpge+0x30);
  134.         writedate('.') ;
  135.         writedate(tpxiao+0x30);
  136.         writedate(0xdf);
  137.         writedate('C');
  138.         if(tpz<15)
  139.         {
  140.                 writecom(0x80);
  141.                 for(num=0;num<16;num++)
  142.                 {
  143.                         writedate(table2[num]);
  144.                         delay(5);
  145.                         beep=0;
  146.                 }
  147.         }
  148.         if((tpz<25)&&(tpz>=15))
  149.         {
  150.                 writecom(0x80);
  151.                 for(num=0;num<16;num++)
  152.                 {
  153.                         writedate(table[num]);
  154.                         delay(5);
  155.                         beep=1;
  156.                 }
  157.         }
  158.         if(tpz>25)
  159.         {
  160.                 writecom(0x80);
  161.                 for(num=0;num<16;num++)
  162.                 {
  163.                         writedate(table3[num]);
  164.                         delay(5);
  165.                 }
  166.         }
  167. }
  168. void writesfm(uchar add,uchar date)
  169. {
  170.         uchar shi,ge;
  171.         shi=date/10;
  172.         ge=date%10;
  173.         writecom(0x80+0x40+add);
  174.         writedate(0x30+shi);
  175.         writedate(0x30+ge);
  176.         writecom(0x80+0x40+add);
  177. }
  178. void init()
  179. {
  180.         lcde=0;
  181.         writecom(0x38);
  182.         writecom(0x0c);
  183.         writecom(0x06);
  184.         writecom(0x01);
  185.         delay(5);
  186.         TMOD=0x01;
  187.         TH0=(65536-50000)/256;
  188.         TL0=(65536-50000)%256;
  189.         EA=1;
  190.         ET0=1;
  191.         TR0=1;
  192.         miao=15;
  193.         fen=12;
  194.         shi=12;
  195. }

  196. void main()
  197. {
  198.         init();
  199.         writecom(0x80+0x40+2);
  200.         writedate(':');
  201.         writecom(0x80+0x40+5);
  202.         writedate(':');
  203.         while(1)
  204.         {
  205.                 wendudisplay();
  206.                 writesfm(0,shi);
  207.                 writesfm(3,fen);
  208.                 writesfm(6,miao);
  209. //                writecom(0x80+0x40+2);
  210. //                writedate(':');
  211. //                writecom(0x80+0x40+5);
  212. //                writedate(':');
  213.         }
  214. }
  215. void timer0() interrupt 1
  216. {
  217.         TH0=(65536-50000)/256;
  218.         TL0=(65536-50000)%256;
  219.         count++;
  220.         if(count==20)
  221.         {
  222.                 count=0;
  223.                 miao++;
  224.                 if(miao==60)
  225.                 {
  226.                         miao=0;
  227.                         fen++;
  228.                         if(fen==60)
  229.                         {
  230.                                 shi++;
  231.                                 fen=0;
  232.                                 if(shi==24)
  233.                                 shi=0;
  234.                         }
  235.                 }
  236.         }
  237. }
复制代码



回复

使用道具 举报

地板
ID:123289 发表于 2019-4-20 16:53 | 只看该作者
沙发误导你。
回复

使用道具 举报

5#
ID:274129 发表于 2019-4-27 21:38 | 只看该作者
单片机时序有没有问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表