亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC89C52RC借用51黑程序點亮4按鍵TM1650

[復制鏈接]
ID:673920 發表于 2026-4-18 22:04 | 顯示全部樓層 |閱讀模式
借用51黑 單片機論壇
單片機DIY制作  http://www.denmoz.com/bbs/dpj-225200-1.html【新提醒】stc89c52rc+ds18b20+tm1650孵化器溫控器程序終于搞成了 附原理圖PCB -
的程序進行簡單修改而成。
實驗板使用普中 HC6800-ES V2.0 單片使用 STC89C52RC
/*******************************************************************
借用51黑 單片機論壇
【新提醒】stc89c52rc+ds18b20+tm1650孵化器溫控器程序終于搞成了 附原理圖PCB -
  單片機DIY制作  http://www.denmoz.com/bbs/dpj-225200-1.html               
  的程序進行簡單修改而成。

  實驗板使用普中 HC6800-ES V2.0 單片使用 STC89C52RC

  K1 數值增加;K2 數值減少; K3 數值復位; K4 數值清零;

***********************************************************************/

  1. /******************************************
  2. 名稱:aip650的驅動
  3. 時間:2022-11-13
  4. 版本:
  5. 作者:cjz
  6. **************************************************/
  7. //頭文件
  8. #include <STC89C5xRC.H>
  9. #include <absacc.h>
  10. #include  <intrins.h>
  11. //#include <EEPROM.H>
  12. /*************************************************
  13.              常量、變量定義區

  14. ***************************************************/
  15. //常量定義
  16. #define true 1
  17. #define  false 0
  18. #define  uchar unsigned char
  19. #define  uint unsigned int


  20. //數組定義
  21. uchar Display_Code[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,0x40,0x00};
  22.          //共陰數碼管段碼 0,   1,  2,  3,  4 , 5,   6,  7,  8,  9,  .,   -,  不亮
  23. uchar Dig_Bit_Code[4]={0x68,0x6a,0x6c,0x6e};//650位碼
  24. uchar Light_Level_Code[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};//亮度調節


  25. uchar keyvalue;
  26. uint wendu;//用于存儲溫度值
  27. uchar  a,cou;//菜單標志,計數,cou1         menu=0,

  28. /***************************溫度小數部分用查表法*****************/
  29. uchar ditab[16]=
  30. {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  31. uchar display[5]={0x00,0x00,0x00,0x00,0x00};//顯示單元數據,共4個數據和一個運算暫用


  32. //定義IO口
  33. sbit   SDA=P1^0;
  34. sbit   SCL=P1^1;
  35. //sbit    DQ=P3^7;      //ds18b20溫度輸入口
  36. //sbit    DIN=P1^3;     //LED小數點控制
  37. sbit   out1=P2^0;  //測試TM1650按鍵用
  38. sbit   out2=P2^1;  //測試TM1650按鍵用
  39. sbit   out3=P2^2;  //測試TM1650按鍵用
  40. sbit   out4=P2^3;  //測試TM1650按鍵用
  41. sbit   out5=P2^4;
  42. sbit   in1=P3^1;  //測試實驗板按鍵用
  43. sbit   in2=P3^2;  //測試實驗板按鍵用
  44. sbit   in3=P3^3;  //測試實驗板按鍵用


  45. /**********************************函數定義區************************************/
  46. //I2C相關
  47. /*******************************************************************************
  48. 功能:I2CWait
  49. 描述:I2C延時
  50. 參數:
  51. 返回:
  52. *******************************************************************************/
  53. void I2CWait(void)
  54. {_nop_();_nop_();_nop_();_nop_();
  55. }

  56. /*******************************************************************************
  57. 功能:I2CStart
  58. 描述:開啟I2C總線
  59. 參數:
  60. 返回:位變量,1=I2C總線可用,0=不可用
  61. *******************************************************************************/
  62. bit I2CStart(void)
  63. {   
  64.         SDA=1;
  65.         SCL=1;
  66.         I2CWait();
  67. if(!SDA)
  68.         return false;//SDA線為低電平則總線忙,退出
  69.                 SDA=0;
  70.         I2CWait();
  71.         while(SDA)
  72.                 return false;//SDA線為高電平則總線出錯,退出
  73.         SCL=0;
  74.         I2CWait();
  75.         return true;

  76. }


  77. /*******************************************************************************
  78. 功能:I2CStop(void)
  79. 描述:關閉I2C總線
  80. 參數:
  81. 返回:
  82. *******************************************************************************/
  83. void I2CStop(void)
  84. {
  85.   SDA=0;
  86.         SCL=0;
  87.         I2CWait();
  88.         SCL=1;
  89.         I2CWait();
  90.         SDA=1;
  91. }

  92. /*******************************************************************************
  93. 功能:I2CSendAck
  94. 描述:發送ACK信號
  95. 參數:
  96. 返回:
  97. *******************************************************************************/
  98. void I2CSendAck(void)
  99. {
  100.         SDA=0;
  101.         SCL=0;
  102.         I2CWait();
  103.         SCL=1;
  104.         I2CWait();
  105.         SCL=0;
  106. }

  107. /*******************************************************************************
  108. 功能:I2CWaitAck
  109. 描述:讀取ACK信號
  110. 參數:
  111. 返回:位變量, 1=有ACK,0=無ACK
  112. *******************************************************************************/
  113. bit I2CWaitAck(void)
  114. {
  115.      uchar errtime=255;
  116.         SCL=0;
  117.         SDA=1;
  118.         I2CWait();
  119.         SCL=1;
  120.         I2CWait();
  121.         while(SDA)
  122.         {
  123.                 errtime--;
  124.                 if(!errtime)
  125.                         SCL=0;
  126.                 return false;
  127.         }
  128.         SCL=0;
  129.         return true;
  130.     }

  131. /*******************************************************************************
  132. 功能:I2CSendByte
  133. 描述:向總線發送一個字節
  134. 參數:待發送字節demand,發送順序指示order
  135.                  order=1,從HI-->LO發送8bit數
  136.                  order=0,從LO-->HI發送8bit數
  137. 返回:
  138. *******************************************************************************/
  139. void I2CSendByte(uchar demand,bit order)
  140.                 {
  141.                         uchar i=8;
  142.                         if(order)
  143.                         {
  144.                                 while(i--)
  145.                                 {
  146.                                         SCL=0;
  147.                                         _nop_();
  148.                                         SDA=(bit)(demand&0x80);
  149.                                         demand<<=1;
  150.                                         I2CWait();
  151.                                         SCL=1;
  152.                                         I2CWait();
  153.                                 }
  154.                                 SCL=0;
  155.                         }
  156.                         else
  157.                         {
  158.                                 while(i--)
  159.                                 {
  160.                                         SCL=0;
  161.                                         _nop_();
  162.                                         SDA=(bit)(demand&0x01);
  163.                                         demand>>=1;
  164.                                         I2CWait();
  165.                                         SCL=1;
  166.                                         I2CWait();
  167.                                 }
  168.                                 SCL=0;
  169.                         }
  170.                 }


  171. /*******************************************************************************
  172. 功能:I2CReceiveByte
  173. 描述:從總線讀一個字節
  174. 參數:
  175. 返回:
  176. *******************************************************************************/
  177. uchar I2CReceiveByte(void)
  178. {
  179.         uchar i=8;
  180.         uchar ddata=0;
  181.         SDA=1;
  182.         while(i--)
  183.         {
  184.                 ddata>>=1;//數據從低位開始讀取
  185.                 SCL=0;
  186.                 I2CWait();
  187.                 SCL=1;
  188.                 I2CWait();//從低位開始 ddata|=SDA;ddata>>=1
  189.                 if(SDA)
  190.                 {
  191.                                    ddata|=0x80;
  192.                 }
  193.         }
  194.         SCL=0;
  195.              return ddata;
  196. }


  197. /*******************************************************************************
  198. 功能:從650讀鍵值
  199. 描述:
  200. 參數:
  201. 返回:uchar鍵值
  202. *******************************************************************************/
  203. uchar AipReadKey()
  204. {
  205.                   uchar key;
  206.                      I2CStart();
  207.                      I2CSendByte(0x4f,1);
  208.                  if(I2CWaitAck())
  209.                                          {
  210.                                              key=I2CReceiveByte();

  211.                                            I2CSendAck();
  212.                                          }
  213.              I2CStop();
  214.                                          return key;
  215. }

  216. /*******************************************************************************
  217. 功能:向650發送地址,和數據
  218. 描述:
  219. 參數:
  220. 返回:
  221. *******************************************************************************/
  222. void Aip650_Set(uchar add,uchar dat)
  223. {
  224.   //寫顯存必須從高地址開始寫
  225.         I2CStart();
  226.         I2CSendByte(add,1);
  227.         I2CSendAck();
  228.         I2CSendByte(dat,1);
  229.         I2CSendAck();
  230.         I2CStop();

  231. }


  232. /*******************************************************************************
  233. 功能:驅動數碼管顯示數字
  234. 描述:位碼數組中選擇對應的位地址,在段碼數組中選擇對應數字的段碼發送給650
  235. 參數:
  236. 返回:
  237. *******************************************************************************/
  238. void Aip650_DisPlay(uchar Dig_Bit,uchar Display_num)
  239. {
  240.         Aip650_Set(Dig_Bit_Code[Dig_Bit-1],Display_Code[Display_num]);


  241.          }

  242. /*******************************************************************************
  243. 功能:650清屏
  244. 描述:
  245. 參數:
  246. 返回:
  247. *******************************************************************************/
  248. void Aip650_CLR()
  249. {
  250.     uchar i;
  251.         for(i=0;i<4;i++)
  252.         {
  253.         Aip650_Set(Dig_Bit_Code[i],0x00);//[/i][i]
  254.         }

  255. }

  256. /*******************************************************************************
  257. 功能:設置顯示亮度
  258. 描述:
  259. 參數:
  260. 返回:
  261. *******************************************************************************/
  262. void Light_Level_Set(uchar level)
  263. {
  264.         Aip650_Set(0x48,Light_Level_Code[level-1]);
  265. }


  266. //溫度用
  267. /*******************************************************************************
  268. 功能:delay 延時程序 11us
  269. 描述:
  270. 參數:
  271. 返回:
  272. *******************************************************************************/
  273. void delay(uint t)
  274. {
  275. for(;t>0;t--);
  276. }
  277. /*******************************************************************************
  278. 功能:溫度處理
  279. 描述:二進制數的高字節的低半字節和低字節的高半字節組成一個字,這個字節轉換為十進制后,
  280. 就是溫度的百、十、個位值,而剩下的低字節的低半字節轉化成十進制后,就是溫度值的小數部分。
  281. 參數:
  282. 返回:
  283. *******************************************************************************/
  284. void work_temp(uint tem)
  285. {
  286.         uchar n=0;
  287.                 display[4]=tem&0x0f;
  288.         display[0]=ditab[display[4]];//存入小數部分的顯示值
  289.         display[4]=tem>>4;
  290.         display[3]=display[4]/100;//取百位數據暫存
  291.         display[1]=display[4]%100;//取后兩位數據暫存
  292.         display[2]=display[1]/10;//取十位數據暫存
  293.         display[1]=display[1]%10;

  294.         /***********符號位顯示判斷*************************/
  295.         if(!display[3])
  296.         {
  297.         display[3]=0x0c;     //最高位為0時不顯示
  298.           if(!display[2])
  299.         {
  300.         display[2]=0x0c;     //次高位為0時不顯示
  301.         }
  302.         if(n)
  303.         {display[3]=0x0b;}    //負溫度時最高位顯示“-”
  304. }
  305. }


  306. /*******************************************************************************
  307. 功能:顯示溫度
  308. 描述:處理溫度數值,發送650
  309. 參數:
  310. 返回:
  311. 顯示的位置
  312. *******************************************************************************/
  313. void xianshiwendu(uint tem1)
  314. {
  315. /****************************修改***************************************************/
  316.            work_temp(tem1);
  317.           Aip650_CLR();
  318.          Light_Level_Set(2);
  319. //         Aip650_DisPlay(3,10);//顯示小數點
  320.          Aip650_DisPlay(2,display[2]);//十位
  321. //  Aip650_Set(Dig_Bit_Code[1],Display_Code[display[1]]|0x80);//個位加小數點
  322.         Aip650_DisPlay(3,display[1]);//個位
  323.           Aip650_DisPlay(4,display[0]);//小數

  324. }


  325. /*********************************************************************************************
  326. 函數名:定時/計數器初始化函數
  327. 調  用:T_C_init();
  328. /**********************************************************************************************/
  329. void Timer0_init (void){
  330.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  331.         EA = 1;        //中斷總開關
  332.         TH0 = 0x3c; //16位計數寄存器T0高8位(寫入初值)
  333.         TL0 = 0xb0; //16位計數寄存器T0低8位
  334.         ET0 = 1; //T/C1中斷開關
  335.         TR0 = 0; //T/C1關閉開關        
  336. }

  337. /*********************************************************************************************
  338. 函數名:定時/計數器1中斷處理函數
  339. 調  用:[T/C1溢出后中斷處理]
  340. /*****************************/
  341. void Timer0(void) interrupt 1  using 1{ //切換寄存器組到1
  342.     cou++;                      // 軟計數器加1   
  343.     if(cou > 99){// 計數值到(5s)
  344.         cou = 0;// 軟計數器清零
  345.         TR0 = 0; //T/C1停止計數
  346. //        menu=0;//返回 主菜單的溫度顯示界面                 
  347.     }               
  348.         TH0 = 0x3c; //16位計數寄存器T0高8位(重新寫入初值)
  349.         TL0 = 0xb0; //16位計數寄存器T0低8位
  350. }

  351. /*******************************************************************************
  352. 功能:
  353. 描述:
  354. 參數:
  355. 返回:
  356. *******************************************************************************/
  357. void Delay1ms (unsigned int a){ // 1ms延時程序
  358.         unsigned int i;
  359.         while( --a != 0){
  360.                 for(i = 0; i < 629; i++);//STC15單片機在外部晶振為12MHz時i值上限為629  
  361.         }                                                      
  362. }

  363. /******************************主函數*****************************************
  364. 功能:
  365. 描述:
  366. 參數:
  367. 返回:
  368. *******************************************************************************/
  369. void main()
  370. {  
  371.          Aip650_CLR();
  372.          Timer0_init();//定時器初始化
  373.                  wendu=532;        //16進制         二進制的333
  374.           while(1)
  375.                 {

  376.                                 if(in1==0){out1=0;out2=1;out3=0;out4=1;}
  377.                                 if(in2==0){out1=1;out2=0;out3=1;out4=0;}
  378.                                 if(in3==0){out1=1;out2=1;out3=1;out4=1;}
  379.                                 if(wendu>532){out5=0;}else out5=1;

  380.                          keyvalue=AipReadKey();

  381.         /**********************顯示界面******************************/

  382.                                 xianshiwendu(wendu);

  383.                         /*********************數值調整*******************************/

  384.                          if(keyvalue==0xf2){ out2=0;
  385.                                 Delay1ms(10);
  386.                                  if(keyvalue==0xf2){
  387.                                 wendu++; //按下K2鍵則溫度上限加零點一度
  388.                                  cou=0;//重新計數
  389.                                  TR0 = 1; //T/C1啟動開關
  390.                                  while(keyvalue!=0xf2);

  391.                                 }
  392.                           }        else out2=1;

  393.                          if(keyvalue==0xe2){ out1=0;
  394.                                 Delay1ms(10);
  395.                                  if(keyvalue==0xe2){
  396.                                 wendu--; //按下K1鍵則溫度上限減零點一度
  397.                                  cou=0;//重新計數
  398.                                  TR0 = 1; //T/C1啟動開關
  399.                                  while(keyvalue!=0xe2);

  400.                                 }
  401.                           }         else out1=1;


  402.                         /*************************按下K3鍵數值清零***************************/

  403.                          if(keyvalue==0xea){   out3=0;
  404.                          cou=0;//重新計數
  405.                          TR0 = 1; //T/C1啟動開關
  406.                              wendu=0; //按下K3鍵則菜單加一
  407.                                  while(keyvalue!=0xea);
  408.                         } else out3=1;
  409.                                    /*************************按下K4鍵數值復位***************************/
  410.                         if(keyvalue==0xfa){         out4=0;
  411.                          cou=0;//重新計數
  412.                          TR0 = 1; //T/C1啟動開關
  413.                              wendu=532; //按下K4鍵則菜單加一                        
  414.                                  while(keyvalue!=0xfa);
  415.                         }        else out4=1;


  416. }
  417.                 }

  418. // 【新提醒】stc89c52rc+ds18b20+tm1650孵化器溫控器程序終于搞成了 附原理圖PCB -
  419. //單片機DIY制作 http://www.denmoz.com/bbs/dpj-225200-1.html

  420. /******************************************
  421. 名稱:aip650的驅動
  422. 時間:2022-11-13
  423. 版本:
  424. 作者:cjz
  425. **************************************************/
  426. //頭文件
  427. #include <STC89C5xRC.H>
  428. #include <absacc.h>
  429. #include  <intrins.h>
  430. //#include <EEPROM.H>
  431. /*************************************************
  432.              常量、變量定義區

  433. ***************************************************/
  434. //常量定義
  435. #define true 1
  436. #define  false 0
  437. #define  uchar unsigned char
  438. #define  uint unsigned int


  439. //數組定義
  440. uchar Display_Code[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,0x40,0x00};
  441.          //共陰數碼管段碼 0,   1,  2,  3,  4 , 5,   6,  7,  8,  9,  .,   -,  不亮
  442. uchar Dig_Bit_Code[4]={0x68,0x6a,0x6c,0x6e};//650位碼
  443. uchar Light_Level_Code[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};//亮度調節


  444. uchar keyvalue;
  445. uint wendu;//用于存儲溫度值
  446. uint maxwendu;
  447. uint minwendu;
  448. uchar menu=0, cou;//菜單標志,計數,cou1
  449. uint h;//溫度計算使用
  450. uint temp;//溫度返回值
  451. uchar a,b,c,shuchu;


  452. /***************************溫度小數部分用查表法*****************/
  453. uchar ditab[16]=
  454. {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  455. uchar temp_data[2]={0x00,0x00};//讀出溫度暫存
  456. uchar display[5]={0x00,0x00,0x00,0x00,0x00};//顯示單元數據,共4個數據和一個運算暫用


  457. //定義IO口
  458. sbit   SDA=P1^0;
  459. sbit   SCL=P1^1;
  460. sbit    DQ=P3^7;      //ds18b20溫度輸入口
  461. //sbit    DIN=P1^3;     //LED小數點控制
  462. sbit   out1=P2^0;
  463. sbit   out2=P2^1;
  464. sbit   out3=P2^2;
  465. sbit   out4=P2^3;
  466. sbit   out5=P2^4;
  467. sbit   in1=P3^1;  //測試實驗板按鍵用
  468. sbit   in2=P3^2;  //測試實驗板按鍵用
  469. sbit   in3=P3^3;  //測試實驗板按鍵用


  470. /**********************************函數定義區************************************/
  471. //I2C相關
  472. /*******************************************************************************
  473. 功能:I2CWait
  474. 描述:I2C延時
  475. 參數:
  476. 返回:
  477. *******************************************************************************/
  478. void I2CWait(void)
  479. {_nop_();_nop_();_nop_();_nop_();
  480. }

  481. /*******************************************************************************
  482. 功能:I2CStart
  483. 描述:開啟I2C總線
  484. 參數:
  485. 返回:位變量,1=I2C總線可用,0=不可用
  486. *******************************************************************************/
  487. bit I2CStart(void)
  488. {   
  489.         SDA=1;
  490.         SCL=1;
  491.         I2CWait();
  492. if(!SDA)
  493.         return false;//SDA線為低電平則總線忙,退出
  494.                 SDA=0;
  495.         I2CWait();
  496.         while(SDA)
  497.                 return false;//SDA線為高電平則總線出錯,退出
  498.         SCL=0;
  499.         I2CWait();
  500.         return true;

  501. }


  502. /*******************************************************************************
  503. 功能:I2CStop(void)
  504. 描述:關閉I2C總線
  505. 參數:
  506. 返回:
  507. *******************************************************************************/
  508. void I2CStop(void)
  509. {
  510.   SDA=0;
  511.         SCL=0;
  512.         I2CWait();
  513.         SCL=1;
  514.         I2CWait();
  515.         SDA=1;
  516. }

  517. /*******************************************************************************
  518. 功能:I2CSendAck
  519. 描述:發送ACK信號
  520. 參數:
  521. 返回:
  522. *******************************************************************************/
  523. void I2CSendAck(void)
  524. {
  525.         SDA=0;
  526.         SCL=0;
  527.         I2CWait();
  528.         SCL=1;
  529.         I2CWait();
  530.         SCL=0;
  531. }

  532. /*******************************************************************************
  533. 功能:I2CWaitAck
  534. 描述:讀取ACK信號
  535. 參數:
  536. 返回:位變量, 1=有ACK,0=無ACK
  537. *******************************************************************************/
  538. bit I2CWaitAck(void)
  539. {
  540.      uchar errtime=255;
  541.         SCL=0;
  542.         SDA=1;
  543.         I2CWait();
  544.         SCL=1;
  545.         I2CWait();
  546.         while(SDA)
  547.         {
  548.                 errtime--;
  549.                 if(!errtime)
  550.                         SCL=0;
  551.                 return false;
  552.         }
  553.         SCL=0;
  554.         return true;
  555.     }

  556. /*******************************************************************************
  557. 功能:I2CSendByte
  558. 描述:向總線發送一個字節
  559. 參數:待發送字節demand,發送順序指示order
  560.                  order=1,從HI-->LO發送8bit數
  561.                  order=0,從LO-->HI發送8bit數
  562. 返回:
  563. *******************************************************************************/
  564. void I2CSendByte(uchar demand,bit order)
  565.                 {
  566.                         uchar i=8;
  567.                         if(order)
  568.                         {
  569.                                 while(i--)
  570.                                 {
  571.                                         SCL=0;
  572.                                         _nop_();
  573.                                         SDA=(bit)(demand&0x80);
  574.                                         demand<<=1;
  575.                                         I2CWait();
  576.                                         SCL=1;
  577.                                         I2CWait();
  578.                                 }
  579.                                 SCL=0;
  580.                         }
  581.                         else
  582.                         {
  583.                                 while(i--)
  584.                                 {
  585.                                         SCL=0;
  586.                                         _nop_();
  587.                                         SDA=(bit)(demand&0x01);
  588.                                         demand>>=1;
  589.                                         I2CWait();
  590.                                         SCL=1;
  591.                                         I2CWait();
  592.                                 }
  593.                                 SCL=0;
  594.                         }
  595.                 }


  596. /*******************************************************************************
  597. 功能:I2CReceiveByte
  598. 描述:從總線讀一個字節
  599. 參數:
  600. 返回:
  601. *******************************************************************************/
  602. uchar I2CReceiveByte(void)
  603. {
  604.         uchar i=8;
  605.         uchar ddata=0;
  606.         SDA=1;
  607.         while(i--)
  608.         {
  609.                 ddata>>=1;//數據從低位開始讀取
  610.                 SCL=0;
  611.                 I2CWait();
  612.                 SCL=1;
  613.                 I2CWait();//從低位開始 ddata|=SDA;ddata>>=1
  614.                 if(SDA)
  615.                 {
  616.                                    ddata|=0x80;
  617.                 }
  618.         }
  619.         SCL=0;
  620.              return ddata;
  621. }


  622. /*******************************************************************************
  623. 功能:從650讀鍵值
  624. 描述:
  625. 參數:
  626. 返回:uchar鍵值
  627. *******************************************************************************/
  628. uchar AipReadKey()
  629. {
  630.                   uchar key;
  631.                      I2CStart();
  632.                      I2CSendByte(0x4f,1);
  633.                  if(I2CWaitAck())
  634.                                          {
  635.                                              key=I2CReceiveByte();

  636.                                            I2CSendAck();
  637.                                          }
  638.              I2CStop();
  639.                                          return key;
  640. }

  641. /*******************************************************************************
  642. 功能:向650發送地址,和數據
  643. 描述:
  644. 參數:
  645. 返回:
  646. *******************************************************************************/
  647. void Aip650_Set(uchar add,uchar dat)
  648. {
  649.   //寫顯存必須從高地址開始寫
  650.         I2CStart();
  651.         I2CSendByte(add,1);
  652.         I2CSendAck();
  653.         I2CSendByte(dat,1);
  654.         I2CSendAck();
  655.         I2CStop();

  656. }


  657. /*******************************************************************************
  658. 功能:驅動數碼管顯示數字
  659. 描述:位碼數組中選擇對應的位地址,在段碼數組中選擇對應數字的段碼發送給650
  660. 參數:
  661. 返回:
  662. *******************************************************************************/
  663. void Aip650_DisPlay(uchar Dig_Bit,uchar Display_num)
  664. {
  665.         Aip650_Set(Dig_Bit_Code[Dig_Bit-1],Display_Code[Display_num]);


  666.          }

  667. /*******************************************************************************
  668. 功能:650清屏
  669. 描述:
  670. 參數:
  671. 返回:
  672. *******************************************************************************/
  673. void Aip650_CLR()
  674. {
  675.     uchar i;
  676.         for(i=0;i<4;i++)
  677.         {
  678.         Aip650_Set(Dig_Bit_Code[i],0x00);//[/i][i]
  679.         }

  680. }

  681. /*******************************************************************************
  682. 功能:設置顯示亮度
  683. 描述:
  684. 參數:
  685. 返回:
  686. *******************************************************************************/
  687. void Light_Level_Set(uchar level)
  688. {
  689.         Aip650_Set(0x48,Light_Level_Code[level-1]);
  690. }


  691. //溫度用
  692. /*******************************************************************************
  693. 功能:delay 延時程序 11us
  694. 描述:
  695. 參數:
  696. 返回:
  697. *******************************************************************************/
  698. void delay(uint t)
  699. {
  700. for(;t>0;t--);
  701. }

  702. /*******************************************************************************
  703. 功能:Ds18b20 復位函數
  704. 描述:
  705. 參數:
  706. 返回:
  707. *******************************************************************************/
  708. void ow_reset(void)
  709. {
  710. uchar presence=1;
  711.         while(presence)
  712.         {while(presence)
  713.                 {
  714.                         DQ=1;
  715.                         _nop_();_nop_();//從高拉到低
  716.                         DQ=0;
  717.                         delay(50);//550us
  718.                         DQ=1;
  719.                         delay(6);//66us
  720.                         presence=DQ;//presence=0復位成功,繼續下一步
  721.                 }
  722.                 delay(45);//延時500us
  723.                 presence=~DQ;
  724.         }
  725.         DQ=1;  //拉高電平
  726. }

  727. /*******************************************************************************
  728. 功能:Ds18b20寫命令函數
  729. 描述:向總線上寫1個字節
  730. 參數:
  731. 返回:
  732. *******************************************************************************/
  733. void write_byte(uchar val)
  734. {
  735. uchar i;
  736.         for(i=8;i>0;i--)
  737.         {DQ=1;_nop_();_nop_();//從高拉低
  738.         DQ=0; _nop_();_nop_();_nop_();_nop_();//5us
  739.                 DQ=val&0x01;// 最低位移出
  740.         delay(6);//66us
  741.         val=val/2;//右移一位}
  742. }
  743. DQ=1;
  744. delay(1);
  745. }

  746. /*******************************************************************************
  747. 功能:從18b20總線上讀1字節
  748. 描述:
  749. 參數:
  750. 返回:value
  751. *******************************************************************************/
  752. uchar read_byte(void)
  753. {
  754. uchar i;
  755.         uchar value=0;
  756.         for(i=8;i>0;i--)
  757.         {
  758.                 DQ=1;_nop_();_nop_();
  759.                 value>>=1;
  760.                 DQ=0;_nop_();_nop_();_nop_();_nop_();//4us
  761.                 DQ=1;_nop_();_nop_();_nop_();_nop_();//4us
  762.                 if(DQ)value|=0x80;
  763.                 delay(6);
  764.         }

  765.         DQ=1;
  766.         return(value);
  767. }


  768. /*******************************************************************************
  769. 功能:讀出溫度
  770. 描述:
  771. 參數:
  772. 返回:
  773. *******************************************************************************/
  774. read_temp()
  775. {
  776. ow_reset();
  777.         delay(200);//總線復位
  778.         write_byte(0xcc);//發命令
  779.         write_byte(0x44);//發轉換命令
  780.         ow_reset();
  781.         delay(1);
  782.         write_byte(0xcc);//發命令
  783.         write_byte(0xbe);
  784.         temp_data[0]=read_byte();//讀溫度的低字節
  785.         temp_data[1]=read_byte();//讀溫度的高字節
  786.         temp=temp_data[1];
  787.         temp<<=8;
  788.         temp=temp|temp_data[0];// 兩字節合成一個整型變量
  789.         return temp;
  790. }


  791. /*******************************************************************************
  792. 功能:溫度處理
  793. 描述:二進制數的高字節的低半字節和低字節的高半字節組成一個字,這個字節轉換為十進制后,
  794. 就是溫度的百、十、個位值,而剩下的低字節的低半字節轉化成十進制后,就是溫度值的小數部分。
  795. 參數:
  796. 返回:
  797. *******************************************************************************/
  798. void work_temp(uint tem)
  799. {
  800.         uchar n=0;
  801.         if(tem>6348)          //溫度正負判斷
  802.         {tem=65536-tem;n=1;}   //負溫度求補碼,標志位置1
  803.                 display[4]=tem&0x0f;
  804.         display[0]=ditab[display[4]];//存入小數部分的顯示值
  805.         display[4]=tem>>4;
  806.         display[3]=display[4]/100;//取百位數據暫存
  807.         display[1]=display[4]%100;//取后兩位數據暫存
  808.         display[2]=display[1]/10;//取十位數據暫存
  809.         display[1]=display[1]%10;

  810.         /***********符號位顯示判斷*************************/
  811.         if(!display[3])
  812.         {
  813.         display[3]=0x0c;     //最高位為0時不顯示
  814.           if(!display[2])
  815.         {
  816.         display[2]=0x0c;     //次高位為0時不顯示
  817.         }
  818.         if(n)
  819.         {display[3]=0x0b;}    //負溫度時最高位顯示“-”
  820. }
  821. }


  822. /*******************************************************************************
  823. 功能:顯示溫度
  824. 描述:處理溫度數值,發送650
  825. 參數:
  826. 返回:
  827. 顯示的位置
  828. *******************************************************************************/
  829. void xianshiwendu(uint tem1)
  830. {
  831. /****************************修改***************************************************/
  832.            work_temp(tem1);
  833.           Aip650_CLR();
  834.          Light_Level_Set(2);
  835.          Aip650_DisPlay(3,10);//顯示小數點
  836.          Aip650_DisPlay(2,display[2]);//十位
  837. //  Aip650_Set(Dig_Bit_Code[1],Display_Code[display[1]]|0x80);//個位加小數點
  838.         Aip650_DisPlay(3,display[1]);//個位
  839.           Aip650_DisPlay(4,display[0]);//小數

  840. }


  841. /*********************************************************************************************
  842. 函數名:定時/計數器初始化函數
  843. 調  用:T_C_init();
  844. /**********************************************************************************************/
  845. void Timer0_init (void){
  846.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  847.         EA = 1;        //中斷總開關
  848.         TH0 = 0x3c; //16位計數寄存器T0高8位(寫入初值)
  849.         TL0 = 0xb0; //16位計數寄存器T0低8位
  850.         ET0 = 1; //T/C1中斷開關
  851.         TR0 = 0; //T/C1關閉開關        
  852. }

  853. /*********************************************************************************************
  854. 函數名:定時/計數器1中斷處理函數
  855. 調  用:[T/C1溢出后中斷處理]
  856. /*****************************/
  857. void Timer0(void) interrupt 1  using 1{ //切換寄存器組到1
  858.     cou++;                      // 軟計數器加1   
  859.     if(cou > 99){// 計數值到(5s)
  860.         cou = 0;// 軟計數器清零
  861.         TR0 = 0; //T/C1停止計數
  862.         menu=0;//返回 主菜單的溫度顯示界面                 
  863.     }               
  864.         TH0 = 0x3c; //16位計數寄存器T0高8位(重新寫入初值)
  865.         TL0 = 0xb0; //16位計數寄存器T0低8位
  866. }

  867. /*******************************************************************************
  868. 功能:
  869. 描述:
  870. 參數:
  871. 返回:
  872. *******************************************************************************/
  873. void Delay1ms (unsigned int a){ // 1ms延時程序
  874.         unsigned int i;
  875.         while( --a != 0){
  876.                 for(i = 0; i < 629; i++);//STC15單片機在外部晶振為12MHz時i值上限為629  
  877.         }                                                      
  878. }

  879. /******************************主函數*****************************************
  880. 功能:
  881. 描述:
  882. 參數:
  883. 返回:
  884. *******************************************************************************/
  885. void main()
  886. {  
  887.          Aip650_CLR();
  888.          Timer0_init();//定時器初始化

  889.                         maxwendu=512; //      
  890.                         minwendu=432;         
  891.           while(1)
  892.                 {

  893.                                 if(in1==0){out1=0;out2=1;out3=0;out4=1;}
  894.                                 if(in2==0){out1=1;out2=0;out3=1;out4=0;}
  895.                                 if(in3==0){out1=1;out2=1;out3=1;out4=1;}
  896.                                 if(a==1){out5=0;}else out5=1;

  897.                          keyvalue=AipReadKey();

  898.         /**********************顯示溫度界面******************************/
  899.                   if(menu==0){
  900.                           // for(k=15;k>0;k--){
  901.                            wendu=read_temp();

  902.                                 xianshiwendu(wendu);

  903.                    }        
  904.                         /*********************進入調溫度上限界面*******************************/
  905.                   if(menu==1){
  906.                          if(minwendu>maxwendu) //如果下限溫度高于上限溫度,顯示00
  907.                          { Aip650_CLR();
  908.                            Light_Level_Set(2);
  909.                            Aip650_DisPlay(1,0);
  910.                            Aip650_DisPlay(2,0);
  911.                          }
  912.                          else
  913.                          {
  914.                                 xianshiwendu(maxwendu);}

  915.                          if(keyvalue==0xf2){ out2=0;
  916.                                 Delay1ms(10);
  917.                                  if(keyvalue==0xf2){
  918.                                 maxwendu++; //按下K2鍵則溫度上限加零點一度
  919.                                  cou=0;//重新計數
  920.                                  TR0 = 1; //T/C1啟動開關
  921.                                  while(keyvalue!=0xf2);

  922.                                 }
  923.                           }        else out2=1;

  924.                          if(keyvalue==0xe2){ out1=0;
  925.                                 Delay1ms(10);
  926.                                  if(keyvalue==0xe2){
  927.                                 maxwendu--; //按下K1鍵則溫度上限減零點一度
  928.                                  cou=0;//重新計數
  929.                                  TR0 = 1; //T/C1啟動開關
  930.                                  while(keyvalue!=0xe2);

  931.                                 }
  932.                           }         else out1=1;

  933.                    }
  934.         /*********************進入調溫度下限界面*******************************/
  935.           if(menu==2){
  936.                          if(minwendu>maxwendu) //如果下限溫度高于上限溫度,顯示00
  937.                          { Aip650_CLR();
  938.                            Light_Level_Set(2);
  939.                            Aip650_DisPlay(1,0);
  940.                            Aip650_DisPlay(2,0);
  941.                          }
  942.                          else
  943.                          {
  944.                           xianshiwendu(minwendu);}
  945.                                 if(keyvalue==0xf2){ out1=0;
  946.                                 Delay1ms(10);
  947.                                  if(keyvalue==0xf2){
  948.                                 minwendu++; //按下K2鍵則溫度下限加零點一度
  949.                                  cou=0;//重新計數
  950.                                  TR0 = 1; //T/C1啟動開關
  951.                                  while(keyvalue!=0xf2);

  952.                                 }
  953.                         } else out1=1;


  954.                          if(keyvalue==0xe2){
  955.                                 Delay1ms(10);
  956.                                  if(keyvalue==0xe2){  out2=0;
  957.                                 minwendu--; //按下K1鍵則溫度下限減零點一度
  958.                                  cou=0;//重新計數
  959.                                  TR0 = 1; //T/C1啟動開關
  960.                                  while(keyvalue!=0xe2);

  961.                                 }
  962.                           }        else out2=1;

  963.                   }
  964.                         /*************************按下K3鍵進入下限菜單設置界面***************************/

  965.                          if(keyvalue==0xea){   out3=0;
  966.                          cou=0;//重新計數
  967.                          TR0 = 1; //T/C1啟動開關
  968.                             menu=2; //按下K3鍵則菜單加一
  969.                                  while(keyvalue!=0xea);
  970.                         } else out3=1;
  971.                                    /*************************按下K4鍵進入上限菜單設置界面***************************/
  972.                         if(keyvalue==0xfa){         out4=0;
  973.                          cou=0;//重新計數
  974.                          TR0 = 1; //T/C1啟動開關
  975.                             menu=1; //按下K4鍵則菜單加一                        
  976.                                  while(keyvalue!=0xfa);
  977.                         }        else out4=1;

  978.         /*********************控制溫度界面*******************************/
  979.                   if(wendu<minwendu)           {a=1;}
  980.            //檢測溫度低于下限溫度  P2.4點亮  
  981.                                                
  982.                      if(wendu>maxwendu)        {a=0;}  
  983.            //檢測溫度高于上限溫度  P2.4熄滅         

  984. }
  985.                 }

復制代碼

51hei圖片_20260418215354_35_1.jpg
51hei圖片_20260418215355_36_1.jpg
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表