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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2493|回復: 1
收起左側

單片機數碼管溫度計

[復制鏈接]
ID:353873 發表于 2018-6-18 21:31 | 顯示全部樓層 |閱讀模式
四位共陰數碼管引腳排列.pdf.jpg QQ截圖20180527190050.jpg
  1. /*一、主要功能:
  2. (1)1路溫度采集電路.
  3. (2)采集測溫范圍為-55~+120 ℃.
  4. (3)溫度精度在0.1 ℃;誤差±0.2℃以內.
  5. (4)顯示模塊,采用4個LED數碼管顯示.
  6. (5)按鍵3個,設置、加、減.
  7. (6)報警設置1-99度.低于下限報警,高于上限報警。
  8. */
  9. #include<reg51.h>
  10. #include<intrins.h>
  11. #define uint unsigned int
  12. #define uchar unsigned char
  13. //-----------------------
  14. sbit S1=P1^0;     //設置 上下限
  15. sbit S2=P1^1;      //加
  16. sbit S3=P1^2;     //減
  17. sbit SEG1=P2^0;      //段碼位1
  18. sbit SEG2=P2^2;      //段碼位2  
  19. sbit SEG3=P2^4;      //段碼位3
  20. sbit SEG4=P2^6;      //段碼位4
  21. sbit DQ1=P1^7;       //傳感器1
  22. sbit LED1=P3^0;     //報警顯示燈
  23. sbit BUZ=P3^1;     //蜂鳴器
  24. uchar DQ1_SET[2];      //DQ1上下限設置     DQ1_SET[0] 下限 DQ1_SET[1] 上限;
  25. uchar Temp;       //溫度報警
  26. uchar count;      //蜂鳴器定時用
  27. uchar mode;       //mode=1正常顯示 mode=2 設置下限模式 mode=3設置上限  
  28. //////////////////////////////DS18B20////////////////////////////////////////////////
  29. uchar  ng;  //負號標志
  30. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x58,0x00};//共陰數碼碼表
  31.                  /* 0    1    2   3    4    5    6    7    8    9     C   無*/

  32. uchar code df_Table[]=   
  33. {
  34.   0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
  35. }; //溫度小數位對照表
  36. uchar CurrentT = 0;             //當前讀取的溫度整數部分
  37. uchar Temp_Value[]={0x00,0x00}; //從DS18B20讀取的溫度值
  38. uchar Display_Digit[]={0,0,0,0};//待顯示的各溫度數位
  39. bit DS18B20_IS_OK = 1;          //傳感器正常
  40. ////////////////////////////////DS18B20///////////////////////////////////////////////
  41. //************************************************************************/
  42. // 函數: LCD_Delay()
  43. // 描述: 延時t ms函數
  44. // 參數: t
  45. // 返回: 無
  46. // 備注: 12MHZ       t=1延時時間約1ms
  47. //************************************************************************/
  48. void Delay_ms(unsigned int t)
  49. {
  50. unsigned int i,j;
  51. for(i=0;i<t;i++)
  52. for(j=0;j<120;j++)
  53. ;
  54. }
  55. //************************************************************************/
  56. // 函數: LCD_Delay()
  57. // 描述: 延時x us函數
  58. // 參數: t
  59. // 返回: 無
  60. // 備注: 12MHZ       延時時間約us
  61. //************************************************************************/
  62. void Delay(uint x)
  63. {
  64.   while(--x);
  65. }
  66. //************************************************************************/
  67. // 函數: Init_DS18B20()
  68. // 描述: 初始化DS18B20
  69. // 參數: t
  70. // 返回: 無
  71. // 備注: 12MHZ      
  72. //************************************************************************/
  73. //初始化DS18B20
  74. /*DS18B20的復位脈沖 主機通過拉低單總線至少480us以產生復位脈沖
  75.   然后主機釋放單總線并進入接收模式 此時單總線電平被拉高
  76.   DS18B20檢測到上升沿后 延時15~60us,拉低總線60~240us產生應答脈沖  */      
  77. uchar Init_DS18B20(void)
  78. {
  79.   uchar status;
  80.   DQ1 = 1;     //DS18B20置高電平
  81. Delay(8);    //延時
  82. DQ1 = 0;  //DS18B20置低電平
  83. Delay(90);  //延時480us以上
  84. DQ1 = 1;  //DS18B20置高電平
  85. Delay(8);    //延時
  86. status = DQ1;//讀狀態
  87. Delay(100);  //延時
  88. DQ1 = 1;  //DS18B20置高電平
  89. return status;//返回狀態
  90. }
  91. //************************************************************************/
  92. // 函數: Init_DS18B20()
  93. // 描述: 讀一個字節
  94. // 參數: t
  95. // 返回: 無
  96. // 備注: 12MHZ      
  97. //************************************************************************/
  98. /*寫時隙 主機在寫1時隙向DS18B20寫入1,在寫0時隙向DS18B20寫入0
  99.   所有寫時隙至少需要60us,且在兩次寫時隙之間至少需要1us的恢復時間
  100.   兩種寫時隙均以主機拉低總線開始
  101.   產生寫1時隙:主機拉低總線后,必須在15us內釋放總線,由上拉電阻拉回至高電平
  102.   產生寫0時隙:主機拉低總線后,必須整個時隙保持低電平 */
  103. uchar ReadOneByte()
  104. {
  105.   uchar i,dat=0;
  106. DQ1 = 1;//DS18B20置高電平
  107. _nop_();//延時
  108. for(i=0;i<8;i++)
  109. {
  110.    DQ1 = 0;//DS18B20置低電平
  111.   dat >>= 1;//右移數據
  112.   DQ1 = 1;//DS18B20置高電平
  113.   _nop_();//延時
  114.   _nop_();//延時
  115.   if(DQ1)
  116.   dat |= 0X80;
  117.   Delay(30);//延時
  118.   DQ1 = 1;//DS18B20置高電平
  119. }
  120. return (dat);
  121. }
  122. //************************************************************************/
  123. // 函數:  WriteOneByte(uchar dat)
  124. // 描述: 寫一個字節
  125. // 參數: t
  126. // 返回: 無
  127. // 備注: 12MHZ      
  128. //************************************************************************/
  129. /*所有讀時隙至少60us 且兩次獨立的讀時隙之間至少需要1us的恢復時間
  130.   每次讀時隙由主機發起,拉低總線至少1us。
  131.   若傳1,則保持總線高電平;若發送0,則拉低總線
  132.   傳0時DS18B20在該時隙結束時釋放總線,再拉回高電平狀態,主機必須在讀時隙開始后的15us內釋放總線,并保持采樣總線狀態 */
  133. void WriteOneByte(uchar dat)
  134. {
  135.   uchar i;
  136. for(i=0;i<8;i++)
  137. {  DQ1 = 0;  //DS18B20置低電平
  138.   DQ1 = dat& 0x01;
  139.   Delay(5);  //延時
  140.   DQ1 = 1;  //DS18B20置高電平
  141.   dat >>= 1;      //右移數據
  142. }
  143. }
  144. //************************************************************************/
  145. // 函數: Read_Temperature()
  146. // 描述: 讀溫度值
  147. // 參數: t
  148. // 返回: 無
  149. // 備注: 12MHZ      
  150. //************************************************************************/
  151. void Read_Temperature()
  152. {   EA=0;     //關中斷
  153.   if(Init_DS18B20()==1)
  154.   DS18B20_IS_OK=0;
  155. else
  156. {   
  157.   WriteOneByte(0xcc);  //跳過序列號
  158.   WriteOneByte(0x44); //啟動溫度轉換
  159.   Init_DS18B20();
  160.   WriteOneByte(0xcc);//跳過序列號
  161.   WriteOneByte(0xbe);//讀取溫度寄存器
  162.   Temp_Value[0] = ReadOneByte(); //溫度低8位
  163.   Temp_Value[1] = ReadOneByte();//溫度高8位
  164.   DS18B20_IS_OK=1;

  165. }
  166. EA=1;    // 開中斷
  167. }
  168. //************************************************************************/
  169. // 函數: Display_Temperature()
  170. // 描述: 處理溫度值
  171. // 參數: t
  172. // 返回: 無
  173. // 備注: 12MHZ      
  174. //************************************************************************/
  175. void Display_Temperature()
  176. {
  177. uchar t = 150;     //,延時
  178.     ng = 0;       //與負值標志
  179. if((Temp_Value[1]&0xf8)==0xf8)  //溫度為負?
  180. {
  181.   Temp_Value[1] = ~Temp_Value[1];
  182.   Temp_Value[0] = ~Temp_Value[0]+1;
  183.   if(Temp_Value[0]==0x00)
  184.    Temp_Value[1]++;
  185.   ng = 1;      //負溫度標志
  186. }
  187. else{ng = 0;}
  188. Display_Digit[0] = df_Table[Temp_Value[0]&0x0f]; //查表得溫度小數部分
  189. CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4); //溫度整數部分
  190. Display_Digit[3] = CurrentT/100;    //百
  191. Display_Digit[2] = CurrentT%100/10; //十
  192. Display_Digit[1] = CurrentT%10;     //個
  193. Temp=CurrentT ;    //報警溫度
  194. if(ng == 1){Temp=0;}//當溫度為負時,報警判斷溫度寄存器為0
  195. }
  196. //************************************************************************/
  197. // 函數: DIS_SEG(void)
  198. // 描述: 在LED上顯示數據
  199. // 參數: t
  200. // 返回: 無
  201. // 備注: 12MHZ     
  202. //************************************************************************/
  203. void DIS_SEG(void)  
  204. {
  205.    if(ng==1){P0=0x40;}else{P0=tab[Display_Digit[3]];}   // 數碼管顯示負數 或正的百位
  206.    SEG1=0;      //片選數碼管   
  207.    Delay_ms(3);    //延時2ms
  208.             SEG1=1;   //關閉數碼管
  209.    P0=tab[Display_Digit[2]];    //溫度十位     
  210.    SEG2=0;   //片選數碼管   
  211.    Delay_ms(3);    //延時2ms
  212.             SEG2=1;   //關閉數碼管
  213.    P0=(tab[Display_Digit[1]]+0x80); //溫度個位和小數點
  214.    SEG3=0;   //片選數碼管   
  215.    Delay_ms(3);    //延時2ms
  216.             SEG3=1;   //關閉數碼管
  217.       P0=tab[Display_Digit[0]];  //小數位
  218.    SEG4=0;   //片選數碼管   
  219.    Delay_ms(3);    //延時2ms
  220.             SEG4=1;   //關閉數碼管
  221. }
  222. //************************************************************************/
  223. // 函數: DIS_SET_SEG(void)
  224. // 描述: 在LED上顯示數據
  225. // 參數: t
  226. // 返回: 無
  227. // 備注: 12MHZ      
  228. //************************************************************************/
  229. void DIS_SET_SEG(void)
  230. {
  231.    P0=tab[Display_Digit[3]];// 數碼管顯示負數 或正的百位
  232.    SEG1=0;       //片選數碼管        
  233.    Delay_ms(3);    //延時2ms
  234.             SEG1=1;   //關閉數碼管
  235.    P0=tab[Display_Digit[2]];//溫度十位     
  236.    SEG2=0;   //片選數碼管   
  237.    Delay_ms(3);    //延時2ms
  238.             SEG2=1;   //關閉數碼管
  239.    P0=tab[Display_Digit[1]];//溫度個位
  240.    SEG3=0;   //片選數碼管   
  241.    Delay_ms(3);    //延時2ms
  242.             SEG3=1;   //關閉數碼管
  243.       P0=tab[Display_Digit[0]];//小數位
  244.    SEG4=0;   //片選數碼管   
  245.    Delay_ms(3);    //延時2ms
  246.             SEG4=1;   //關閉數碼管
  247. }
  248. //************************************************************************/
  249. // 函數: DIS_UP(void)   
  250. // 描述: 下限設置顯示
  251. // 參數: t
  252. // 返回: 無
  253. // 備注: 12MHZ      
  254. //************************************************************************/
  255. void DIS_UP(void)   
  256. {
  257.     Display_Digit[3]=DQ1_SET[0]%100/10;  //處理顯示溫度
  258. Display_Digit[2]=DQ1_SET[0]%10;   
  259.     Display_Digit[1] =11;   //顯示空白
  260. Display_Digit[0] =11;   //顯示空白
  261. }
  262. //************************************************************************/
  263. // 函數: DIS_DOWN(void)  
  264. // 描述: 上限設置顯示
  265. // 參數: t
  266. // 返回: 無
  267. // 備注: 12MHZ      
  268. //************************************************************************/
  269. void DIS_DOWN(void)   
  270. {
  271. Display_Digit[3] = 11; //顯示空白
  272. Display_Digit[2] = 11; //顯示空白
  273.     Display_Digit[1]=DQ1_SET[1]%100/10;    //處理顯示溫度
  274.     Display_Digit[0]=DQ1_SET[1]%10;      

  275. }
  276. //----------------------------鍵盤掃描-------------------------------------------
  277. //************************************************************************/
  278. // 函數: void S2_ADD(void)
  279. // 描述: 加按鍵操作函數
  280. // 參數: t
  281. // 返回: 無
  282. // 備注: 12MHZ     
  283. //************************************************************************/
  284. void S2_ADD(void)
  285. {  if(mode==2)   //下限模式
  286. {
  287.          DQ1_SET[0]++; if(DQ1_SET[0]>99){DQ1_SET[0]=99;}    //加下限 和限值下限最大值
  288. }
  289. if(mode==3)//上限模式
  290. {   
  291.      DQ1_SET[1]++; if(DQ1_SET[1]>99){DQ1_SET[1]=99;}  //加上限 和限值下限最大值
  292. }
  293. }
  294. //************************************************************************/
  295. // 函數: S3_SUB(void)
  296. // 描述: 減按鍵操作
  297. // 參數: t
  298. // 返回: 無
  299. // 備注: 12MHZ      
  300. //************************************************************************/
  301. void S3_SUB(void)
  302. {  if(mode==2)   //下限模式
  303. {
  304.    DQ1_SET[0]--; if(DQ1_SET[0]<1){DQ1_SET[0]=1;}   //加下限 和限值下限最大值
  305. }
  306. if(mode==3)//上限模式
  307. {
  308.            DQ1_SET[1]--; if(DQ1_SET[1]<1){DQ1_SET[1]=1;}   //加上限 和限值下限最大值
  309. }
  310. }
  311. //************************************************************************/
  312. // 函數: KEY_SCAN(void)
  313. // 描述: 鍵盤掃描
  314. // 參數: t
  315. // 返回: 無
  316. // 備注: 12MHZ      
  317. //************************************************************************/
  318. void KEY_SCAN(void)         
  319. {    if(S1==0)
  320. {
  321.   Delay_ms(10);   //延時去抖動
  322.   mode++;
  323.   if(mode>3){mode=1;}    //在1 2 3中切換
  324.    while(!S1){;}       //等待按鍵釋放
  325. }  
  326.      if(S2==0)
  327. {
  328.   Delay_ms(10);   //延時去抖動
  329.         S2_ADD();
  330.    while(!S2){;}       //等待按鍵釋放
  331. }
  332.    if(S3==0)
  333. {
  334.   Delay_ms(10);   //延時去抖動
  335.         S3_SUB();
  336.   while(!S3){;}       //等待按鍵釋放
  337. }
  338. // 通道切換
  339. }
  340. //----------------------------鍵盤掃描-------------------------------------------
  341. //************************************************************************/
  342. // 函數: init(void)  
  343. // 描述: 初始化定時器蜂鳴器報警用
  344. // 參數: t
  345. // 返回: 無
  346. // 備注: 12MHZ      
  347. //************************************************************************/
  348. void init(void)     //定時器初始化
  349. {
  350. TMOD=0x01;
  351. TH0=(65536-50000)/256;
  352. TL0=(65536-50000)%256;
  353. EA=1;    //開中斷
  354. ET0=1;   //
  355. TR0=0;   //
  356. BUZ=1;  //關蜂鳴器
  357. }
  358. //************************************************************************/
  359. // 函數: main(void)
  360. // 描述: 主程序
  361. // 參數: t
  362. // 返回: 無
  363. // 備注:
  364. //************************************************************************/

  365. void main(void)
  366. {  uchar i;
  367. //--------超溫初始---------------
  368. DQ1_SET[0]=10;       //DQ1下限10   
  369. DQ1_SET[1]=90;       //DQ1上限90  
  370. //-----------------------
  371. init();           //初始化蜂鳴器
  372.       
  373.     Read_Temperature(); //初始化DQ1
  374.     Delay_ms(1000);    //延時1s
  375. Read_Temperature();   //讀溫度
  376. //------------------------------------
  377.    Read_Temperature();       //讀溫度
  378.   if(DS18B20_IS_OK)         
  379.    Display_Temperature();  //顯示溫度處理
  380. //------------------------------------
  381. mode=1; //mode=1 正常模式
  382. while(1)
  383. {  if(mode==1){//模式1
  384.      //--------------鍵盤掃描-------------------------
  385.   KEY_SCAN();
  386.   //------------在SEG上顯示溫度--------------------
  387.   DIS_SEG();
  388.   //--------------------溫度-----------------------
  389.      i++;
  390.      if(i>88) //避免頻繁采集溫度
  391.     {  Read_Temperature();  //讀溫度
  392.        if(DS18B20_IS_OK){Display_Temperature();}  //溫度數據處理
  393.     i=0;
  394.     }
  395. //-----------------------超溫報警-----------------------------
  396. while(1)
  397. {
  398.   if(Temp<DQ1_SET[0]){LED1=0;TR0=1;break;}else{ if(Temp>DQ1_SET[1]){LED1=0;TR0=1;break;}else{LED1=1;BUZ=1;TR0=0;}}     
  399.   break; //下限報警  //上限報警
  400. }        
  401.    
  402. //-----------------------超溫報警-----------------------------
  403.      }
  404.   if(mode==2)      //下限設置
  405.    {
  406.     KEY_SCAN();  //鍵盤掃描
  407.    DIS_UP();    //顯示數據處理
  408.       DIS_SET_SEG();  //設置模式下SEG顯示方式
  409.    }
  410.   if(mode==3)   //上限設置
  411.   {
  412.    KEY_SCAN();  //鍵盤掃描
  413.    DIS_DOWN();  //顯示數據處理
  414.          DIS_SET_SEG();  //設置模式下SEG顯示方式
  415.   //--------------------通道顯示------------------------
  416.   }
  417.    }
  418. }
  419. void timer0() interrupt 1 using 1   //蜂鳴器報警聲音
  420. {
  421. TH0=(65536-50000)/256;
  422. TL0=(65536-50000)%256;
  423. count++;
  424. if(count==10)   //約10*50000us 取反1次0.5s
  425. {
  426.   count=0;    //清除計數
  427.   BUZ=~BUZ; //蜂鳴器取反
  428. }
  429. }

復制代碼


shumaguanwenduji.doc

387 KB, 下載次數: 18, 下載積分: 黑幣 -5

評分

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

查看全部評分

回復

使用道具 舉報

ID:297390 發表于 2018-9-25 16:04 | 顯示全部樓層
非常好1
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频精品一区二区三区 | 日本不卡免费新一二三区 | 中文字幕在线第二页 | 91 在线| 亚洲国产精品va在线看黑人 | 日本免费黄色一级片 | 久久久成| 在线成人精品视频 | 在线观看免费黄色片 | 久久久91精品国产一区二区三区 | 日韩精品久久一区二区三区 | 天天操天天摸天天干 | 国产精品视频在线观看 | 一级欧美黄色片 | 成人在线免费视频观看 | 韩国理论电影在线 | 国产精品久久久久久福利一牛影视 | 亚洲网站在线观看 | 日本精品一区二区三区在线观看视频 | 亚洲精品成人在线 | 日韩福利片 | 91色视频在线观看 | 久久黄网| 亚洲精品久久久一区二区三区 | 欧美精品一区二区蜜桃 | 欧美精品久久久 | 91精品国产欧美一区二区 | 欧美一级二级三级视频 | 国产精品一区二区三区在线 | 蜜桃传媒一区二区 | 日韩欧美手机在线 | 操操操av | 天天爽网站 | 亚洲精品二区 | 人操人人| 91久久精品日日躁夜夜躁欧美 | 久久精品久久精品 | 久久久精品视频一区二区三区 | 亚洲久久一区 | 精品国产一区二区在线 | 久久婷婷国产麻豆91 |