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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2592|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)數(shù)碼管溫度計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
  1. /*一、主要功能:
  2. (1)1路溫度采集電路.
  3. (2)采集測(cè)溫范圍為-55~+120 ℃.
  4. (3)溫度精度在0.1 ℃;誤差±0.2℃以內(nèi).
  5. (4)顯示模塊,采用4個(gè)LED數(shù)碼管顯示.
  6. (5)按鍵3個(gè),設(shè)置、加、減.
  7. (6)報(bào)警設(shè)置1-99度.低于下限報(bào)警,高于上限報(bào)警。
  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;     //設(shè)置 上下限
  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;     //報(bào)警顯示燈
  23. sbit BUZ=P3^1;     //蜂鳴器
  24. uchar DQ1_SET[2];      //DQ1上下限設(shè)置     DQ1_SET[0] 下限 DQ1_SET[1] 上限;
  25. uchar Temp;       //溫度報(bào)警
  26. uchar count;      //蜂鳴器定時(shí)用
  27. uchar mode;       //mode=1正常顯示 mode=2 設(shè)置下限模式 mode=3設(shè)置上限  
  28. //////////////////////////////DS18B20////////////////////////////////////////////////
  29. uchar  ng;  //負(fù)號(hào)標(biāo)志
  30. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x58,0x00};//共陰數(shù)碼碼表
  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. }; //溫度小數(shù)位對(duì)照表
  36. uchar CurrentT = 0;             //當(dāng)前讀取的溫度整數(shù)部分
  37. uchar Temp_Value[]={0x00,0x00}; //從DS18B20讀取的溫度值
  38. uchar Display_Digit[]={0,0,0,0};//待顯示的各溫度數(shù)位
  39. bit DS18B20_IS_OK = 1;          //傳感器正常
  40. ////////////////////////////////DS18B20///////////////////////////////////////////////
  41. //************************************************************************/
  42. // 函數(shù): LCD_Delay()
  43. // 描述: 延時(shí)t ms函數(shù)
  44. // 參數(shù): t
  45. // 返回: 無
  46. // 備注: 12MHZ       t=1延時(shí)時(shí)間約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. // 函數(shù): LCD_Delay()
  57. // 描述: 延時(shí)x us函數(shù)
  58. // 參數(shù): t
  59. // 返回: 無
  60. // 備注: 12MHZ       延時(shí)時(shí)間約us
  61. //************************************************************************/
  62. void Delay(uint x)
  63. {
  64.   while(--x);
  65. }
  66. //************************************************************************/
  67. // 函數(shù): Init_DS18B20()
  68. // 描述: 初始化DS18B20
  69. // 參數(shù): t
  70. // 返回: 無
  71. // 備注: 12MHZ      
  72. //************************************************************************/
  73. //初始化DS18B20
  74. /*DS18B20的復(fù)位脈沖 主機(jī)通過拉低單總線至少480us以產(chǎn)生復(fù)位脈沖
  75.   然后主機(jī)釋放單總線并進(jìn)入接收模式 此時(shí)單總線電平被拉高
  76.   DS18B20檢測(cè)到上升沿后 延時(shí)15~60us,拉低總線60~240us產(chǎn)生應(yīng)答脈沖  */      
  77. uchar Init_DS18B20(void)
  78. {
  79.   uchar status;
  80.   DQ1 = 1;     //DS18B20置高電平
  81. Delay(8);    //延時(shí)
  82. DQ1 = 0;  //DS18B20置低電平
  83. Delay(90);  //延時(shí)480us以上
  84. DQ1 = 1;  //DS18B20置高電平
  85. Delay(8);    //延時(shí)
  86. status = DQ1;//讀狀態(tài)
  87. Delay(100);  //延時(shí)
  88. DQ1 = 1;  //DS18B20置高電平
  89. return status;//返回狀態(tài)
  90. }
  91. //************************************************************************/
  92. // 函數(shù): Init_DS18B20()
  93. // 描述: 讀一個(gè)字節(jié)
  94. // 參數(shù): t
  95. // 返回: 無
  96. // 備注: 12MHZ      
  97. //************************************************************************/
  98. /*寫時(shí)隙 主機(jī)在寫1時(shí)隙向DS18B20寫入1,在寫0時(shí)隙向DS18B20寫入0
  99.   所有寫時(shí)隙至少需要60us,且在兩次寫時(shí)隙之間至少需要1us的恢復(fù)時(shí)間
  100.   兩種寫時(shí)隙均以主機(jī)拉低總線開始
  101.   產(chǎn)生寫1時(shí)隙:主機(jī)拉低總線后,必須在15us內(nèi)釋放總線,由上拉電阻拉回至高電平
  102.   產(chǎn)生寫0時(shí)隙:主機(jī)拉低總線后,必須整個(gè)時(shí)隙保持低電平 */
  103. uchar ReadOneByte()
  104. {
  105.   uchar i,dat=0;
  106. DQ1 = 1;//DS18B20置高電平
  107. _nop_();//延時(shí)
  108. for(i=0;i<8;i++)
  109. {
  110.    DQ1 = 0;//DS18B20置低電平
  111.   dat >>= 1;//右移數(shù)據(jù)
  112.   DQ1 = 1;//DS18B20置高電平
  113.   _nop_();//延時(shí)
  114.   _nop_();//延時(shí)
  115.   if(DQ1)
  116.   dat |= 0X80;
  117.   Delay(30);//延時(shí)
  118.   DQ1 = 1;//DS18B20置高電平
  119. }
  120. return (dat);
  121. }
  122. //************************************************************************/
  123. // 函數(shù):  WriteOneByte(uchar dat)
  124. // 描述: 寫一個(gè)字節(jié)
  125. // 參數(shù): t
  126. // 返回: 無
  127. // 備注: 12MHZ      
  128. //************************************************************************/
  129. /*所有讀時(shí)隙至少60us 且兩次獨(dú)立的讀時(shí)隙之間至少需要1us的恢復(fù)時(shí)間
  130.   每次讀時(shí)隙由主機(jī)發(fā)起,拉低總線至少1us。
  131.   若傳1,則保持總線高電平;若發(fā)送0,則拉低總線
  132.   傳0時(shí)DS18B20在該時(shí)隙結(jié)束時(shí)釋放總線,再拉回高電平狀態(tài),主機(jī)必須在讀時(shí)隙開始后的15us內(nèi)釋放總線,并保持采樣總線狀態(tài) */
  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);  //延時(shí)
  140.   DQ1 = 1;  //DS18B20置高電平
  141.   dat >>= 1;      //右移數(shù)據(jù)
  142. }
  143. }
  144. //************************************************************************/
  145. // 函數(shù): Read_Temperature()
  146. // 描述: 讀溫度值
  147. // 參數(shù): t
  148. // 返回: 無
  149. // 備注: 12MHZ      
  150. //************************************************************************/
  151. void Read_Temperature()
  152. {   EA=0;     //關(guān)中斷
  153.   if(Init_DS18B20()==1)
  154.   DS18B20_IS_OK=0;
  155. else
  156. {   
  157.   WriteOneByte(0xcc);  //跳過序列號(hào)
  158.   WriteOneByte(0x44); //啟動(dòng)溫度轉(zhuǎn)換
  159.   Init_DS18B20();
  160.   WriteOneByte(0xcc);//跳過序列號(hào)
  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. // 函數(shù): Display_Temperature()
  170. // 描述: 處理溫度值
  171. // 參數(shù): t
  172. // 返回: 無
  173. // 備注: 12MHZ      
  174. //************************************************************************/
  175. void Display_Temperature()
  176. {
  177. uchar t = 150;     //,延時(shí)
  178.     ng = 0;       //與負(fù)值標(biāo)志
  179. if((Temp_Value[1]&0xf8)==0xf8)  //溫度為負(fù)?
  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;      //負(fù)溫度標(biāo)志
  186. }
  187. else{ng = 0;}
  188. Display_Digit[0] = df_Table[Temp_Value[0]&0x0f]; //查表得溫度小數(shù)部分
  189. CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4); //溫度整數(shù)部分
  190. Display_Digit[3] = CurrentT/100;    //百
  191. Display_Digit[2] = CurrentT%100/10; //十
  192. Display_Digit[1] = CurrentT%10;     //個(gè)
  193. Temp=CurrentT ;    //報(bào)警溫度
  194. if(ng == 1){Temp=0;}//當(dāng)溫度為負(fù)時(shí),報(bào)警判斷溫度寄存器為0
  195. }
  196. //************************************************************************/
  197. // 函數(shù): DIS_SEG(void)
  198. // 描述: 在LED上顯示數(shù)據(jù)
  199. // 參數(shù): t
  200. // 返回: 無
  201. // 備注: 12MHZ     
  202. //************************************************************************/
  203. void DIS_SEG(void)  
  204. {
  205.    if(ng==1){P0=0x40;}else{P0=tab[Display_Digit[3]];}   // 數(shù)碼管顯示負(fù)數(shù) 或正的百位
  206.    SEG1=0;      //片選數(shù)碼管   
  207.    Delay_ms(3);    //延時(shí)2ms
  208.             SEG1=1;   //關(guān)閉數(shù)碼管
  209.    P0=tab[Display_Digit[2]];    //溫度十位     
  210.    SEG2=0;   //片選數(shù)碼管   
  211.    Delay_ms(3);    //延時(shí)2ms
  212.             SEG2=1;   //關(guān)閉數(shù)碼管
  213.    P0=(tab[Display_Digit[1]]+0x80); //溫度個(gè)位和小數(shù)點(diǎn)
  214.    SEG3=0;   //片選數(shù)碼管   
  215.    Delay_ms(3);    //延時(shí)2ms
  216.             SEG3=1;   //關(guān)閉數(shù)碼管
  217.       P0=tab[Display_Digit[0]];  //小數(shù)位
  218.    SEG4=0;   //片選數(shù)碼管   
  219.    Delay_ms(3);    //延時(shí)2ms
  220.             SEG4=1;   //關(guān)閉數(shù)碼管
  221. }
  222. //************************************************************************/
  223. // 函數(shù): DIS_SET_SEG(void)
  224. // 描述: 在LED上顯示數(shù)據(jù)
  225. // 參數(shù): t
  226. // 返回: 無
  227. // 備注: 12MHZ      
  228. //************************************************************************/
  229. void DIS_SET_SEG(void)
  230. {
  231.    P0=tab[Display_Digit[3]];// 數(shù)碼管顯示負(fù)數(shù) 或正的百位
  232.    SEG1=0;       //片選數(shù)碼管        
  233.    Delay_ms(3);    //延時(shí)2ms
  234.             SEG1=1;   //關(guān)閉數(shù)碼管
  235.    P0=tab[Display_Digit[2]];//溫度十位     
  236.    SEG2=0;   //片選數(shù)碼管   
  237.    Delay_ms(3);    //延時(shí)2ms
  238.             SEG2=1;   //關(guān)閉數(shù)碼管
  239.    P0=tab[Display_Digit[1]];//溫度個(gè)位
  240.    SEG3=0;   //片選數(shù)碼管   
  241.    Delay_ms(3);    //延時(shí)2ms
  242.             SEG3=1;   //關(guān)閉數(shù)碼管
  243.       P0=tab[Display_Digit[0]];//小數(shù)位
  244.    SEG4=0;   //片選數(shù)碼管   
  245.    Delay_ms(3);    //延時(shí)2ms
  246.             SEG4=1;   //關(guān)閉數(shù)碼管
  247. }
  248. //************************************************************************/
  249. // 函數(shù): DIS_UP(void)   
  250. // 描述: 下限設(shè)置顯示
  251. // 參數(shù): 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. // 函數(shù): DIS_DOWN(void)  
  264. // 描述: 上限設(shè)置顯示
  265. // 參數(shù): 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. // 函數(shù): void S2_ADD(void)
  279. // 描述: 加按鍵操作函數(shù)
  280. // 參數(shù): 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. // 函數(shù): S3_SUB(void)
  296. // 描述: 減按鍵操作
  297. // 參數(shù): 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. // 函數(shù): KEY_SCAN(void)
  313. // 描述: 鍵盤掃描
  314. // 參數(shù): t
  315. // 返回: 無
  316. // 備注: 12MHZ      
  317. //************************************************************************/
  318. void KEY_SCAN(void)         
  319. {    if(S1==0)
  320. {
  321.   Delay_ms(10);   //延時(shí)去抖動(dòng)
  322.   mode++;
  323.   if(mode>3){mode=1;}    //在1 2 3中切換
  324.    while(!S1){;}       //等待按鍵釋放
  325. }  
  326.      if(S2==0)
  327. {
  328.   Delay_ms(10);   //延時(shí)去抖動(dòng)
  329.         S2_ADD();
  330.    while(!S2){;}       //等待按鍵釋放
  331. }
  332.    if(S3==0)
  333. {
  334.   Delay_ms(10);   //延時(shí)去抖動(dòng)
  335.         S3_SUB();
  336.   while(!S3){;}       //等待按鍵釋放
  337. }
  338. // 通道切換
  339. }
  340. //----------------------------鍵盤掃描-------------------------------------------
  341. //************************************************************************/
  342. // 函數(shù): init(void)  
  343. // 描述: 初始化定時(shí)器蜂鳴器報(bào)警用
  344. // 參數(shù): t
  345. // 返回: 無
  346. // 備注: 12MHZ      
  347. //************************************************************************/
  348. void init(void)     //定時(shí)器初始化
  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;  //關(guān)蜂鳴器
  357. }
  358. //************************************************************************/
  359. // 函數(shù): main(void)
  360. // 描述: 主程序
  361. // 參數(shù): 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);    //延時(shí)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();}  //溫度數(shù)據(jù)處理
  393.     i=0;
  394.     }
  395. //-----------------------超溫報(bào)警-----------------------------
  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; //下限報(bào)警  //上限報(bào)警
  400. }        
  401.    
  402. //-----------------------超溫報(bào)警-----------------------------
  403.      }
  404.   if(mode==2)      //下限設(shè)置
  405.    {
  406.     KEY_SCAN();  //鍵盤掃描
  407.    DIS_UP();    //顯示數(shù)據(jù)處理
  408.       DIS_SET_SEG();  //設(shè)置模式下SEG顯示方式
  409.    }
  410.   if(mode==3)   //上限設(shè)置
  411.   {
  412.    KEY_SCAN();  //鍵盤掃描
  413.    DIS_DOWN();  //顯示數(shù)據(jù)處理
  414.          DIS_SET_SEG();  //設(shè)置模式下SEG顯示方式
  415.   //--------------------通道顯示------------------------
  416.   }
  417.    }
  418. }
  419. void timer0() interrupt 1 using 1   //蜂鳴器報(bào)警聲音
  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;    //清除計(jì)數(shù)
  427.   BUZ=~BUZ; //蜂鳴器取反
  428. }
  429. }

復(fù)制代碼


shumaguanwenduji.doc

387 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:297390 發(fā)表于 2018-9-25 16:04 | 只看該作者
非常好1
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久高清 | 亚洲免费人成在线视频观看 | 亚洲二区在线 | 国产在线播放av | 成人三级av | 国产精品久久久久久久7电影 | 精品久久久久一区二区国产 | 欧美成人精品欧美一级 | 中文字幕中文字幕 | 91文字幕巨乱亚洲香蕉 | 国产高清视频 | 伊人春色成人网 | www.亚洲精品 | 欧美日韩一区二区视频在线观看 | 91精品国产欧美一区二区 | 美女福利视频一区 | 日韩精品视频在线 | 国产91在线 | 欧美 | 亚洲激情av | 一级黄色片一级黄色片 | 一级在线毛片 | 成人在线视频观看 | 国产精品美女 | 日日爱视频 | 亚洲精品综合一区二区 | 久久精品一区 | 日韩在线观看网站 | 成人在线免费av | 国产在线观看一区二区 | 国产综合av | 亚洲精品一区二区 | 国产在线激情视频 | 日韩波多野结衣 | 亚洲iv一区二区三区 | 在线成人精品视频 | 久久久中文 | 亚洲精品乱码久久久久久久久久 | 亚洲欧洲小视频 | 天天曰天天曰 | 成人高清在线视频 | 成人午夜在线 |