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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8434|回復: 0
收起左側

STC12 1T單片機DS18B20溫度檢測仿真+代碼+原理圖

[復制鏈接]
ID:430888 發(fā)表于 2018-11-21 22:42 | 顯示全部樓層 |閱讀模式
新人報道。了解學習下
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png

單片機源程序如下:
  1. /*******************************************************************************************/
  2. //   單片機原理與應用課程設計
  3. //   題目:溫度檢測系統(tǒng)設計
  4. //   要點:1、用溫度傳感器18B20測環(huán)境溫度,用LCD1602顯示測量結果
  5. //         2、用PROTEUS仿真
  6. //         3、焊接電路板并調(diào)試運行
  7. //   出品:濰坊學院信息與控制工程學院
  8. //   編程:戴曰章
  9. //   日期:2014年12月
  10. //   注意:該程序僅供參考。改程序用于STC12C5A60S2單片機。它是1T的指令周期,與傳統(tǒng)的12T的MCU不同
  11. /*******************************************************************************************/

  12. #include<reg52.h>
  13. #include<intrins.h>
  14. #define uchar unsigned char
  15. #define uint unsigned int

  16. #define     LCDIO      P1  //1602數(shù)據(jù)口
  17. sbit DQ=P3^2;//ds18b20與單片機連接口

  18. sbit rs=P2^0;  //1602數(shù)據(jù)命令選擇引腳
  19. sbit rd=P2^1;        //讀寫選擇
  20. sbit lcden=P2^2;        //1602選通引腳




  21. void DelayXus(uchar n);
  22. void DS18B20_Reset();
  23. void DS18B20_WriteByte(uchar dat);
  24. uchar DS18B20_ReadByte();


  25. float f_temp; //浮點型溫度值   
  26. uint tvalue;//溫度值
  27. uchar tflag;

  28. uchar code table[]=        {"The temperature "};    //每行顯示16個字符
  29. uchar code table1[]=        {"is:  000.0C wfu"};

  30. uchar data disdata[5];


  31. void delay(uint z)        //短延時
  32. {
  33.         uint x,y;
  34.         for(x=z;x>0;x--)
  35.                 for(y=110;y>0;y--);
  36. }

  37. void write_com(uchar com)        //1602寫命令子程序
  38. {
  39.         rs=0;                //RS是數(shù)據(jù)命令選擇短,高電平寫數(shù)據(jù),低電平寫命令
  40.         rd=0;                //RD是讀寫選擇短,高電平讀,低電平寫
  41.         lcden=0;        //1602選通端,高電平選通,低電平禁止
  42.         LCDIO =com;
  43.         delay(5);
  44.         lcden=1;
  45.         delay(5);
  46.         lcden=0;        
  47. }

  48. void write_date(uchar date)        //1602寫數(shù)據(jù)子程序
  49. {
  50.         rs=1;        //RS是數(shù)據(jù)命令選擇短,高電平寫數(shù)據(jù),低電平寫命令
  51.         rd=0;        //RD是讀寫選擇短,高電平讀,低電平寫
  52.         lcden=0;        //1602選通端,高電平選通,低電平禁止
  53.         LCDIO =date;
  54.         delay(5);
  55.         lcden=1;
  56.         delay(5);
  57.         lcden=0;        
  58. }



  59. void init()                                //1602初始化程序
  60. {
  61.         uchar num;
  62.         lcden=0;

  63.         write_com(0x38);        //0011 1000B,功能模式設置,設置為8為數(shù)據(jù)口,兩行顯示,5*7點陣
  64.         write_com(0x0c);        //0000 1011B,顯示開及光標設置,關顯示,顯示光標,光標閃爍
  65.         write_com(0x06);        //0000 0110B,顯示光標移動設置,讀或寫一個字符,地址指針減一且光標減一,寫一個字符屏幕顯示不移動
  66.         write_com(0x01);        //0000 0001B,顯示清屏,數(shù)據(jù)指針和所有顯示清屏
  67.         write_com(0x80);        //1000 000B,關閉顯示
  68.         delay(5);
  69.         write_com(0x80);        //1000 000B,設置為2行顯示,寫入第一行字符的地址,第一行地址是00-2F
  70.         for(num=0;num<16;num++)
  71.                 {
  72.                         write_date(table[num]);        //寫入第一行數(shù)據(jù)
  73.                         delay(5);
  74.                 }
  75.         write_com(0x80+0x40);        //1100 0000B,設置為2行顯示,寫入第二行字符的地址,第而行地址是40-67
  76.         for(num=0;num<16;num++)        //寫入第二行數(shù)據(jù)
  77.                 {
  78.                         write_date(table1[num]);//寫入第二行數(shù)據(jù)
  79.                         delay(5);
  80.                 }      
  81.         

  82. }










  83. /**************************************
  84. 延時X微秒(STC12C5A60S2@12M)
  85. 不同的工作環(huán)境,需要調(diào)整此函數(shù)
  86. 此延時函數(shù)是使用1T的指令周期進行計算,與傳統(tǒng)的12T的MCU不同
  87. **************************************/
  88. void DelayXus(uchar n)
  89. {
  90.     while (n--)
  91.     {
  92.         _nop_();
  93.         _nop_();
  94.     }
  95. }

  96. /**************************************
  97. 復位DS18B20,并檢測設備是否存在
  98. **************************************/
  99. void DS18B20_Reset()
  100. {
  101.     CY = 1;
  102.     while (CY)
  103.     {
  104.         DQ = 0;                     //送出低電平復位信號
  105.         DelayXus(240);              //延時至少480us
  106.         DelayXus(240);
  107.         DQ = 1;                     //釋放數(shù)據(jù)線
  108.         DelayXus(60);               //等待60us
  109.         CY = DQ;                    //檢測存在脈沖
  110.         DelayXus(240);              //等待設備釋放數(shù)據(jù)線
  111.         DelayXus(180);
  112.     }
  113. }

  114. /**************************************
  115. 從DS18B20讀1字節(jié)數(shù)據(jù)
  116. **************************************/
  117. uchar DS18B20_ReadByte()
  118. {
  119.     uchar i;
  120.     uchar dat = 0;

  121.     for (i=0; i<8; i++)             //8位計數(shù)器
  122.     {
  123.         dat >>= 1;
  124.         DQ = 0;                     //開始時間片
  125.         DelayXus(1);                //延時等待
  126.         DQ = 1;                     //準備接收
  127.         DelayXus(1);                //接收延時
  128.         if (DQ) dat |= 0x80;        //讀取數(shù)據(jù)
  129.         DelayXus(60);               //等待時間片結束
  130.     }

  131.     return dat;
  132. }

  133. /**************************************
  134. 向DS18B20寫1字節(jié)數(shù)據(jù)
  135. **************************************/
  136. void DS18B20_WriteByte(uchar dat)
  137. {
  138.     char i;

  139.     for (i=0; i<8; i++)             //8位計數(shù)器
  140.     {
  141.         DQ = 0;                     //開始時間片
  142.         DelayXus(1);                //延時等待
  143.         dat >>= 1;                  //送出數(shù)據(jù)
  144.         DQ = CY;
  145.         DelayXus(60);               //等待時間片結束
  146.         DQ = 1;                     //恢復數(shù)據(jù)線
  147.         DelayXus(1);                //恢復延時
  148.     }
  149. }







  150. unsigned int ReadTemp(void)
  151. {
  152. unsigned char a=0;
  153. unsigned char b=0;


  154.     DS18B20_Reset();                //設備復位
  155.     DS18B20_WriteByte(0xCC);        //跳過ROM命令
  156.     DS18B20_WriteByte(0x44);        //開始轉換命令
  157.     while (!DQ);                    //等待轉換完成

  158.     DS18B20_Reset();                //設備復位
  159.     DS18B20_WriteByte(0xCC);        //跳過ROM命令
  160.     DS18B20_WriteByte(0xBE);        //讀暫存存儲器命令
  161.     a= DS18B20_ReadByte();       //讀溫度低字節(jié)
  162.     b= DS18B20_ReadByte();       //讀溫度高字節(jié)


  163.   tvalue=b;
  164.   tvalue<<=8;
  165.   tvalue=tvalue|a;
  166.     if(tvalue<0x0fff)
  167.    tflag=0;
  168.     else
  169.    {tvalue=~tvalue+1;
  170.          tflag=1;
  171.    }
  172. //tvalue=tvalue*(0.425);//溫度值擴大10倍,精確到1位小數(shù)
  173. f_temp=tvalue*(0.0625);    // 溫度在寄存器中為12位,分辨率為0.0625
  174. tvalue=f_temp*10+0.5;    //乘以10表示小數(shù)點后面只取1位,加0.5時四舍五入
  175. //f_temp=f_temp+0.05;
  176. //f_temp=tvalue*(0.0625);
  177. //tvalue=f_temp*100+(tvalue>0?0.5:-0.5);


  178.         return(tvalue);
  179.   }


  180. void ds1820disp()//溫度值顯示
  181.         { uchar flagdat;
  182.           disdata[0]=tvalue/1000+0x30;//百位數(shù)
  183.      disdata[1]=tvalue%1000/100+0x30;//十位數(shù)
  184.      disdata[2]=tvalue%100/10+0x30;//個位數(shù)
  185.      disdata[3]=tvalue%10+0x30;//小數(shù)位
  186.    
  187.      if(tflag==0)
  188.             flagdat=0x20;//正溫度不顯示符號
  189.      else
  190.        flagdat=0x2d;//負溫度顯示負號:-

  191.      if(disdata[0]==0x30)
  192.            {disdata[0]=0x20;//如果百位為0,不顯示
  193.                  if(disdata[1]==0x30)
  194.                   {disdata[1]=0x20;//如果百位為0,十位為0也不顯示
  195.                   }
  196.                 }


  197.            write_com(0x80+0x44);            //1100 0000B,設置為2行顯示,寫入第二行字符的地址,第而行地址是40-67
  198.            write_date(flagdat);//顯示符號位
  199.            write_com(0x80+0x45);
  200.            write_date(disdata[0]);//顯示百位
  201.            write_com(0x80+0x46);
  202.            write_date(disdata[1]);//顯示十位         
  203.            write_com(0x80+0x47);
  204.            write_date(disdata[2]);//顯示個位         
  205.            write_com(0x80+0x48);
  206.            write_date(0x2e);//顯示小數(shù)點         
  207.            write_com(0x80+0x49);
  208.            write_date(disdata[3]);//顯示小數(shù)位
  209.            write_com(0x80+0x4a);
  210.            write_date('C');
  211.    }



  212. void main()
  213. {        
  214.         init();

  215.         ReadTemp();//讀取溫度
  216.         ds1820disp();//顯示
  217.         while(1)
  218.         {

  219.          ReadTemp();//讀取溫度
  220.          ds1820disp();//顯示

  221.         }

  222. }
復制代碼

所有資料51hei提供下載:
http://www.zg4o1577.cn/bbs/dpj-142615-1.html


回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情精品久久久久久 | 亚洲国产伊人 | 久久精品aaa| 成人在线不卡 | 亚洲成人精品一区 | 欧美激情一区二区三级高清视频 | 亚洲视频一区二区三区 | 婷婷激情综合 | 亚洲精品一区在线观看 | 欧美精品在欧美一区二区少妇 | 美女逼网站 | 欧美午夜在线 | 欧产日产国产精品视频 | a视频在线 | 黄色网络在线观看 | 国产伦精品一区二区三区精品视频 | 国产激情视频在线观看 | 91免费看片 | 午夜精品视频一区 | 日韩激情在线 | 天天射夜夜操 | 日韩电影免费在线观看中文字幕 | 精品成人免费一区二区在线播放 | 日韩精品一区二区三区在线 | 北条麻妃99精品青青久久 | 国产精品毛片无码 | www.99re| 欧美精品一区二区三区蜜桃视频 | 国产成人一区二区三区久久久 | 日韩第一页 | 中文字幕伊人 | 亚洲欧美日韩中文字幕一区二区三区 | 亚洲精品小视频在线观看 | 欧美三级电影在线播放 | 欧美一区二区三区日韩 | 色视频在线免费观看 | 亚洲欧美国产精品一区二区 | 日韩精品一区二区三区 | 91av免费看| 精品一区二区av | 欧美一区永久视频免费观看 |