这是一款有温度湿度显示的单片机万年历程序,程序来源于本坛,修改了一些原程序在KEIL4编译环境下的编译出出的警造,程序修改后用单片机开发板进行验证,功能正常。
这是修改完善后的程序:
单片机开发板完成的单片机试验_带温度湿度的多功能万年历.zip
(2.72 MB, 下载次数: 132)
下面是试验时的照片:
单片机源码:
- #include <REGX52.H>
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit k2=P3^2; //K1 K2 K3 K4按键接口,建议从左到右接K1-K4
- sbit k1=P3^5;
- sbit k3=P3^3;
- sbit k4=P3^4;
- sbit DQ=P3^7;
- sbit beep=P1^6;
- sbit Data=P1^1; //有源蜂鸣器在P16口
- sbit lcden=P0^5; //LCD1602接口定义
- sbit lcdrs=P0^7;
- sbit lcdrw=P0^6;
- sbit bg=P1^7; //背光变量接入LCD1602的K极,通过bg的高低电平就可控制自动熄灭与点亮
- u8 k,e,d,o=1,p=1,temp,nxflag=0,mbflag=0,tianmax;
- float temperature; //温度变量,18B20接收时为浮点数
- u8 miao1,miao2,fen1,fen2,shi1,shi2,tian1,tian2,wk,tem1,tem2,tem3,wendufu;
- u8 day=1,mon=1,day1,day2,yue1,yue2,mbw,n=0,m=0,beiguang,RH,RL,TH,TL,tempH,tempL;
- u8 se1,se2,mon1,mon2,hou1,hou2,min1,min2,MB2,nian1,nian2,nian3,nian4;
- u16 y,MB1;
- u16 temper,buchang,tempwarn=0,tempwarn1=500; //tempwarn为温度下限,1为温度上限
- u8 code set[]={"NaoZhong Status"}; //上电后傻瓜调节模块
- u8 code tempwarng[]={"Wendu Waring!"};
- u8 code temmin[]={"Min"};
- u8 code temmax[]={"Max"};
- u8 code naozhongON[]={" ON"};
- u8 code naozhongOFF[]={"OFF"};
- u8 code setsucces[]={"Set Success!"};
- u8 code thanks[]={"Welcome to use !"};
- u8 code thanksu[]={"thanks for using"};
- u8 code make[]={"Designed by LY"};
- u8 code MB[]={"Stopwatch"};
- u8 code week1[]={"[MON]"};
- u8 code week2[]={"[TUE]"};
- u8 code week3[]={"[WED]"};
- u8 code week4[]={"[THU]"};
- u8 code week5[]={"[FRI]"};
- u8 code week6[]={"[SAT]"};
- u8 code week7[]={"[SUN]"};
- void delay(unsigned int z) //定义延时函数
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=1;y>0;y--);
- }
- void DHT11_delay_us(u8 n)
- {
- while(--n);
- }
- void DHT11_delay_ms(u16 z) //定义DHT11延迟函数
- {
- u16 i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20); //延时18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- u8 DHT11_rec_byte() //接收一个字节
- {
- u8 i,dat=0;
- for(i=0;i<8;i++) //从高到低依次接收8位数据
- {
- while(!Data); //等待50us低电平过去
- DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
- dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
- if(Data==1) //数据为1时,使dat加1来接收数据1
- dat+=1;
- while(Data); //等待数据线拉低
- }
- return dat;
- }
- void DHT11_receive() //接收40位的数据
- {
- u8 R_H,R_L,T_H,T_L,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0); //等待拉高
- DHT11_delay_us(40); //拉高后延时80us
- R_H=DHT11_rec_byte(); //接收湿度高八位
- R_L=DHT11_rec_byte(); //接收湿度低八位
- T_H=DHT11_rec_byte(); //接收温度高八位
- T_L=DHT11_rec_byte(); //接收温度低八位
- revise=DHT11_rec_byte(); //接收校正位
- DHT11_delay_us(25); //结束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- }
- }
- void beepon() //PWM(如果你是无源蜂鸣器,这里写PWM函数)
- { //当前为有源蜂鸣器,有源蜂鸣器无需更改
- beep=0;
- delay(1200);
- beep=1;
- }
- void write_nian(); //预定义
- void write_yue();
- void write_tian();
- void write_shi();
- void write_fen();
- void write_miao();
- void write_week();
- void zhuanhuan();
- void write_temp();
- void write_nz();
- void nzON();
- void write_setsuccess();
- void beiguangpd();
- void write_com(u8 com) //LCD1602初始化程序,了解1602时序图后新手的话可以直接照搬使用
- {
- lcdrs=0;
- P2=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(u8 date)
- {
- lcdrs=1;
- P2=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init()
- {
- lcdrw=0;
- lcden=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80+0x10);
- }
-
- void TimerInit() //定时器0工作方式1 中断初始化,923位12M晶振在KEIL仿真后的计算结果
- {
- TMOD=0X01;
- TH0=(65535-901)/256;
- TL0=(65535-901)%256;
- ET0=1; //打开定时器0中断允许位
- EA=1; //打开总中断允许
- TR0=1; //打开 定时器0,开始计时
- }
- Init_DS18B20(void) //DS18B20初始化与时序图程序,仿真时温度问题改进这个初始化程序就解决了
- {
- DQ=1;
- delay(70);
- DQ=0;
- delay(485);
- DQ=1;
- delay(50);
- return(1);
- }
- ReadOneChar(void) //18B20读一个字节
- {
- unsigned char i=0;
- unsigned char dat=0;
- for (i=8;i>0;i--)
- {
- DQ=1;
- delay(1);
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ)
- dat|=0x80;
- delay(4);
- }
- return(dat);
- }
- WriteOneChar(unsigned char dat) //18B20写一个字节
- {
- unsigned char i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay(5);
- DQ=1;
- dat>>=1;
- }
- delay(4);
- return(1);
- }
- ReadTemperature(void) //读取温度函数定义,返回值为浮点数
- {
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0x44);
- delay(125);
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0xbe);
- tempL=ReadOneChar();
- tempH=ReadOneChar();
- if(tempH>0x7f)
- {
- tempH=~tempH;
- tempL=~tempL+1;
- wendufu=1;
- }
- else
- wendufu=0;
- temperature=(((tempH*256)+tempL)*0.0625)*10;
- delay(200);
- return(temperature);
- }
- void welcome() //定义欢迎函数
- { static u8 i;
- init(); //初始化1602
- delay(5000);
- for(i=0;i<16;i++)
- {
- write_com(0x80+i);
- write_data(thanks[i]);
- delay(4000);
- }
- delay(50000);
- for(i=0;i<14;i++)
- {
- write_com(0x81+0x40+i);
- write_data(make[i]);
- delay(4000);
- }
- delay(50000);
- delay(50000);
- }
- void pdtian1() //PD在上电后设置完毕主界面处的天数判断
- {
- if((p==1||p==3)||(p==5||p==7)||(p==8||p==10)||p==12)
- tianmax=31;
- if((p==4||p==6)||(p==9||p==11))
- tianmax=30;
- if(p==2)
- {
- if(((y%4==0)&&(y%100!=0))||(y%400==0))
- tianmax=29;
- else
- tianmax=28;
- }
- }
- void pdxingqi1() //PD在上电后设置完毕至主界面处的星期判断
- {
- static char c,yi,mt,xwk1,xwk2,xwk3;
- static int xwk,yn,xwk4;
- yn=y;
- if(p==1||p==2)
- { yn=yn-1;
- mt=p+12;
- }
- else
- mt=p;
- yi=yn%100;
- c=yn/100;
- xwk1=yi+(yi/4);
- xwk2=c/4;
- xwk3=2*c;
- xwk4=(26*mt+26)/10;
- xwk=xwk1+xwk2-xwk3+xwk4+o-1;
- while(xwk<0)
- {xwk+=7; }
- wk=xwk%7;
- }
- void Display() //定义主程序 显示部分函数模块
- { static u16 xunhuan;
- RH=RH%100;
- write_nian(); //1602写入显示年
- write_com(0x84);
- write_data('-');
- write_yue(); //写入月
- write_com(0x87);
- write_data('-');
- write_com(0x88);
- write_tian(); //写入天
- write_week();
- write_shi();
- write_com(0x82+0x40);
- write_data(':');
- write_fen();
- write_com(0x85+0x40);
- write_data(':');
- write_miao(); //写入温度,温度TEM1与2与3是温度的三位数
- xunhuan++;
- if(xunhuan<180)
- {if(wendufu==1)
- {
- if((temper/100)!=0)
- {
- write_com(0x89+0x40);
- write_data('-');
- write_com(0x8a+0x40);
- write_data(tem1);
- }
- else
- {
- write_com(0x89+0x40);
- write_data(' ');
- write_com(0x8a+0x40);
- write_data('-');
- }
- }
- else
- {
- write_com(0x89+0x40);
- write_data(' ');
-
- if((temper/100)!=0)
- {
- write_com(0x8a+0x40);
- write_data(tem1);
- }
- else
- {
- write_com(0x8a+0x40);
- write_data(' ');
- } }
- write_com(0x8b+0x40);
- write_data(tem2);
- write_com(0x8c+0x40);
- write_data('.');
- write_com(0x8d+0x40);
- write_data(tem3);
- write_com(0x8e+0x40);
- write_data(0xdf);
- write_com(0x8f+0x40);
- write_data('C');
- }
- if(xunhuan>180)
- {
- write_com(0x89+0x40);
- write_data(' ');
- write_com(0x8a+0x40);
- write_data(' ');
- write_com(0x8b+0x40);
- write_data(RH/10+0x30);
- write_com(0x8c+0x40);
- write_data(RH%10+0x30);
- write_com(0x8d+0x40);
- write_data('%');
- write_com(0x8e+0x40);
- write_data('R');
- write_com(0x8f+0x40);
- write_data('H');
- }
- if(xunhuan==360)
- xunhuan=0;
- }
- void NZdisplay() //定义闹钟模块
- {
- static u8 nzflag=2,nzwei;
- delay(2000);
- init();
- delay(2000);
- nzON(); //闹钟开关选择模块
- while(k4) //没有检测到K4键退出时无限循环
- {
- ...........................................................................................................................................
- 由于程序较长,需要的可以自己下载。
复制代码
带温度补偿超声波测距:http://www.51hei.com/bbs/dpj-89712-1.html
单片机DHT11温度湿度程序:http://www.51hei.com/bbs/dpj-89543-1.html
|