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

標題: 單片機+DS18B20程序 數碼管閃爍 [打印本頁]

作者: 1P1P    時間: 2020-8-22 21:10
標題: 單片機+DS18B20程序 數碼管閃爍
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();
               
        }
}



作者: wufeng391    時間: 2020-8-23 08:47
數碼管顯示一般在定時器中斷程序執行定時刷新,同時要注意消隱。
作者: wulin    時間: 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. }
復制代碼

作者: 新鄉家電維修    時間: 2020-8-23 12:32
讀取18B20需要750ms,所以閃爍,即便你更改18B20到9位精度,讀取時間也超過了人眼最低掃描頻率
作者: 1P1P    時間: 2020-8-23 20:01
wulin 發表于 2020-8-23 11:59
造成數碼管閃爍的原因是樓主的主程序循環周期時間太長,達到8.2ms,5個數碼管掃描一輪需要41ms,遠超20ms極 ...

多謝大佬的解答,這個超出20ms極限,確實沒有想到一直以為是自己寫程序那個環節的問題!!!
經過此次問題的解答,感覺自己還是不夠嚴謹,以后要加強自己在軟件與硬件間的微小變化!!
作者: 1P1P    時間: 2020-8-23 20:03
新鄉家電維修 發表于 2020-8-23 12:32
讀取18B20需要750ms,所以閃爍,即便你更改18B20到9位精度,讀取時間也超過了人眼最低掃描頻率

這個問題確實沒有考慮到,多謝大佬的提示解答
作者: aking991    時間: 2020-8-28 09:26
開一個定時器專門給顯示驅動用的,定時時間按你實際情況調試一下就OK了
作者: Listentoyou    時間: 2022-5-2 02:16
aking991 發表于 2020-8-28 09:26
開一個定時器專門給顯示驅動用的,定時時間按你實際情況調試一下就OK了

會不會在執行動態數碼管掃描時影響ds18b20讀取時序啊,一般我們操作這個溫感都是關中斷執行的
作者: 黑天科技    時間: 2024-12-28 19:52
路過,觀摩觀摩





歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 武道仙尊动漫在线观看 | 亚洲综合视频 | 日韩中文视频 | 99reav| 国产91丝袜在线播放 | 国产精品国产三级国产aⅴ原创 | 欧美综合国产精品久久丁香 | www.99re| 国产高清在线精品一区二区三区 | 欧美在线视频一区 | 欧美网站一区二区 | 成人av免费网站 | 欧美日韩不卡 | 久久久国产一区二区三区四区小说 | 国产精品久久久亚洲 | 中文字幕日韩欧美 | 五月综合激情在线 | 日本一区二区高清不卡 | 中文字幕一区在线 | 欧美一区二区免费电影 | 国产精品久久久久久久久久久久冷 | 国产一二三区免费视频 | 久久久91| 国产亚洲精品91 | www.久草.com | 欧美日产国产成人免费图片 | 欧美日韩一 | 欧美性网| 亚洲国产一区二区在线 | 久久久久久久久国产精品 | 国内精品视频在线 | av日韩在线播放 | 三区四区在线观看 | 国产精品成人国产乱一区 | 一区二区三区四区免费观看 | 日韩精品区| 国产综合久久久久久鬼色 | 久久久久无码国产精品一区 | 免费国产视频 | 北条麻妃国产九九九精品小说 | 亚洲一区二区av在线 |