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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機兩路測溫 Keil4工程+Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
單片機兩路測溫 Keil4工程+Proteus仿真,有需要的自行下載

Proteus仿真圖:


單片機源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char                        
  3. #define uint unsigned int
  4. uchar i;
  5. char csh=0;
  6. sbit lcdrs=P2^0;
  7. sbit lcdrw=P2^1;
  8. sbit lcden=P2^2;
  9. uchar code t0[]="the temperature ";
  10. uchar code t1[]=" is             ";
  11. uchar code wendu[]="0123456789";        //利用一個溫度表解決溫度顯示亂碼
  12. sbit DQ_1= P3^0;//定義ds18B20總線IO
  13. sbit DQ_2= P3^1;//定義ds18B20總線IO
  14. void delay(uint z);
  15. void write_com(uchar com);
  16. void write_date(unsigned char date);
  17. void init_lcd();
  18. void tmpDelay(int num);//延時函數
  19. void Init_DS18B20();//初始化ds1820
  20. unsigned char ReadOneChar_1();//讀一個字節
  21. void WriteOneChar_1(unsigned char dat);//寫一個字節
  22. unsigned int Readtemp_1();//讀取溫度
  23. unsigned char ReadOneChar_2();//讀一個字節
  24. void WriteOneChar_2(unsigned char dat);//寫一個字節
  25. unsigned int Readtemp_2();//讀取溫度
  26. void display();
  27. void delay(uint z)
  28. {
  29.         uint x,y;
  30.         for(x=100;x>1;x--)
  31.                 for(y=z;y>1;y--);
  32. }

  33. void write_com(uchar com)
  34. {
  35.         lcdrs=0;
  36.         P0=com;       
  37.         delay(5);
  38.         lcden=1;
  39.         delay(5);
  40.         lcden=0;
  41. }
  42. void write_date(unsigned char date)
  43. {
  44.         lcdrs=1;
  45.         P0=date;
  46.         delay(5);
  47.         lcden=1;
  48.         delay(5);
  49.         lcden=0;
  50. }
  51. void init_lcd()
  52. {
  53.         lcden=0;
  54.         lcdrw=0;
  55.         write_com(0x38);
  56.         write_com(0x01);
  57.         write_com(0x0c);
  58.         write_com(0x06);
  59.         write_com(0x80);       
  60.         for(i=0;i<16;i++)
  61.                 {
  62.                         write_date(t0[i]);
  63.                         delay(0);
  64.                 }
  65.         write_com(0x80+0x40);
  66.         for(i=0;i<16;i++)
  67.                 {
  68.                         write_date(t1[i]);
  69.                         delay(0);
  70.                 }
  71. }

  72. //溫度采集模塊
  73. void tmpDelay(int num)//延時函數
  74. {
  75.         while(num--) ;
  76. }       
  77. /******************************************************************************/
  78. void Init_DS18B20()//初始化ds1820
  79. {
  80.         unsigned char x1=0;
  81.         unsigned char x2=0;
  82.         DQ_1 = 1;    //DQ復位
  83.         tmpDelay(8);  //稍做延時
  84.         DQ_1 = 0;    //單片機將DQ拉低
  85.         tmpDelay(80); //精確延時 大于 480us
  86.         DQ_1 = 1;    //拉高總線
  87.         tmpDelay(14);
  88.         x1=DQ_1;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  89.         tmpDelay(20);

  90.         ///////////////////////////////////////////
  91.        
  92.         DQ_2 = 1;    //DQ復位
  93.         tmpDelay(8);  //稍做延時
  94.         DQ_2 = 0;    //單片機將DQ拉低
  95.         tmpDelay(80); //精確延時 大于 480us
  96.         DQ_2 = 1;    //拉高總線
  97.         tmpDelay(14);
  98.         x2=DQ_2;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  99.         tmpDelay(20);
  100. }
  101. unsigned char ReadOneChar_1()//讀一個字節
  102. {
  103.         unsigned char i=0;
  104.         unsigned char dat_1 = 0;
  105.         for (i=8;i>0;i--)
  106.         {
  107.                 DQ_1 = 0; // 給脈沖信號
  108.                 dat_1>>=1;
  109.                 DQ_1 = 1; // 給脈沖信號
  110.                 if(DQ_1)
  111.                 dat_1|=0x80;
  112.                 tmpDelay(4);
  113.         }
  114.         return(dat_1);
  115. }
  116. unsigned char ReadOneChar_2()//讀一個字節
  117. {
  118.         unsigned char i=0;
  119.         unsigned char dat_2 = 0;
  120.         for (i=8;i>0;i--)
  121.         {
  122.                 DQ_2 = 0; // 給脈沖信號
  123.                 dat_2>>=1;
  124.                 DQ_2 = 1; // 給脈沖信號
  125.                 if(DQ_2)
  126.                 dat_2|=0x80;
  127.                 tmpDelay(4);
  128.         }
  129.         return(dat_2);
  130. }



  131. void WriteOneChar_1(unsigned char dat_1)//寫一個字節
  132. {
  133.         unsigned char i=0;
  134.         for (i=8; i>0; i--)
  135.         {
  136.                 DQ_1= 0;
  137.                 DQ_1= dat_1&0x01;
  138.                 tmpDelay(5);
  139.                 DQ_1= 1;
  140.                 dat_1>>=1;
  141.         }
  142. }

  143. void WriteOneChar_2(unsigned char dat_2)//寫一個字節
  144. {
  145.         unsigned char i=0;
  146.         for (i=8; i>0; i--)
  147.         {
  148.                 DQ_2= 0;
  149.                 DQ_2= dat_2&0x01;
  150.                 tmpDelay(5);
  151.                 DQ_2= 1;
  152.                 dat_2>>=1;
  153.         }
  154. }

  155. unsigned int Readtemp_1()//讀取溫度
  156. {
  157.         unsigned char a=0;
  158.         unsigned char b=0;
  159.         unsigned int t=0;
  160.         float tt=0;       
  161.         Init_DS18B20();
  162.         WriteOneChar_1(0xCC); // 跳過讀序號列號的操作
  163.         WriteOneChar_1(0x44); // 啟動溫度轉換
  164.         Init_DS18B20();
  165.         WriteOneChar_1(0xCC); //跳過讀序號列號的操作
  166.         WriteOneChar_1(0xBE); //讀取溫度寄存器
  167.         a=ReadOneChar_1();   //連續讀兩個字節數據   //讀低8位
  168.         b=ReadOneChar_1();                          //讀高8位
  169.         t=b;
  170.         t<<=8;
  171.         t=t|a; //兩字節合成一個整型變量。
  172.         tt=t*0.0625;  //得到真實十進制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度
  173.         t= tt*10+0.5; //放大十倍,這樣做的目的將小數點后第一位也轉換為可顯示數字,同時進行一個四舍五入操作。
  174.         return(t);
  175. }

  176. unsigned int Readtemp_2()//讀取溫度
  177. {
  178.         unsigned char a=0;
  179.         unsigned char b=0;
  180.         unsigned int t=0;
  181.         float tt=0;       
  182.         Init_DS18B20();
  183.         WriteOneChar_2(0xCC); // 跳過讀序號列號的操作
  184.         WriteOneChar_2(0x44); // 啟動溫度轉換
  185.         Init_DS18B20();
  186.         WriteOneChar_2(0xCC); //跳過讀序號列號的操作
  187.         WriteOneChar_2(0xBE); //讀取溫度寄存器
  188.         a=ReadOneChar_2();   //連續讀兩個字節數據   //讀低8位
  189.         b=ReadOneChar_2();                          //讀高8位
  190.         t=b;
  191.         t<<=8;
  192.         t=t|a; //兩字節合成一個整型變量。
  193.         tt=t*0.0625;  //得到真實十進制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度
  194.         t= tt*10+0.5; //放大十倍,這樣做的目的將小數點后第一位也轉換為可顯示數字,同時進行一個四舍五入操作。
  195.         return(t);
  196. }

  197. void display()
  198. {
  199.         unsigned int num;                   //定義的時候用uchar宏定義就會出錯
  200.         unsigned int shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數來表示,用unshigned char  字符型則顯示錯誤
  201.         num=Readtemp_1();
  202.         if(csh<=8){num=0;csh++;}
  203.         shi=num/100;
  204.         ge=num/10%10;
  205.         xiaoshu=num%10;

  206.     write_com(0x80+0x40+5);
  207.         write_date(wendu[shi]);

  208.         write_com(0x80+0x40+6);
  209.         write_date(wendu[ge]);

  210.         write_com(0x80+0x40+7);
  211.         write_date(0x2e);

  212.         write_com(0x80+0x40+8);
  213.         write_date(wendu[xiaoshu]);

  214. /////////////////////////////////////////////////////

  215.         num=Readtemp_2();
  216.         if(csh<=8){num=0;csh++;}
  217.         shi=num/100;
  218.         ge=num/10%10;
  219.         xiaoshu=num%10;

  220.     write_com(0x80+0x40+11);
  221.         write_date(wendu[shi]);

  222.         write_com(0x80+0x40+12);
  223.         write_date(wendu[ge]);

  224.         write_com(0x80+0x40+13);
  225.         write_date(0x2e);

  226.         write_com(0x80+0x40+14);
  227.         write_date(wendu[xiaoshu]);
  228. }
復制代碼

所有資料51hei提供下載:
單片機,兩路測溫.rar (71.52 KB, 下載次數: 32)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:711517 發表于 2020-3-19 15:48 | 只看該作者
有器件名單嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品视频一二区 | 伦理二区| 久久久免费观看视频 | 成人深夜福利 | 成人九色 | 亚洲草草视频 | 亚洲一区二区三区免费视频 | 免费在线观看一区二区三区 | 亚洲欧美日韩国产综合 | 99伊人网| 国产精品久久久久aaaa九色 | 亚洲一二三在线观看 | 懂色av蜜桃av| 日韩中文字幕在线视频 | 自拍偷拍第一页 | 女朋友的闺蜜3韩国三级 | 成人午夜电影网 | 91在线视频免费观看 | 男插女下体视频 | 亚洲欧美一区二区三区在线 | 亚洲综合无码一区二区 | 久久精品亚洲精品国产欧美 | 国产成人免费视频网站高清观看视频 | 午夜专区 | 国产精品一区二区不卡 | 国产亚洲成av人片在线观看桃 | 国产 日韩 欧美 制服 另类 | 久久综合一区二区三区 | 久久精品黄色 | 成人精品久久 | 欧美成人一区二免费视频软件 | 成人午夜精品 | 亚洲一区在线日韩在线深爱 | 欧洲性生活视频 | 365夜爽爽欧美性午夜免费视频 | 国产区精品 | 国产免费观看久久黄av片涩av | 色网在线观看 | 黄色毛片免费视频 | 夜夜草 | 91精品国产色综合久久不卡蜜臀 |