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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2377|回復: 2
收起左側

藍橋杯ct107 51單片機的溫度控制器程序設計

[復制鏈接]
ID:977536 發表于 2021-11-4 09:22 | 顯示全部樓層 |閱讀模式
基于51單片機的溫度控制器設計
功能較為完善

單片機源程序如下:
  1. #include "reg52.h"
  2. #include "ct107.h"
  3. #include "iic.h"
  4. #include "EEPROM.H"
  5. #include "18b20.h"
  6. #include "i2c.h"

  7. bit flag_get,keyflag;                           //定義采集溫度標志位和按鍵標志位
  8. sbit PWM=P3^4;                                           //定義脈沖端口

  9. sbit LED1=P0^0;
  10. sbit LED2=P0^1;
  11. sbit LED3=P0^2;
  12. sbit LED4=P0^3;
  13. sbit LED5=P0^4;
  14. sbit LED6=P0^5;
  15. sbit LED7=P0^6;
  16. sbit LED8=P0^7;

  17. unsigned char code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //數碼管段選“0~9”
  18. unsigned char code smg_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                           //數碼管位選
  19. unsigned char UpT,DoT,NowT;                        //上限溫度,下限溫度,目前溫度
  20. unsigned int temp;                                        //定義中間變量
  21. unsigned char dat[8];                                //定義顯示數組
  22. unsigned int Ad_data;

  23. void key();                                                        //按鍵函數
  24. void diswork();                                                //顯示處理函數
  25. void Write_byte(unsigned char add,unsigned char dat);                 //向EEPROM寫一個字節
  26. unsigned char read_byte(unsigned char add);                                         //從EEPROM讀一個字節
  27. unsigned int ReadTemperature(void);                                                         //讀當前溫度
  28. void deplay_50us(unsigned char t);                                                         //50us延時函數
  29. void work();                                                                                                 //判斷采用何種措施函數
  30. void Ad_read(void);           //電壓讀取

  31. main()                                                                                                                 //主函數
  32. {
  33.         ct107_init();                                                                                         //初始化板(關蜂鳴器,繼電器,LED等)
  34.         TMOD=0X12;                                                                                                 //定義定時器1為16位,定時器0為8位重載定時器
  35.         TH1=(65536-2000)/256;                                                                         //定時2ms
  36.         TL1=(65536-2000)%256;
  37.         TH0=256-100;                                                                                         //定時0.1ms
  38.         TL0=256-100;
  39.         TR1=1;                                                                                                         //開定時器T1
  40.         ET1=1;                                                                                                         //開定時器T1中斷
  41.         TR0=1;                                                                                                         //開定時器T0
  42.         EA=1;                                                                                                         //開總中斷

  43.         while(1)
  44.         {
  45.             
  46.                  key();
  47.                  
  48.         
  49.                 if(flag_get==1)                       //定時讀取當前溫度
  50.             {
  51.                  Ad_read();
  52.                
  53.                                 
  54.                   temp=ReadTemperature();                                
  55.                   NowT=temp>>4;                                   //讀溫度整數部分
  56.                   flag_get=0;
  57.                   }
  58.                 UpT=read_byte(0x00);                //從EEPROM讀出上限溫度
  59.                 DoT=read_byte(0x01);                //從EEPROM讀出下限溫度
  60.                         
  61.                         
  62.                         
  63.                 work();
  64.                 diswork();
  65.         }
  66.         


  67.         }        


  68. /*--------------------------------------------------------------------------
  69.                                                 判斷采用何種措施函數
  70. -------------------------------------------------------------------------*/
  71. void work()
  72. {
  73.         if(NowT>UpT)                                   //當目前溫度高于上限溫度是開T0中斷,產生1KHz占空比為30%的方波
  74.         {
  75.          ET0=1;        
  76.                
  77.                
  78.                        LED1=0;
  79.                 LED2=1;
  80.                 LED3=1;
  81.                 LED4=1;
  82.                 LED5=1;
  83.                 LED6=1;
  84.                 LED7=1;
  85.                 LED8=1;
  86.           P2|=Y4C;         
  87.     P2&=0x1f;
  88.       
  89.         }
  90.         else
  91.                 if(NowT>DoT)                           //溫度在上下限之間時,關中斷,P3^4口保持高電平
  92.                 {
  93.                 ET0=0;
  94.                 PWM=1;        
  95.                         
  96.                         
  97.                                   LED1=1;
  98.                 LED2=0;
  99.                 LED3=1;
  100.                 LED4=1;
  101.                 LED5=1;
  102.                 LED6=1;
  103.                 LED7=1;
  104.                 LED8=1;
  105.           P2|=Y4C;         
  106.     P2&=0x1f;
  107.                 }
  108.         if(NowT<DoT)                                   //溫度低于下限溫度時開繼電器,關蜂鳴器避免干擾
  109.         {
  110.         P2&=0x1f;
  111.         BUZZ=0;
  112.         RELAY=1;
  113.         P2|=Y5C;         
  114.         P2&=0x1f;
  115.                
  116.                             LED1=1;
  117.                 LED2=1;
  118.                 LED3=0;
  119.                 LED4=1;
  120.                 LED5=1;
  121.                 LED6=1;
  122.                 LED7=1;
  123.                 LED8=1;
  124.           P2|=Y4C;         
  125.     P2&=0x1f;
  126.         }
  127.         else
  128.         {
  129.         P2&=0x1f;
  130.         BUZZ=0;
  131.         RELAY=0;
  132.         P2|=Y5C;         
  133.         P2&=0x1f;
  134.         }
  135. }



  136. /*-------------------------------------------------------------------------------
  137.                                                         按鍵掃描函數
  138. -------------------------------------------------------------------------------*/
  139. void key()
  140. {
  141.         if((P3&0x0f)!=0x0f)
  142.         {        
  143.         if(!keyflag)
  144.         {
  145.                 deplay_50us(200);
  146.                 if((P3&0x0f)!=0x0f)
  147.                 {
  148.                         keyflag=1;
  149.                         switch(P3&0x0f)
  150.                         {
  151.                                 case 0x07:if(UpT<99)UpT++;break;
  152.                                 case 0x0b:if(DoT<UpT-1)DoT++;break;
  153.                                 case 0x0d:if(UpT-1>DoT)UpT--;break;
  154.                                 case 0x0e:if(DoT>0)DoT--;break;
  155.                                 default:break;
  156.                         }
  157.                    if(UpT<=DoT|UpT>99|DoT<0)                  //保護程序,一旦存儲數據出錯可以使數據回到設定值,使系統穩定
  158.                    {
  159.                    UpT=30;
  160.                    DoT=0;
  161.                    }
  162.                    Write_byte(0x00,UpT);                          //將數據寫入EEPROM
  163.                    deplay_50us(18);
  164.                    Write_byte(0x01,DoT);
  165.                    deplay_50us(18);
  166.                 }
  167.         }
  168.         }
  169.         else
  170.         keyflag=0;                        
  171. }
  172. /*----------------------------------------------
  173.                         顯示數據處理函數
  174. ----------------------------------------------*/

  175. void diswork()
  176. {
  177.         dat[0]=UpT/10;
  178.         dat[1]=UpT%10;
  179.         dat[2]=DoT/10;
  180.         dat[3]=DoT%10;
  181.         dat[4]=Ad_data/10;
  182.         dat[5]=Ad_data%10;
  183.         dat[6]=NowT/10;
  184.         dat[7]=NowT%10;

  185. }



  186. /*----------------------------------------
  187.                 寫入內存一個字節
  188. -----------------------------------------*/
  189. void Write_byte(unsigned char add,unsigned char dat)
  190. {
  191.         ET1=0;
  192.         init_iic();                                   //可以不初始化,函數已有嚴格的時序控制
  193.         Start();                        //起始信號
  194.         Send(AddWr);                //器件地址
  195.         Ack();                                //應答
  196.         Send(add);                        //存放地址
  197.         Ack();
  198.         Send(dat);                        //存放數據
  199.         Ack();
  200.         Stop();                                //停止信號
  201.         ET1=1;
  202. }
  203. /*-----------------------------------------
  204.                 讀內存一個字節
  205. -----------------------------------------*/
  206. unsigned char read_byte(unsigned char add)
  207. {
  208.         unsigned char rdat;
  209.         ET1=0;
  210.         init_iic();                                   //可以不初始化,函數已有嚴格的時序控制
  211.         Start();                        //起始信號
  212.         Send(AddWr);                //發送寫器件地址
  213.         Ack();
  214.         Send(add);                        
  215.         Ack();
  216.         Start();                        //起始信號
  217.         Send(AddRd);            //讀器件地址
  218.         Ack();
  219.         rdat=Read();                        //讀數據
  220.         NoAck();                        //好像是告訴器件接收完畢
  221.         Stop();                                //停止信號
  222.         ET1=1;
  223.         return rdat;
  224. }
  225. /*------------------------------------------------------
  226.                          讀取溫度                                    
  227. -------------------------------------------------------*/
  228. unsigned int ReadTemperature(void)
  229. {
  230. unsigned char a=0;
  231. unsigned int b=0;
  232. unsigned int t=0;
  233. Init_DS18B20();
  234. WriteOneChar(0xCC); // 跳過讀序號列號的操作
  235. WriteOneChar(0x44); // 啟動溫度轉換
  236. delay(50);
  237. Init_DS18B20();
  238. EA=0;
  239. WriteOneChar(0xCC); //跳過讀序號列號的操作
  240. WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  241. a=ReadOneChar();   //低位
  242. b=ReadOneChar();   //高位
  243. b<<=8;
  244. t=a+b;
  245. EA=1;
  246. return(t);

  247. }
  248. /*----------------------------------------------------------
  249.                 定時器0中斷,產生1Khz占空比為30%的方波
  250. ----------------------------------------------------------*/
  251. void tm0_isr() interrupt 1
  252. {
  253.         static j;
  254.         if(j<3)
  255.         PWM=1;
  256.         else
  257.         PWM=0;
  258.         j++;
  259.         if(j==10)
  260.         {
  261.         j=0;
  262.         }
  263. }

  264. /*-----------------------------------------------------------
  265.                    定時器中斷                                   
  266. ------------------------------------------------------------*/
  267. void tm1_isr() interrupt 3                        //定時掃描數碼管和溫度
  268. {
  269.         static i,k;
  270.         unsigned char com[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};           //用于控制數碼管的亮滅
  271.         TH1=(65536-1800)/256;
  272.         TL1=(65536-1800)%256;
  273.         
  274.         if(i==4)
  275.         {
  276.         P2&=0x1f;
  277.         P0=0xff;
  278.         P2=Y7C;
  279.         P2&=0x1f;
  280.         P0=smg_we[i]&com[i];
  281.         P2=Y6C;
  282.         P2&=0x1f;
  283.         P0=smg_du[dat[i]]+0x80;
  284.         P2=Y7C;
  285.         P2&=0x1f;
  286.         i++;
  287.         }
  288.         else
  289.         {
  290.         P2&=0x1f;
  291.         P0=0xff;
  292.         P2=Y7C;
  293.         P2&=0x1f;
  294.         P0=smg_we[i]&com[i];
  295.         P2=Y6C;
  296.         P2&=0x1f;
  297.         P0=smg_du[dat[i]];
  298.         P2=Y7C;
  299.         P2&=0x1f;
  300.         i++;
  301.         }        
  302.         if(i==8)
  303.         {
  304.         i=0;
  305.         k++;
  306.                 if(k==25)
  307.                 {
  308.                 k=0;
  309.                 flag_get=1;//標志位有效
  310.                 }
  311.         }
  312. }
  313. /*-----------------------------------------------------------
  314.                                 大約50us的延時函數
  315. -----------------------------------------------------------*/
  316. void deplay_50us(unsigned char t)
  317. {
  318.         unsigned char j;
  319.         for(;t>0;t--)
  320.                 for(j=19;j>0;j--);
  321. }

  322. void Ad_read(void)
  323. {
  324.   
  325.   Ad_data=adc_pcf8591(0);
  326.   Ad_data=Ad_data*50/256;
  327. }
復制代碼

Keil代碼下載:
溫度.zip (91.34 KB, 下載次數: 13)

評分

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

查看全部評分

回復

使用道具 舉報

ID:983338 發表于 2021-11-24 12:34 | 顯示全部樓層
很棒的學習資料
回復

使用道具 舉報

ID:986694 發表于 2021-12-1 10:00 | 顯示全部樓層
你好樓主,我用你的代碼在Keil 5上運行仿真錯誤好多,
對了,板子是51的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久免费精品 | 在线看av网址| 亚洲一区免费 | 久色网| 日本不卡高清视频 | 超碰在线国产 | 国产日韩视频 | 97精品超碰一区二区三区 | 中文字幕第5页 | 亚洲第一成人影院 | 国产精品久久亚洲 | 久久视频免费看 | 91精品国产高清久久久久久久久 | 国产日韩精品视频 | 日韩在线视频一区 | 男人天堂国产 | 亚洲一区二区免费视频 | zzzwww在线看片免费 | 婷婷福利视频导航 | 国产乱码高清区二区三区在线 | 仙人掌旅馆在线观看 | 亚洲一区二区在线 | 国产一级毛片精品完整视频版 | 中文字幕一区二区三区在线观看 | 久久久精 | 日本精品久久久久久久 | 久久久91精品国产一区二区精品 | 午夜专区| 蜜桃视频在线观看免费视频网站www | 欧美性成人 | 狠狠操电影 | 日本男人天堂 | 精品麻豆剧传媒av国产九九九 | 欧美一级久久 | 日本精品免费在线观看 | 成人av高清在线观看 | 日日操日日干 | 国产综合久久 | 在线黄色网 | 中文字幕人成乱码在线观看 | 成人精品国产一区二区4080 |