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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4328|回復: 8
打印 上一主題 下一主題
收起左側

單片機+DS18B20程序 數碼管閃爍

[復制鏈接]
跳轉到指定樓層
樓主
ID:709561 發表于 2020-8-22 21:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
DS18B20溫度顯示程序,使用74hc595控制數碼管位選【2個4位數碼管】,數碼管閃爍頻率很高,閃爍是顯示的也能看得見,不知是那一個環節出現了問題更改了好久無法解決,閃爍時就好像在不間斷掃描一樣???麻煩各位大佬指出。
由于拍攝無法看出數碼管閃爍所以沒有上傳照片
#include<reg52.h>
#include<intrins.h>


#define uchar unsigned char
#define uint  unsigned int
        
sbit SER  = P1^2;    //數據輸入
sbit SCK  = P1^0;    //串行移位時鐘
sbit RCK  = P1^1;    //鎖存器時鐘
sbit DQ   = P2^2;    //18B20數據輸入


uint tvalue;
uchar tflag;


uchar code tab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uchar data buf[5]={0,0,0,0,0xC6};//顯示緩存


void hc595(uchar Data)//74HC595的數據串入并出子程序
{
        uchar i;            
        for(i=0;i<8;i++)        //由高位到低位發送一個字節
        {
                Data<<=1;                //左移一位,最高位溢出到位寄存器CY
                SER=CY;                        //從位寄存器的進位標志位CY讀取
                SCK = 0;                         //串行移位
                                _nop_();
                        _nop_();
                SCK = 1;
                        _nop_();
                            _nop_();
                                SCK = 0;
        }
   RCK = 0;                 //鎖存
   _nop_();
                _nop_();
   RCK = 1;
        _nop_();
                _nop_();
   RCK = 0;
}


void delay(unsigned int n)


{


unsigned int i,j;


for(j=n;j>0;j--)


for(i=112;i>0;i--);


}




void delay_18B20(uchar i)
{
        while(i--);
}


void ds1820()  //初始化
{
        uchar x=0;
        DQ = 1;
        delay_18B20(4);
        DQ = 0;
        delay_18B20(100);;
        DQ = 1;
        delay_18B20(40);;
}
uchar ds1820rd()  //讀數據
{
        uchar i=0;
        uchar dat=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                dat>>=1;
                DQ=1;
                if(DQ)
                dat|=0x80;
                delay_18B20(10);;
        }
        return(dat);
}
void ds1820wr(uchar wdata)  //寫數據
{
        uchar i=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                DQ=wdata&0x01;
                delay_18B20(10);;
                DQ=1;
                wdata>>=1;
        }
}


uint read_temp()
{
        uchar a,b;
        ds1820();
        ds1820wr(0xcc);  //跳過讀序列號
        ds1820wr(0x44);  //啟動溫度轉化
        ds1820();
        ds1820wr(0xcc);  //跳過讀序列號
        ds1820wr(0xbe);  //啟動溫度轉化
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
        if(tvalue<0x0fff)
                tflag=0;
        else
        {
                tvalue=~tvalue+1;
                tflag=1;
        }
        tvalue=tvalue*(0.625);  //溫值擴大10倍精確到1位小數
        return(tvalue);
}
void ds1820disp()
{
        static uchar k=0;
        buf[0]=tab[tvalue/1000];  //百位數
        buf[1]=tab[tvalue%1000/100];  //十位數
        buf[2]=tab[tvalue%100/10]&0x7f;  //個位數
        buf[3]=tab[tvalue%10];  //小數
        P0=0xFF;
        hc595(0x01<<k);
        P0=buf[k];
        k++;
        k%=5;
        
}






void main()
{
        ds1820();
        while(1)
        {
                ds1820disp();
                read_temp();
               
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:782419 發表于 2020-8-23 08:47 | 只看該作者
數碼管顯示一般在定時器中斷程序執行定時刷新,同時要注意消隱。
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-8-23 11:59 | 只看該作者
造成數碼管閃爍的原因是樓主的主程序循環周期時間太長,達到8.2ms,5個數碼管掃描一輪需要41ms,遠超20ms極限。由于操作18B20耗時6.3ms,占時過長,把read_temp()函數分3次完成,就可以使主循環周期平均約2.5ms,5個數碼管掃描一輪小于20ms。完美解決數碼管閃爍問題。
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5.         
  6. sbit SER  = P1^2;    //數據輸入
  7. sbit SCK  = P1^0;    //串行移位時鐘
  8. sbit RCK  = P1^1;    //鎖存器時鐘
  9. sbit DQ   = P2^2;    //18B20數據輸入

  10. uint  Temp;
  11. uchar tflag;
  12. uchar code tab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  13. uchar data buf[5]={0,0,0,0,0xC6};//顯示緩存


  14. void hc595(uchar Data)//74HC595的數據串入并出子程序
  15. {
  16.         uchar i;            
  17.         for(i=0;i<8;i++)        //由高位到低位發送一個字節
  18.         {
  19.                 Data<<=1;            //左移一位,最高位溢出到位寄存器CY
  20.                 SER=CY;              //從位寄存器的進位標志位CY讀取
  21.                 SCK = 0;             //串行移位
  22.                 _nop_();
  23.                 _nop_();
  24.                 SCK = 1;
  25.                 _nop_();
  26.                 _nop_();
  27.                 SCK = 0;
  28.         }
  29.                 RCK = 0;              //鎖存
  30.                 _nop_();
  31.                 _nop_();
  32.                 RCK = 1;
  33.                 _nop_();
  34.                 _nop_();
  35.                 RCK = 0;
  36. }
  37. /*
  38. void delay(unsigned int n)
  39. {
  40.         unsigned int i,j;
  41.         for(j=n;j>0;j--)
  42.                 for(i=112;i>0;i--);
  43. }
  44. */
  45. void delay_18B20(uchar i)
  46. {
  47.         while(i--);
  48. }

  49. void ds1820()  //初始化
  50. {
  51.         uchar x=0;
  52.         DQ = 1;
  53.         delay_18B20(4);
  54.         DQ = 0;
  55.         delay_18B20(100);
  56.         DQ = 1;
  57.         delay_18B20(40);
  58. }
  59. uchar ds1820rd()  //讀數據
  60. {
  61.         uchar i=0;
  62.         uchar dat=0;
  63.         for(i=8;i>0;i--)
  64.         {
  65.                 DQ=0;
  66.                 dat>>=1;
  67.                 DQ=1;
  68.                 if(DQ)
  69.                 dat|=0x80;
  70.                 delay_18B20(10);
  71.         }
  72.         return(dat);
  73. }
  74. void ds1820wr(uchar wdata)  //寫數據
  75. {
  76.         uchar i=0;
  77.         for(i=8;i>0;i--)
  78.         {
  79.                 DQ=0;
  80.                 DQ=wdata&0x01;
  81.                 delay_18B20(10);
  82.                 DQ=1;
  83.                 wdata>>=1;
  84.         }
  85. }

  86. void read_temp()
  87. {
  88.         static uchar c=0;
  89.         uint tvalue;
  90.         uchar a,b;
  91.         switch(c)
  92.         {
  93.                 case 0:
  94.                         ds1820();
  95.                         ds1820wr(0xcc);  //跳過讀序列號
  96.                         ds1820wr(0x44);  //啟動溫度轉化
  97.                         break;
  98.                 case 1:
  99.                         ds1820();
  100.                         ds1820wr(0xcc);  //跳過讀序列號
  101.                         ds1820wr(0xbe);  //啟動溫度轉化
  102.                         break;
  103.                 case 2:
  104.                         a=ds1820rd();
  105.                         b=ds1820rd();
  106.                         tvalue=b;
  107.                         tvalue<<=8;
  108.                         tvalue=tvalue|a;
  109.                         if(tvalue<0x0fff)
  110.                                 tflag=0;
  111.                         else
  112.                         {
  113.                                 tvalue=~tvalue+1;
  114.                                 tflag=1;
  115.                         }
  116.                         Temp=tvalue*(0.625);  //溫值擴大10倍精確到1位小數
  117.                         break;
  118.         }
  119.         c++;
  120.         c%=3;
  121. }

  122. void ds1820disp()
  123. {
  124.         static uchar k=0;
  125.         switch(k)
  126.         {
  127.                 case 0:         if(tflag)buf[0]=0xbf;
  128.                                         else buf[0]=tab[Temp/1000]; break;//百位數
  129.                 case 1: buf[1]=tab[Temp%1000/100]; break;//十位數
  130.                 case 2: buf[2]=tab[Temp%100/10]&0x7f; break;//個位數
  131.                 case 3: buf[3]=tab[Temp%10]; break;//小數
  132.                 case 4: break;//"C"
  133.         }       
  134.         P0=0xff;
  135.         hc595(0x01<<k);
  136.         P0=buf[k];
  137.         k++;
  138.         k%=5;        
  139. }

  140. void main()
  141. {
  142.         ds1820();
  143.         while(1)
  144.         {
  145.                 read_temp();
  146.                 ds1820disp();
  147.         }
  148. }
復制代碼

評分

參與人數 1黑幣 +10 收起 理由
1P1P + 10 最具有說服力的解答 洞察羽翼

查看全部評分

回復

使用道具 舉報

地板
ID:72088 發表于 2020-8-23 12:32 | 只看該作者
讀取18B20需要750ms,所以閃爍,即便你更改18B20到9位精度,讀取時間也超過了人眼最低掃描頻率
回復

使用道具 舉報

5#
ID:709561 發表于 2020-8-23 20:01 | 只看該作者
wulin 發表于 2020-8-23 11:59
造成數碼管閃爍的原因是樓主的主程序循環周期時間太長,達到8.2ms,5個數碼管掃描一輪需要41ms,遠超20ms極 ...

多謝大佬的解答,這個超出20ms極限,確實沒有想到一直以為是自己寫程序那個環節的問題!!!
經過此次問題的解答,感覺自己還是不夠嚴謹,以后要加強自己在軟件與硬件間的微小變化!!
回復

使用道具 舉報

6#
ID:709561 發表于 2020-8-23 20:03 | 只看該作者
新鄉家電維修 發表于 2020-8-23 12:32
讀取18B20需要750ms,所以閃爍,即便你更改18B20到9位精度,讀取時間也超過了人眼最低掃描頻率

這個問題確實沒有考慮到,多謝大佬的提示解答
回復

使用道具 舉報

7#
ID:65956 發表于 2020-8-28 09:26 | 只看該作者
開一個定時器專門給顯示驅動用的,定時時間按你實際情況調試一下就OK了
回復

使用道具 舉報

8#
ID:693480 發表于 2022-5-2 02:16 | 只看該作者
aking991 發表于 2020-8-28 09:26
開一個定時器專門給顯示驅動用的,定時時間按你實際情況調試一下就OK了

會不會在執行動態數碼管掃描時影響ds18b20讀取時序啊,一般我們操作這個溫感都是關中斷執行的
回復

使用道具 舉報

9#
ID:105782 發表于 2024-12-28 19:52 | 只看該作者
路過,觀摩觀摩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 最新日韩在线 | 欧美一级高清片 | 久久性色 | 亚洲一区视频 | 成人国产精品色哟哟 | 青久草视频| 日韩在线一区二区三区 | 亚洲一区亚洲二区 | 亚洲精品久久久一区二区三区 | 欧美精品一区二区在线观看 | 久久久亚洲一区 | 91在线电影| 国产一区二区在线观看视频 | 国产精品精品视频一区二区三区 | 国产一区二区三区高清 | 亚洲国产精品久久久久婷婷老年 | 国产精品久久九九 | 国产精品第2页 | 午夜免费在线观看 | 成年人视频在线免费观看 | 亚洲视频在线观看 | 黄色电影在线免费观看 | 精品国产一区一区二区三亚瑟 | 在线精品亚洲欧美日韩国产 | 99精品国产一区二区三区 | 国产一区免费 | 99久久免费观看 | 一区二区三区四区av | 亚洲一区二区在线电影 | 久久99精品久久久久久琪琪 | 91资源在线播放 | 日韩成人在线视频 | 国产1区2区在线观看 | 成人毛片视频在线播放 | 在线视频中文字幕 | 国产一区二区三区色淫影院 | 亚洲性视频网站 | 天天综合日日夜夜 | 小草久久久久久久久爱六 | 亚洲一区二区国产 | 亚洲精品美女 |