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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機溫控風扇并顯示時鐘的源程序

[復制鏈接]
ID:237585 發表于 2017-10-7 10:48 | 顯示全部樓層 |閱讀模式
單片機課大作業,溫控風扇并能顯示時間日期

0.png

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #include"lcd.h"
  6. #include"temp.h"
  7. #include"ds1302.h"
  8. uchar ChCh[10] = "HUANG SONG";
  9. uchar num=0;
  10. uchar j;
  11. uint tp;
  12. uint temp;
  13. uchar a,b;
  14. uchar datas[] = {0, 0, 0, 0, 0}; //定義數組
  15. void LcdDisplay(int);
  16. #define LCD1602_DATAPINS P0
  17. ////////////////////
  18. sbit beep=P2^4;
  19. sbit dj=P2^1;//電機控制端接口
  20. sbit DQ=P3^7;//溫度傳感器接口
  21. //////////按鍵接口/////////////////////////////////
  22. sbit key1=P3^0;//設置溫度
  23. sbit key2=P3^1;//溫度加
  24. sbit key3=P3^2;//溫度減
  25. //////////////////////////////////////////////////////
  26. sbit w1=P3^3;
  27. sbit w3=P2^2;
  28. sbit w4=P2^3;
  29. sbit LE=P2^0;
  30. /////共陰數碼管段選//////////////////////////////////////////////
  31. uchar table[22]=
  32. {0x3F,0x06,0x5B,0x4F,0x66,
  33. 0x6D,0x7D,0x07,0x7F,0x6F,
  34. 0x77,0x7C,0x39,0x5E,0x79,0x71,
  35. 0x00,0x38,0x76,0x00,0xff,0x37};//'-',L,H,滅,全亮,n         16-21
  36. int wen_du=0;                                                  
  37. uchar gao,di;//pwm
  38. uint shang,xia; //對比溫度暫存變量
  39. uchar dang,dang1;//檔位顯示
  40. uchar flag;
  41. uchar d1,d2,d3;//顯示數據暫存變量
  42. void delay(uint ms)
  43. {
  44.         uint i,j;
  45.         for(i=ms;i>0;i--)
  46.                 for(j=110;j>0;j--);
  47. }
  48. /***********ds18b20延遲子函數(晶振12MHz )*******/
  49. void display()//顯示溫度
  50. {
  51.         w1=0;P1=table[d1];LE=1;LE=0;delay(1); w1=1;//第1位
  52.         P1=0x00;LE=1;LE=0;

  53.         w3=0;P1=table[d2]; LE=1;LE=0; delay(1);w3=1;//第3位
  54.         P1=0x00;LE=1;LE=0;
  55.        
  56.         w4=0;P1=table[d3]; LE=1;LE=0; delay(1);w4=1;//第4位
  57.         P1=0x00;LE=1;LE=0;
  58.         }

  59. void zi_keyscan()//自動模式按鍵掃描函數
  60. {
  61.         if(key1==0)
  62.         {
  63.                 delay(1);
  64.                 if(key1==0)flag=1;
  65.                 while(key1==0);//松手檢測
  66.         }
  67.         while(flag==1)
  68.         {
  69.                 d1=18;d2=shang/10;d3=shang%10;
  70.                 display();
  71.                 if(key1==0)
  72.                 {
  73.                         delay(0.1);
  74.                         if(key1==0)flag=2;
  75.                         while(key1==0);//松手檢測
  76.                 }
  77.                 if(key2==0)
  78.                 {
  79.                         delay(0.1);
  80.                         if(key2==0)
  81.                         {
  82.                                 shang+=1;
  83.                                 if(shang>=100)shang=100;       
  84.                         }while(key2==0);//松手檢測
  85.                 }
  86.                 if(key3==0)
  87.                 {
  88.                         delay(0.1);
  89.                         if(key3==0)
  90.                         {
  91.                                 shang-=1;
  92.                                 if(shang<=10)shang=10;       
  93.                         }while(key3==0);//松手檢測
  94.                 }               
  95.         }
  96.         while(flag==2)
  97.         {
  98.                 d1=17;d2=xia/10;d3=xia%10;
  99.                 display();
  100.                 if(key1==0)
  101.                 {
  102.                         delay(0.1);
  103.                         if(key1==0)flag=0;
  104.                         while(key1==0);//松手檢測
  105.                 }
  106.                 if(key2==0)
  107.                 {
  108.                         delay(0.1);
  109.                         if(key2==0)
  110.                         {
  111.                                 xia+=1;
  112.                                 if(xia>=95)xia=95;       
  113.                         }while(key2==0);//松手檢測
  114.                 }
  115.                 if(key3==0)
  116.                 {
  117.                     delay(0.1);
  118.                         if(key3==0)
  119.                         {
  120.                                 xia-=1;
  121.                                 if(xia<=0)xia=0;       
  122.                         }while(key3==0);//松手檢測
  123.                 }               
  124.         }
  125. }
  126. void zi_dong()//自動溫控模式
  127. {
  128.         uchar i;
  129.         d1=dang;d2=16;d3=16;
  130.         zi_keyscan();//按鍵掃描函數
  131.         display();
  132.         if(wen_du<xia){dj=0;dang=0;}//低于下限  停止
  133.         if((wen_du>=xia)&&(wen_du<=shang))//1擋
  134.         {
  135.                 dang=1;
  136.                 for(i=0;i<10;i++){dj=0;display();}
  137.                 for(i=0;i<10;i++){dj=1;display();}
  138.                 zi_keyscan();               
  139.                 }
  140.                 if(wen_du>shang){dj=1;dang=2;display();}//高溫全速
  141. }
  142. unsigned int i=0;
  143. void main()
  144. {       
  145.         TMOD= 0x01;   //配置T0為模式1
  146.         TL0=0x00;
  147.         TH0=0xDC;
  148.         TF0 = 0;
  149.         EA=1;
  150.         ET0=1;
  151.         TR0=1;
  152.     beep=1;
  153.         dj=0;
  154.         shang=30;
  155.         xia=20;        //初始化LCD1602
  156.         LcdInit();
  157.         Ds1302Init();
  158.         LcdWriteCom(0xc6);        //寫地址 80表示初始地址
  159.         LcdWriteData('C');
  160.         tp=Ds18b20ReadTemp();
  161.         Ds1302ReadTime();
  162.         display();
  163.         while(1)
  164.         {
  165.                 temp=tp*0.0625*100+0.5;
  166.                 a=temp % 10000 / 1000;
  167.                 b=temp % 1000 / 100;       
  168.                 wen_du=a*10+b;
  169.                  LcdDisplay(tp);
  170.                 Delay1ms(100);//1s鐘刷一次
  171.         }          
  172. }
  173. void T0_time() interrupt 1
  174. {
  175.     TL0=0x00;
  176.         TH0=0xDC;
  177.         TF0=0;
  178.         TR0=0;
  179.         tp=Ds18b20ReadTemp();
  180.         Ds1302ReadTime();
  181.         dang1=dang;
  182.         if(dang1==2)
  183.         {beep=~beep;
  184.         num=num++;
  185.         if(num==10)dang1=0;}
  186.         display();
  187.         zi_dong();
  188.    TR0=1;               
  189. }
  190. void LcdDisplay(int temp)          //lcd顯示
  191. {
  192.    
  193.           unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
  194.         float tp;  
  195.         if(temp< 0)                                //當溫度值為負數
  196.           {
  197.                   LcdWriteCom(0xc0);                //寫地址 80表示初始地址
  198.             LcdWriteData('-');                  //顯示負
  199.                 //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  200.                 temp=temp-1;
  201.                 temp=~temp;
  202.                 tp=temp;
  203.                 temp=tp*0.0625*100+0.5;       
  204.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  205.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  206.                 //算由?.5,還是在小數點后面。

  207.           }
  208.         else
  209.           {                       
  210.                   LcdWriteCom(0xc0);                //寫地址 80表示初始地址
  211.             LcdWriteData('+');                 //顯示正
  212.                 tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  213.                 //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  214.                 temp=tp*0.0625*100+0.5;       
  215.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  216.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  217.                 //算加上0.5,還是在小數點后面。
  218.         }
  219.         datas[0] = temp / 10000;
  220.         datas[1] = temp % 10000 / 1000;
  221.         datas[2] = temp % 1000 / 100;
  222.         datas[3] = temp % 100 / 10;
  223.         datas[4] = temp % 10;

  224.         LcdWriteCom(0xc1);                 //寫地址 80表示初始地址
  225.         LcdWriteData('0'+datas[1]); //十位

  226.         LcdWriteCom(0xc2);                //寫地址 80表示初始地址
  227.         LcdWriteData('0'+datas[2]); //個位

  228.         LcdWriteCom(0xc3);                //寫地址 80表示初始地址
  229.         LcdWriteData('.');                 //顯示 ‘.’

  230.         LcdWriteCom(0xc4);                 //寫地址 80表示初始地址
  231.         LcdWriteData('0'+datas[3]); //顯示小數點  

  232.         LcdWriteCom(0xc5);                 //寫地址 80表示初始地址
  233.         LcdWriteData('0'+datas[4]); //顯示小數點
  234.        
  235.         LcdWriteCom(0x80);
  236. ……………………

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

所有資料51hei提供下載:
51單片機溫控風扇源程序.zip (69.97 KB, 下載次數: 28)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品乱码久久久久v最新版 | 色接久久 | 99只有精品 | 国产精品免费视频一区 | 国产免费一二三区 | 91精品一区二区三区久久久久久 | 91精品国产色综合久久不卡蜜臀 | 国产免费一区二区三区最新6 | 日韩精品一区二区三区中文字幕 | 午夜视频在线免费观看 | 国产精品久久久久国产a级 欧美日韩国产免费 | 中文字幕日韩欧美一区二区三区 | 日本免费一区二区三区 | 国产在线播 | 久久精品国产99国产精品亚洲 | 激情三区 | 天堂在线91| 超碰伊人久久 | 国产中文字幕亚洲 | 中文字幕91 | 成人免费视频网站在线看 | 日韩欧美手机在线 | 狠狠爱一区二区三区 | 日韩美女爱爱 | 欧美性一区二区三区 | 黄色毛片网站在线观看 | 97国产精品 | 欧美一级在线视频 | 精品一区二区三区中文字幕 | www.887色视频免费 | 99九九久久 | 91精品国产一区二区三区 | 久久久国产精品视频 | 欧美精品在欧美一区二区少妇 | 欧洲免费毛片 | 国产7777 | 一区二区三区四区电影视频在线观看 | 伊人免费视频二 | 国产美女在线免费观看 | 自拍第一页 | 国产中文字幕在线 |