欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 詳細(xì)的程序分析:編程實現(xiàn)單片機(jī)ds18b20溫度測量及顯示系統(tǒng) [打印本頁]

作者: 15856431200    時間: 2018-3-27 23:09
標(biāo)題: 詳細(xì)的程序分析:編程實現(xiàn)單片機(jī)ds18b20溫度測量及顯示系統(tǒng)
編程實現(xiàn)基于單片機(jī)的溫度測量及顯示系統(tǒng)

實現(xiàn)結(jié)果:
測試結(jié)果顯示當(dāng)前攝氏溫度25.3度。
實現(xiàn)原理:
(1)獨(dú)立數(shù)碼管
數(shù)碼管分為共陽極和共陰極數(shù)碼管,
通過控制數(shù)碼管中的8個二極管,來顯示數(shù)字。
(2)多位共陰數(shù)碼管和共陽數(shù)碼管
本項目使用的是6位共陰數(shù)碼管。
數(shù)碼管控制主要通過段鎖存和位鎖存控制顯示要顯示的數(shù)字如溫度。段鎖存是指6位共陰極數(shù)碼管段輸出端連接鎖存器74HC573的輸出端,鎖存器的輸入端連接單片機(jī)接口P0。位鎖存是指6位數(shù)碼管位置輸出端連接鎖存器74HC573的輸出端,鎖存器的輸入端連接單片機(jī)接口P0。段鎖存器片選端接單片機(jī)接口P2.6,位鎖存器片選端接單片機(jī)接口P2.7。
連接圖如下:




程序分析:溫度傳感器DS18B20接單片機(jī)P2.2,段鎖存接P2.6,位鎖存接P2.7,unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
顯示段碼值0~9,Unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
分別對應(yīng)相應(yīng)的數(shù)碼管點亮,即位碼。
溫度傳感器的程序有測溫的程序,測得的溫度通過數(shù)碼管顯示出來。其中使用了延時和中斷子程序。
實現(xiàn)結(jié)果:
按下S2,顯示攝氏溫度如下
按下S2,顯示華氏溫度如下


實現(xiàn)原理:
在之前的溫度顯示模塊加入按鍵功能程序,利用兩種溫度轉(zhuǎn)換公式華氏溫度=(攝氏溫度*9/5)+32實現(xiàn)轉(zhuǎn)換。
相關(guān)程序如下:
  1. void display(uint temp,uint hstemp)                                          //顯示程序
  2. {

  3.    if(s2==0)                           
  4.    {

  5.    ser=temp/10;
  6.    SBUF=ser;
  7.    A1=temp/100;
  8.    A2t=temp%100;
  9.    A2=A2t/10;
  10.    A3=A2t%10;
  11.    dula=0;
  12.    P0=table[A1];                            //顯示百位
  13.    dula=1;
  14.    dula=0;

  15.    wela=0;
  16.    P0=0x7e;
  17.    wela=1;
  18.    wela=0;
  19.    delay(1);

  20.    dula=0;
  21.    P0=table1[A2];                            //顯示十位
  22.    dula=1;
  23.    dula=0;

  24.    wela=0;
  25.    P0=0x7d;
  26.    wela=1;
  27.    wela=0;
  28.    delay(1);

  29.    P0=table[A3];                            //顯示個位
  30.    dula=1;
  31.    dula=0;

  32.    P0=0x7b;
  33.    wela=1;
  34.    wela=0;
  35.    delay(1);
  36.    }
  37.    if(s3==0)
  38.    {
  39.             
  40.    ser1=hstemp/10;
  41.    SBUF=ser1;
  42.    A11=hstemp/100;
  43.    A21t=hstemp%100;
  44.    A21=A21t/10;
  45.    A31=A21t%10;
  46.    dula=0;
  47.    P0=table[A11];                            //顯示百位
  48.    dula=1;
  49.    dula=0;

  50.    wela=0;
  51.    P0=0x7e;
  52.    wela=1;
  53.    wela=0;
  54.    delay(1);

  55.    dula=0;
  56.    P0=table1[A21];                            //顯示十位
  57.    dula=1;
  58.    dula=0;

  59.    wela=0;
  60.    P0=0x7d;
  61.    wela=1;
  62.    wela=0;
  63.    delay(1);

  64.    P0=table[A31];                            //顯示個位
  65.    dula=1;
  66.    dula=0;

  67.    P0=0x7b;
  68.    wela=1;
  69.    wela=0;
  70.    delay(1);
  71.    }
  72. }
復(fù)制代碼

程序分析:s2,s3代表按鍵分別接在單片機(jī)P3.4,p3.5上,當(dāng)按鍵按下時單片機(jī)相應(yīng)接口顯示低電平,松開顯示高電平。當(dāng)檢測到S2按下時,顯示攝氏溫度。當(dāng)檢測到S3按下時,顯示華氏溫度。主程序如下:
if(s2==0)
  {
  SendByte(A1*10+A2);
  SendStr(".");
  SendByte(A3);

  }
  if(s3==0)
  {            
                SendByte(A11*10+A21);
                 SendStr(".");
  SendByte(A3);
  }
實現(xiàn)原理:
連接好串口或者usb轉(zhuǎn)串口至電腦,下載該程序,打開電源, 打開串口調(diào)試程序,將波特率設(shè)置為9600,無奇偶校驗,晶振11.0592MHz,發(fā)送和接收使用的格式相同。
串口通訊程序包括串口初始化,輸出字節(jié)函數(shù),輸出字符串函數(shù),主函數(shù)。溫度傳感器測得的溫度數(shù)值通過串口通訊程序輸出顯示在電腦上。
實現(xiàn)結(jié)果:
當(dāng)按下S2按鍵,電腦顯示如下:
發(fā)送和接收都是16進(jìn)制,1B=1*16+11*1=27,2E代表小數(shù)點,01=1,所以顯示溫度27.2攝氏度。
當(dāng)按下S3按鍵,電腦顯示如下:
發(fā)送和接收都是16進(jìn)制,51=5*16+1*1=81,2E代表小數(shù)點,03=3,所以顯示溫度81.3華氏。

單片機(jī)源程序如下:
  1. //安裝目錄下的EXE文件打開后可在電腦上顯示當(dāng)前溫度值
  2. #include <reg52.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DS=P2^2;           //define interface
  6. uint temp;             // variable of temperature
  7. uchar flag1;            // sign of the result positive or negative
  8. sbit dula=P2^6;
  9. sbit wela=P2^7;
  10. sbit s2=P3^4;
  11. sbit s3=P3^5;
  12. uchar A1,A2,A2t,A3,ser,A11,A21,A21t,A31,ser1;
  13. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  14.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  15. unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
  16.                         0x87,0xff,0xef};


  17. void SendStr(unsigned char *s);
  18. /*------------------------------------------------
  19.                     串口初始化
  20. ------------------------------------------------*/
  21. void InitUART  (void)
  22. {

  23.     SCON  = 0x50;                                    // SCON: 模式 1, 8-bit UART, 使能接收
  24.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
  25.     TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz
  26.     TR1   = 1;                  // TR1:  timer 1 打開                        
  27.     EA    = 1;                  //打開總中斷
  28.     //ES    = 1;                  //打開串口中斷
  29. }        
  30. void delay(uint count)      //delay
  31. {
  32.   uint i;
  33.   while(count)
  34.   {
  35.     i=200;
  36.     while(i>0)
  37.     i--;
  38.     count--;
  39.   }
  40. }
  41. void DelayUs2x(unsigned char t)
  42. {  
  43. while(--t);
  44. }
  45. /*------------------------------------------------
  46. mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  47. unsigned char 是定義無符號字符變量,其值的范圍是
  48. 0~255 這里使用晶振12M,精確延時請使用匯編
  49. ------------------------------------------------*/
  50. void DelayMs(unsigned char t)
  51. {

  52. while(t--)
  53. {
  54.      //大致延時1mS
  55.      DelayUs2x(245);
  56.               DelayUs2x(245);
  57. }
  58. }
  59. ///////功能:串口初始化,波特率9600,方式1///////
  60. void Init_Com(void)
  61. {
  62.      TMOD = 0x20;
  63.      PCON = 0x00;
  64.      SCON = 0x50;
  65.      TH1 = 0xFd;
  66.      TL1 = 0xFd;
  67.      TR1 = 1;
  68. }

  69. void dsreset(void)       //send reset and initialization command
  70. {
  71.   uint i;
  72.   DS=0;
  73.   i=103;
  74.   while(i>0)i--;
  75.   DS=1;
  76.   i=4;
  77.   while(i>0)i--;
  78. }

  79. bit tmpreadbit(void)       //read a bit
  80. {
  81.    uint i;
  82.    bit dat;
  83.    DS=0;i++;          //i++ for delay
  84.    DS=1;i++;i++;
  85.    dat=DS;
  86.    i=8;while(i>0)i--;
  87.    return (dat);
  88. }

  89. uchar tmpread(void)   //read a byte date
  90. {
  91.   uchar i,j,dat;
  92.   dat=0;
  93.   for(i=1;i<=8;i++)
  94.   {
  95.     j=tmpreadbit();
  96.     dat=(j<<7)|(dat>>1);   //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DAT里
  97.   }
  98.   return(dat);
  99. }

  100. void tmpwritebyte(uchar dat)   //write a byte to ds18b20
  101. {
  102.   uint i;
  103.   uchar j;
  104.   bit testb;
  105.   for(j=1;j<=8;j++)
  106.   {
  107.     testb=dat&0x01;
  108.     dat=dat>>1;
  109.     if(testb)     //write 1
  110.     {
  111.       DS=0;
  112.       i++;i++;
  113.       DS=1;
  114.       i=8;while(i>0)i--;
  115.     }
  116.     else
  117.     {
  118.       DS=0;       //write 0
  119.       i=8;while(i>0)i--;
  120.       DS=1;
  121.       i++;i++;
  122.     }

  123.   }
  124. }

  125. void tmpchange(void)  //DS18B20 begin change
  126. {
  127.   dsreset();
  128.   delay(1);
  129.   tmpwritebyte(0xcc);  // address all drivers on bus
  130.   tmpwritebyte(0x44);  //  initiates a single temperature conversion
  131. }

  132. uint tmp()               //get the temperature
  133. {
  134.   float tt;
  135.   uchar a,b;
  136.   dsreset();
  137.   delay(1);
  138.   tmpwritebyte(0xcc);
  139.   tmpwritebyte(0xbe);
  140.   a=tmpread();
  141.   b=tmpread();
  142.   temp=b;
  143.   temp<<=8;             //two byte  compose a int variable
  144.   temp=temp|a;
  145.   tt=temp*0.0625;
  146.   temp=tt*10+0.5;
  147.   return temp;
  148. }

  149. void readrom()          //read the serial
  150. {
  151.   uchar sn1,sn2;
  152.   dsreset();
  153.   delay(1);
  154.   tmpwritebyte(0x33);
  155.   sn1=tmpread();
  156.   sn2=tmpread();
  157. }


  158. void delay10ms()            //delay
  159.   {
  160.     uchar a,b;
  161.     for(a=10;a>0;a--)
  162.       for(b=60;b>0;b--);
  163.    }

  164. void display(uint temp,uint hstemp)                                          //顯示程序
  165. {

  166.    if(s2==0)                           
  167.    {

  168.    ser=temp/10;
  169.    SBUF=ser;
  170.    A1=temp/100;
  171.    A2t=temp%100;
  172.    A2=A2t/10;
  173.    A3=A2t%10;
  174.    dula=0;
  175.    P0=table[A1];                            //顯示百位
  176.    dula=1;
  177.    dula=0;

  178.    wela=0;
  179.    P0=0x7e;
  180.    wela=1;
  181.    wela=0;
  182.    delay(1);

  183.    dula=0;
  184.    P0=table1[A2];                            //顯示十位
  185.    dula=1;
  186.    dula=0;

  187.    wela=0;
  188.    P0=0x7d;
  189.    wela=1;
  190.    wela=0;
  191.    delay(1);

  192.    P0=table[A3];                            //顯示個位
  193.    dula=1;
  194.    dula=0;

  195.    P0=0x7b;
  196.    wela=1;
  197.    wela=0;
  198.    delay(1);
  199.    }
  200.    if(s3==0)
  201.    {
  202.             
  203.    ser1=hstemp/10;
  204.    SBUF=ser1;
  205.    A11=hstemp/100;
  206.    A21t=hstemp%100;
  207.    A21=A21t/10;
  208.    A31=A21t%10;
  209.    dula=0;
  210.    P0=table[A11];                            //顯示百位
  211.    dula=1;
  212.    dula=0;

  213.    wela=0;
  214.    P0=0x7e;
  215.    wela=1;
  216.    wela=0;
  217.    delay(1);

  218.    dula=0;
  219.    P0=table1[A21];                            //顯示十位
  220.    dula=1;
  221.    dula=0;

  222.    wela=0;
  223.    P0=0x7d;
  224.    wela=1;
  225.    wela=0;
  226.    delay(1);

  227.    P0=table[A31];                            //顯示個位
  228.    dula=1;
  229.    dula=0;

  230.    P0=0x7b;
  231.    wela=1;
  232.    wela=0;
  233.    delay(1);
  234.    }
  235. }

  236. void SendByte(unsigned char dat)
  237. {
  238. SBUF = dat;
  239. while(!TI);
  240.       TI = 0;
  241. }
  242. void main()
  243. {
  244. uchar a;
  245. InitUART();
  246. Init_Com();
  247.   do
  248.   {
  249.     tmpchange();

  250. for(a=10;a>0;a--)
  251.   {   display(tmp(),(tmp()*9/5)+320);
  252. // delay(200);
  253.   }
  254.   if(s2==0)
  255.   {
  256.   SendByte(A1*10+A2);
  257.   SendStr(".");
  258.   SendByte(A3);

  259.   }
  260.   if(s3==0)
  261.   {            
  262.                 SendByte(A11*10+A21);
  263.                  SendStr(".");
  264.   SendByte(A3);
  265.   }

  266.               DelayMs(240);//延時循環(huán)發(fā)送
  267.     DelayMs(240);
  268.   }                while(1);
  269. }

  270. /*------------------------------------------------
  271.                     發(fā)送一個字符串
  272. ------------------------------------------------*/
  273. void SendStr(unsigned char *s)
  274. {
  275. while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,
  276.                 //通過檢測是否字符串末尾
  277.   {
  278.   SendByte(*s);
  279.   s++;
  280.   }
  281. }

  282. 液晶顯示溫度程序
  283. #include <reg52.H>
  284. #include <intrins.H>
  285. #include <math.H>

  286. #define uchar unsigned char
  287.   #define uint unsigned int
  288. sbit dula = P2^6;
  289. sbit wela = P2^7;

  290. sbit RS = P3^5;   
  291. sbit LCDEN = P3^4;

  292. void delayUs()
  293. {
  294.     _nop_();
  295. }

  296. void delayMs(uint a)
  297. {
  298.     uint i, j;
  299.     for(i = a; i > 0; i--)
  300.         for(j = 100; j > 0; j--);
  301. }


  302. void writeComm(uchar comm)
  303. {
  304.      RS = 0;   
  305.     P0 = comm;
  306.     LCDEN = 1;
  307.      delayUs();
  308.     LCDEN = 0;
  309.     delayMs(1);
  310. }

  311. //寫數(shù)據(jù):RS=1, RW=0;
  312. void writeData(uchar dat)
  313. {
  314.      RS = 1;
  315.      P0 = dat;
  316.      LCDEN = 1;
  317.     delayUs();
  318.     LCDEN = 0;
  319.     delayMs(1);
  320. }


  321. void init()
  322. {

  323.      dula = wela = 0;
  324.     writeComm(0x38);
  325.    writeComm(0x0c);
  326.     writeComm(0x06);
  327.     writeComm(0x01);
  328. }

  329. void writeString(uchar * str, uchar length)
  330. {
  331.      uchar i;
  332.     for(i = 0; i < length; i++)
  333.     {
  334.          writeData(str[i]);
  335.      }
  336. }

  337. /**//*****************************DS18B20*******************************/
  338. sbit ds = P2^2;
  339. void dsInit()
  340. {

  341.     unsigned int i;
  342.     ds = 0;
  343.     i = 100;
  344.      while(i>0) i--;
  345.     ds = 1;  
  346.     i = 4;
  347.      while(i>0) i--;
  348. }

  349. void dsWait()
  350. {
  351.       unsigned int i;
  352.       while(ds);
  353.       while(~ds);
  354.       i = 4;
  355.       while(i > 0) i--;
  356. }


  357. bit readBit()
  358. {
  359.     unsigned int i;
  360.     bit b;
  361.     ds = 0;
  362.     i++;  
  363.     ds = 1;
  364.    i++; i++;
  365.     b = ds;
  366.     i = 8;
  367.     while(i>0) i--;
  368.     return b;
  369. }

  370. unsigned char readByte()
  371. {
  372.     unsigned int i;
  373.     unsigned char j, dat;
  374.    dat = 0;
  375.     for(i=0; i<8; i++)
  376.     {
  377.         j = readBit();

  378.         dat = (j << 7) | (dat >> 1);
  379.     }
  380.     return dat;
  381. }


  382. void writeByte(unsigned char dat)
  383. {
  384.     unsigned int i;
  385.     unsigned char j;
  386.     bit b;
  387.     for(j = 0; j < 8; j++)
  388.     {
  389.         b = dat & 0x01;
  390.         dat >>= 1;

  391.         if(b)  
  392.         {
  393.            ds = 0;          i++; i++;
  394.             ds = 1;   
  395.             i = 8; while(i>0) i--;
  396.         }
  397.         else
  398.         {
  399.             ds = 0;
  400.           i = 8; while(i>0) i--;
  401.             ds = 1;
  402.            i++; i++;
  403.         }
  404.    }
  405. }


  406. void sendChangeCmd()
  407. {
  408.     dsInit();   
  409.     dsWait();  
  410.     delayMs(1);   
  411.     writeByte(0xcc);
  412.     writeByte(0x44);
  413. }

  414. void sendReadCmd()
  415. {
  416.     dsInit();
  417.     dsWait();
  418.     delayMs(1);
  419.     writeByte(0xcc);
  420.     writeByte(0xbe);
  421. }


  422. int getTmpValue()
  423. {
  424.     unsigned int tmpvalue;
  425.     int value;
  426.     float t;
  427.     unsigned char low, high;
  428.     sendReadCmd();

  429.     low = readByte();
  430.     high = readByte();

  431.     tmpvalue = high;
  432.     tmpvalue <<= 8;
  433.     tmpvalue |= low;
  434.     value = tmpvalue;

  435.   \
  436.     t = value * 0.0625;
  437.     \
  438.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
  439.     return value;
  440. }

  441. void display(int v)
  442. {
  443.     unsigned char count;
  444.     unsigned char datas[] = {0, 0, 0, 0, 0};
  445.     unsigned int tmp = abs(v);
  446.     datas[0] = tmp / 10000;
  447.     datas[1] = tmp % 10000 / 1000;
  448.     datas[2] = tmp % 1000 / 100;
  449.     datas[3] = tmp % 100 / 10;
  450.     datas[4] = tmp % 10;
  451.     writeComm(0xc0+3);
  452.     if(v < 0)
  453.     {
  454.         writeString("- ", 2);
  455.    }
  456.     else
  457.     {
  458.        writeString("+ ", 2);
  459.     }
  460.     if(datas[0] != 0)
  461.     {
  462.         writeData('0'+datas[0]);
  463.     }
  464.     for(count = 1; count != 5; count++)
  465.     {
  466.         writeData('0'+datas[count]);
  467.         if(count == 2)
  468. ……………………

  469. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
單片機(jī)的溫度測量及顯示系統(tǒng).docx (1.66 MB, 下載次數(shù): 70)



作者: why___1997    時間: 2018-6-26 23:14
非常感謝分享
作者: lorraine    時間: 2018-6-27 08:49
GANXIE
作者: 倔強(qiáng)lan    時間: 2018-12-2 16:02
謝謝樓主的分享,現(xiàn)在我已經(jīng)大致明白了單片機(jī)內(nèi)部這個部件的構(gòu)造了,但可能我們的板子不一樣,還有你的一些變量名我看不懂,我還是要好好學(xué)習(xí)才行。
作者: Hopeful    時間: 2020-1-16 19:54
感謝分享
作者: gao687    時間: 2022-6-24 11:39
可以使用,代碼詳細(xì)




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1