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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20測溫度MAX7219數碼管顯示程序與仿真

[復制鏈接]
跳轉到指定樓層
樓主
使用DS18B20測溫度,8個LED數碼管顯示,前兩個數碼管顯示當前溫度,,后兩個數碼管顯示設定溫度

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned  int
  5. sbit din=P1^0;        //MAX7219數據串行輸入端
  6. sbit cs=P1^1;  //MAX7219數據輸入允許端
  7. sbit clk=P1^2;         //MAX7219時鐘信號
  8. sbit DQ=P1^5;         //DS18B20端口DQ
  9. sbit sb=P0^0;
  10. sbit sq=P0^1;
  11. sbit led=P2^0;
  12. uchar dig;
  13. sbit DIN=P0^7;                        //小數點
  14. bit list_flag=0;                //顯示開關標志
  15. uchar code tab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,
  16. 0x70,0x7f,0x7b,0x4E,0x63,0x01,0x00}; //表示不譯方式0~9;0x4E為C;0x63為.;0x01為—;0x00不顯示
  17. uchar data temp_data[2]={0x00,0x00};
  18. unsigned char data display[]={0x00,0x00,0x00,0x00,0x00,0x00};
  19. unsigned char code ditab[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  20. unsigned char x=56;
  21. void Delay(uint ms)                         //延時函數
  22. {
  23. while(ms--);
  24. }
  25. uchar Init_DS18B20(void)                //初始化DS18B20
  26. {
  27. uchar status;                       
  28. DQ=1;                                        //DQ復位
  29. Delay(8);                                //延時片刻
  30. DQ=0;                                                         //單片機將DQ拉低
  31. Delay(90);                                                        //精確延時,大于480us
  32. DQ=1;                                                                //拉低總線
  33. Delay(8);                                                       
  34. status=DQ;                                                        //如果為0,則初始化成功;為1,則初始化失敗
  35. Delay(100);
  36. DQ=1;
  37. return(status);
  38. }
  39. uchar ReadOneByte(void)                           //讀一個字節
  40. {
  41. uchar i=0;
  42. uchar dat=0;
  43. for(i=8;i>0;i--)
  44. {
  45. DQ=0;                                                          //給脈沖信號
  46. dat>>= 1;
  47. DQ=1;                                                           //給脈沖信號
  48. _nop_();
  49. _nop_();
  50. if(DQ)
  51. {
  52. dat|=0x80;
  53. }
  54. Delay(4);
  55. DQ=1;
  56. }
  57. return(dat);
  58. }
  59. void WriteOneByte(uchar dat)                   //寫一個字節
  60. {
  61. uchar i=0;
  62. for(i=8;i>0;i--)
  63. {
  64. DQ=0;
  65. DQ=dat&0x01;
  66. Delay(5);
  67. DQ=1;
  68. dat>>=1;
  69. }
  70. }
  71. void Read_Temperature(void)                                   //讀取溫度
  72. {
  73. if(Init_DS18B20()==1)
  74. {
  75. list_flag=1;                                                          //DS18B20不正常
  76. }
  77. else
  78. {
  79. list_flag=0;
  80. WriteOneByte(0xCC);                                                //跳過讀序號列號的操作
  81. WriteOneByte(0x44);                                                  //啟動溫度轉換
  82. Init_DS18B20();
  83. WriteOneByte(0xCC);                                                 //跳過讀序號列號的操作
  84. WriteOneByte(0xBE);                                                   //讀取溫度寄存器
  85. temp_data[0]=ReadOneByte();                                  //溫度低8位
  86. temp_data[1]=ReadOneByte();                                        //溫度高8位
  87.         }
  88. }
  89. void Temperature_trans()                                 //溫度處理
  90. {
  91. uchar ng=0;
  92. if((temp_data[1]&0xF8)==0xF8)
  93. {
  94. temp_data[1]=~temp_data[1];
  95.   temp_data[0]=~temp_data[0]+1;
  96.   if( temp_data[0]==0x00)
  97.   {
  98.    temp_data[1]++;
  99.   }
  100.   ng=1;
  101. }
  102. display[4]=temp_data[0]&0x0f;
  103. display[0]=ditab[display[4]];                         //查表得小數位的值
  104. display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  105. display[3]=display[4]/100;
  106. display[1]=display[4]%100;
  107. display[2]=display[1]/10;
  108. display[1]=display[1]%10;
  109. display[4]=temp_data[0]&0x0f;
  110. if(ng==1)                                                         //溫度為0度以下時
  111. {
  112. display[5]=12;                                                  //顯示-
  113. }
  114. else
  115. {
  116. display[5]=13;                                                    //不顯示-
  117. }
  118. if(!display[3])                                                   //高位為0,不顯示
  119. {
  120. display[3]=13;
  121. if(!display[2])                                                        //次高位為0,不顯示
  122. display[2]=13;
  123. }
  124. }
  125. void write_7219(uchar add,uchar date)         //add為接受MA7219;date為要寫的數據
  126. {
  127. uchar i;
  128. cs=0;
  129. for(i=0;i<8;i++)
  130. {
  131. clk=0;
  132. din=add&0x80;                                                           //按照高位在前,低位在后的順序發送
  133. add<<=1;                                                                   //先發送地址
  134. clk=1;
  135. }
  136. for (i=0;i<8;i++)                                                   //時鐘上升沿寫入一位
  137. {
  138. clk=0;
  139. din=date&0x80;
  140. date<<=1;                                                                 //再發送數據
  141. clk=1;
  142. }
  143. cs=1;
  144. }
  145. void init_7219()
  146. {
  147. write_7219(0x0c,0x01);                        //0x0c為關斷模式寄存器;0x01表示顯示器處于工作狀態
  148. write_7219(0x0a,0x0f);                   //0x0a為亮度調節寄存器;0x0f表示使數碼管顯示亮度為最亮
  149. write_7219(0x09,0x00);                         //0x09為譯碼模式選擇寄存器;0x00表示非譯碼方式
  150. write_7219(0x0b,0x07);                         //0x0b為掃描限制寄存器;0x07表示8個LED數碼管
  151. }

  152. void disp_Max7219(uchar dig, uchar date) //指定位,顯示某一數
  153. {
  154. write_7219(dig,date);
  155. }
  156. void main()
  157. { EA=1;ET0=1;
  158.         TMOD=0X01;
  159.         TH0=0X3C;
  160.         TL0=0XB0;
  161.         TR0=1;
  162. init_7219();
  163. while(1)
  164. {
  165. Temperature_trans();
  166. ……………………

  167. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
溫度.zip (108.47 KB, 下載次數: 84)




評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:266106 發表于 2017-12-27 07:53 | 只看該作者
學習了!謝謝分享
回復

使用道具 舉報

板凳
ID:501776 發表于 2019-4-13 11:27 | 只看該作者
感謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕av亚洲精品一部二部 | 91视频国产精品 | 欧美日韩精品在线免费观看 | 亚洲精品久久久久久宅男 | 亚洲一区二区av | 亚洲 欧美 日韩 在线 | 欧美一区二区三区的 | 午夜看电影在线观看 | 91精品国产综合久久香蕉麻豆 | 日韩欧美在线一区二区 | 不卡一区| 国产在线视频三区 | 91麻豆精品国产91久久久久久久久 | 久久久久久精 | 国产精品亚洲综合 | 亚洲成色777777在线观看影院 | 国产精品一区在线观看 | 日本三级电影免费观看 | 精品免费国产视频 | 91精品久久久久久久 | 天天爽天天操 | 久久午夜电影 | 欧美中文字幕 | 亚洲有码转帖 | 天天色天天| 精品一区二区在线观看 | 狠狠躁夜夜躁人人爽天天高潮 | 殴美成人在线视频 | 日本电影一区二区 | 激情的网站| 国产精品一区一区 | 日韩三级在线观看 | av午夜电影 | 在线播放中文 | 毛片一区二区三区 | 日韩在线精品视频 | 亚洲国产精久久久久久久 | 精品一区二区三区不卡 | 久久一级免费视频 | 免费看黄色片 | 中文字幕精品一区久久久久 |