久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4226|回復(fù): 1
收起左側(cè)

單片機(jī)ds18b20仿真數(shù)值顯示不正常?

[復(fù)制鏈接]
ID:481844 發(fā)表于 2019-3-23 22:51 | 顯示全部樓層 |閱讀模式
我設(shè)置的溫度超過60度LED等就會(huì)亮,溫度沒超過60度時(shí),數(shù)碼管顯示溫度值正常,但是還是有一堆的看不懂的提醒定位是ds18b20好像有問題;然后溫度超過60度后,LED燈亮,但是數(shù)碼管不顯示溫度值,調(diào)節(jié)溫度傳感器也沒有反應(yīng),而且仍然有一堆的提醒ds18b20好像有問題,求解答謝謝!!!

草圖1.png 草圖2.png

單片機(jī)源程序:

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
sbit du26=P2^6;//數(shù)碼管段選
sbit we27=P2^7;//數(shù)碼管位選
sbit DS=P2^2;//溫度傳感器
sbit led1=P3^7;//led
uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9數(shù)碼管段表
uchar code smgwei[]={0xfe,0xfd,0xfb};       //1~3數(shù)碼管位表
uint sum,wendu;
uint tt,y;

void delay(uchar z)
{
        uchar x,y;
        for(x=0;x<z;x++)
                for(y=0;y<110;y++);
}
void we(uchar z) //位選
{
        we27=0;
        P0=z;
        we27=1;
        we27=0;        
}

void du(uchar z)   //段選
{
        du26=0;         
        P0=z;
        du26=1;
        du26=0;        
}
void display() //三個(gè)數(shù)碼管顯示
{
        static uchar wei;
        switch(wei)
        {
                case 0:we(smgwei[wei]);du(smgdu[wendu/100]);break;
                case 1:we(smgwei[wei]);du(smgdu[wendu%100/10]|0x80);break;
                case 2:we(smgwei[wei]);du(smgdu[wendu%10]);break;
        }
        wei++;
        if(wei==3)
                wei=0;
}

void timer0int() interrupt 1 //定時(shí)器,定時(shí)5ms
{
        static uchar num;
        TH0=(65535-5000)/256;
        TL0=(65535-5000)%256;
        num++;
        display();
        if(num>=200)        //延時(shí)1s顯示溫度數(shù)值
        {
                num=0;
                 y=1;
        }        
}
void delay_us(uchar us)        //延時(shí)函數(shù)
{
         while(us--);
}

//單總線初始化時(shí)序         
bit ds_init()
{
        bit i;
        DS=1;
        _nop_();
        DS=0;
        delay_us(75);//拉低總線499.45us,總線上的溫度傳感器將會(huì)被全部復(fù)位

        DS=1;//釋放總線
        delay_us(4);//延時(shí)37.95us,等待溫度傳感器發(fā)回存在信號(hào)

        i=DS;
        delay_us(25);//延時(shí)141.95us,讀取溫度傳感器存在的時(shí)間
        DS=1;
        _nop_();
        return (i);
}
//寫一個(gè)字節(jié)
void write_byte(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                DS=0;
                _nop_(); //產(chǎn)生寫時(shí)序
                DS=dat&0x01;
                delay_us(12);//延時(shí)76.95us
                DS=1;//釋放總線準(zhǔn)備下一次數(shù)據(jù)的寫入
                _nop_();
                dat>>=1;
        }
}
//讀一個(gè)字節(jié)
uchar read_byte()
{
        uchar i,j,dat;
        for(i=0;i<8;i++)
        {
                DS=0;
                _nop_();//產(chǎn)生讀時(shí)序
                DS=1;
                _nop_();//釋放總線
                j=DS;
                delay_us(12);//76.95us
                DS=1;
                _nop_();
                dat=(j<<7)|(dat>>1);
        }
        return (dat);
}  
void main()
{        
        uint i;
        uchar L,M;
        EA=1;
        ET0=1;
        TR0=1;
        TMOD=0X01;
        TH0=(65535-5000)/256;
        TL0=(65535-5000)%256;        
        while(1)           
        {
                ds_init();//初始化溫度傳感器
                write_byte(0xcc);//發(fā)送跳躍ROM指令
                write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換指令
                delay(50);
                ds_init();//初始化溫度傳感器
                write_byte(0xcc);//發(fā)送跳躍ROM指令
                write_byte(0xbe);//讀取溫度傳感器暫存器的值
                L=read_byte();
                M=read_byte();
                i=M;
                i<<=8;
                i|=L;
                i=i*0.0625*10+0.5;//將讀出來的數(shù)據(jù)合并存到i中
                if(y==1)         
                {
                        y=0;
                          wendu=i;
                }
                if(wendu>=600)          //溫度超過60度,LED燈亮
                        led1=0;
                else
                         led1=1;
        }
}

回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2019-3-24 10:35 | 顯示全部樓層
你的程序沒有大毛病。可能是時(shí)序有點(diǎn)問題,另外把讀溫度程序放在時(shí)標(biāo) if(y==1)內(nèi)為佳。修改后功能正常。 無標(biāo)題.jpg

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit du26=P2^6;//數(shù)碼管段選
  6. sbit we27=P2^7;//數(shù)碼管位選
  7. sbit DS=P2^2;//溫度傳感器
  8. sbit led1=P3^7;//led
  9. uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9數(shù)碼管段表
  10. uchar code smgwei[]={0xfe,0xfd,0xfb,0xf7};       //1~4數(shù)碼管位表
  11. uchar TempData[4];//顯示值緩存
  12. //uint sum,wendu;
  13. //uint tt;
  14. bit y;

  15. void delay_us(uchar us)//約2us延時(shí)函數(shù)
  16. {
  17.         while(--us);
  18. }
  19. void delay(uchar z)//約1ms延時(shí)函數(shù)
  20. {
  21.         while(z--)
  22.         {
  23.                 delay_us(245);
  24.                 delay_us(245);
  25.         }
  26. }
  27. void we(uchar z) //位選
  28. {
  29. //        we27=0;
  30.         P0=z;
  31.         we27=1;
  32.         we27=0;        
  33. }
  34. void du(uchar z)   //段選
  35. {
  36. //        du26=0;
  37.         P0=z;
  38.         du26=1;
  39.         du26=0;
  40. }
  41. void display() //4個(gè)數(shù)碼管顯示
  42. {
  43.         static uchar wei;
  44.         du(0x00);                        //消隱
  45.         we(smgwei[wei]);        //送位碼
  46.         du(TempData[wei]);//送段碼
  47.         wei++;
  48.         wei%=4;
  49. }
  50. //讀一個(gè)字節(jié)
  51. uchar read_byte()
  52. {
  53.         uchar i,dat;
  54.         for(i=0;i<8;i++)
  55.         {
  56.                 DS=0;
  57.                 dat>>=1;
  58.                 DS=1;
  59.                 if(DS)
  60.                         dat|=0x80;
  61.                 delay_us(25);
  62.         }
  63.         return (dat);
  64. }  
  65. //寫一個(gè)字節(jié)
  66. void write_byte(uchar dat)
  67. {
  68.         uchar i;
  69.         for(i=0;i<8;i++)
  70.         {
  71.                 DS=0;
  72.                 DS=dat&0x01;
  73.                 delay_us(25);//延時(shí)
  74.                 DS=1;//釋放總線準(zhǔn)備下一次數(shù)據(jù)的寫入
  75.                 dat>>=1;
  76.         }
  77. }
  78. //單總線初始化時(shí)序         
  79. bit ds_init()
  80. {
  81.         bit i;
  82.         DS=1;
  83.         delay_us(5);
  84.         DS=0;
  85.         delay_us(200);//拉低總線499.45us,總線上的溫度傳感器將會(huì)被全部復(fù)位
  86.         delay_us(200);
  87.         DS=1;//釋放總線
  88.         delay_us(50);//延時(shí)37.95us,等待溫度傳感器發(fā)回存在信號(hào)       
  89.         i=DS;
  90.         delay_us(25);//延時(shí)141.95us,讀取溫度傳感器存在的時(shí)間
  91.         return (i);
  92. }
  93. uint ReadTemperature()
  94. {
  95.         uint H,i;
  96.         uchar L;
  97.         ds_init();//初始化溫度傳感器
  98.         write_byte(0xcc);//發(fā)送跳躍ROM指令
  99.         write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換指令
  100.         delay(10);
  101.         ds_init();//初始化溫度傳感器
  102.         write_byte(0xcc);//發(fā)送跳躍ROM指令
  103.         write_byte(0xbe);//讀取溫度傳感器暫存器的值
  104.         L=read_byte();
  105.         H=read_byte();
  106.         H<<=8;
  107.         i=L+H;
  108.         return(i);
  109. }
  110. void Timer0Init()                //2毫秒@12.000MHz
  111. {
  112.         TMOD= 0x01;                //設(shè)置定時(shí)器模式
  113.         TL0 = 0x30;                //設(shè)置定時(shí)初值
  114.         TH0 = 0xF8;                //設(shè)置定時(shí)初值
  115.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  116.         EA=1;
  117.         ET0=1;
  118. }
  119. void main()
  120. {        
  121.         uint  temp;
  122.         uchar TempH,TempL;
  123.         bit   negative;//負(fù)數(shù)標(biāo)志

  124.         Timer0Init();      
  125.         while(1)           
  126.         {
  127.                 if(y==1)         
  128.                 {
  129.                         y=0;
  130.                         temp=ReadTemperature();//讀取溫度
  131.                         if(temp&0x8000)
  132.                         {
  133.                                 negative=1;                //負(fù)號(hào)標(biāo)志
  134.                                 temp=~temp;                //取反加1
  135.                                 temp +=1;
  136.                         }
  137.                         else negative=0;        //正數(shù)

  138.                         TempH=temp>>4;                //分解為整數(shù)
  139.                         TempL=temp&0x0F;        //分解為小數(shù)
  140.                         TempL=TempL*6/10;        //保留一位小數(shù)

  141.                         if(negative==1)
  142.                                 TempData[0]=0x40;//顯示負(fù)號(hào)
  143.                         else if(TempH/100==0)//小于100
  144.                                 TempData[0]=0;                                                //百位消隱
  145.                         else
  146.                                 TempData[0]=smgdu[TempH/100]; //顯示百位溫度
  147.        
  148.                         if((TempH/100==0)&&((TempH%100)/10==0))
  149.                                 TempData[1]=0;                                                //十位消隱
  150.                         else
  151.                                 TempData[1]=smgdu[(TempH%100)/10];        //顯示十位溫度
  152.                         TempData[2]=smgdu[(TempH%100)%10]|0x80;//顯示個(gè)位溫度,帶小數(shù)點(diǎn)
  153.                         TempData[3]=smgdu[TempL];                                        //顯示小數(shù)溫度1位       
  154.                 }
  155.                 if(TempH>=60)          //溫度超過60度,LED燈亮
  156.                         led1=0;
  157.                 else        led1=1;       
  158.         }
  159. }
  160. void timer0int() interrupt 1 //定時(shí)器,定時(shí)2ms
  161. {
  162.         static uchar num;
  163.         TL0 = 0x30;                //設(shè)置定時(shí)初值
  164.         TH0 = 0xF8;                //設(shè)置定時(shí)初值
  165.         display();
  166.         num++;
  167.         if(num>=250)   //延時(shí)500ms顯示溫度數(shù)值
  168.         {
  169.                 num=0;
  170.                 y=1;
  171.         }        
  172. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区免费 | 97高清国语自产拍 | 日韩爱爱网站 | 久久午夜影院 | a级在线免费观看 | 国产色片 | 国产一区二区三区在线 | 久久青 | 国产一区二区毛片 | 一区二区三区免费网站 | 亚洲精品一二三 | 久久国产精品72免费观看 | 精品国产综合 | 日韩www | 日本午夜精品 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 久久久久久国产精品mv | 久久免费视频在线 | 国产精品视频一二三区 | 日韩在线小视频 | 婷婷毛片 | 亚洲精品乱码久久久久久按摩观 | 国产一二三视频在线观看 | 欧美国产在线一区 | 中文字幕精品一区二区三区精品 | www.色综合 | 久久精品播放 | 日韩精品一区二区三区在线播放 | 欧美国产一区二区 | 日本午夜精品 | 99re视频在线观看 | 日韩一二三区视频 | 欧美在线视频二区 | 亚洲国产成人精品女人久久久 | 国产91精品久久久久久久网曝门 | 天天操天天干天天爽 | 一区二区在线免费观看 | 九色视频网 | 国产在线观看一区二区 | 国产精品 亚洲一区 | 美女视频一区二区三区 |