找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3415|回复: 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 单片机教程网

快速回复 返回顶部 返回列表