使用单片机作为控制核心 ,能够显示年月日时分秒以及星期 , 能够显示当前温度和湿度值,包括代码
时间: 2024-03-10 22:47:06 浏览: 89
好的,这是一个基于STC89C52单片机的电子万年历代码,可以实现显示年月日时分秒以及星期,显示当前温度和湿度值。
```c
#include <reg52.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit DHT11 = P2^7; //DHT11数据线
uchar code week[7][4]={"Sun.","Mon.","Tue.","Wed.","Thu.","Fri.","Sat."}; //星期
uchar time[7]={0x00,0x12,0x00,0x00,0x00,0x00,0x00}; //初始化时间为2022年1月1日12时0分0秒
uchar temp, humi; //温度和湿度
void delay(uint i) //延时函数
{
uint j, k;
for(j=0;j<i;j++)
for(k=0;k<120;k++);
}
void set_timer() //定时器初始化
{
TMOD |= 0x01; //定时器0,模式1
TH0 = (65536-50000)/256; //50ms
TL0 = (65536-50000)%256;
ET0 = 1; //开定时器0中断
EA = 1; //开总中断
TR0 = 1; //启动定时器0
}
void update_time() //更新时间函数
{
time[5]++; //秒加1
if(time[5]>=60)
{
time[5]=0;
time[4]++; //分加1
if(time[4]>=60)
{
time[4]=0;
time[3]++; //时加1
if(time[3]>=24)
{
time[3]=0;
time[2]++; //日加1
switch(time[1])
{
case 2:
if(time[0]%4==0&&time[0]%100!=0||time[0]%400==0)
{
if(time[2]>29) //闰年2月
{
time[2]=1;
time[1]++;
}
}
else
{
if(time[2]>28) //平年2月
{
time[2]=1;
time[1]++;
}
}
break;
case 4:
case 6:
case 9:
case 11:
if(time[2]>30) //4、6、9、11月
{
time[2]=1;
time[1]++;
}
break;
default:
if(time[2]>31) //1、3、57、8、10、12月
{
time[2]=1;
time[1]++;
}
break;
}
if(time[1]>12)
{
time[1]=1;
time[0]++; //年加1
}
}
}
}
}
void display_time() //显示时间函数
{
uchar i;
uchar time_buf[6];
sprintf(time_buf, "%02d%02d%02d", time[3], time[4], time[5]); //将时间转换为字符串
for(i=0;i<6;i++)
{
P0 = 0x80+i; //选择LCD第i+1位
P2 = time_buf[i]; //发送字符
delay(10);
}
P0 = 0x8D; //选择LCD第8位
P2 = week[time[6]][0];
delay(10);
P0 = 0x8E;
P2 = week[time[6]][1];
delay(10);
P0 = 0x8F;
P2 = week[time[6]][2];
delay(10);
}
void dht11() //DHT11温湿度传感器读取函数
{
uchar i, j, k;
uchar data[5]={0, 0, 0, 0, 0};
DHT11=0; //发送起始信号
delay(20);
DHT11=1;
while(DHT11);
while(!DHT11);
while(DHT11);
for(i=0;i<5;i++) //读取40位数据
{
for(j=0;j<8;j++)
{
while(!DHT11);
delay(30);
if(DHT11)
{
k=(1<<(7-j));
data[i] |= k;
}
while(DHT11);
}
}
if(data[4]!=data[0]+data[1]+data[2]+data[3]) //校验数据
{
temp = 0;
humi = 0;
}
else
{
humi = data[0];
temp = data[2];
}
}
void display_temp() //显示温度和湿度函数
{
uchar temp_buf[4], humi_buf[4];
sprintf(temp_buf, "%d", temp); //将温度值转换为字符串
sprintf(humi_buf, "%d", humi); //将湿度值转换为字符串
P0 = 0xC0; //选择LCD第2行
P2 = 'T';
delay(10);
P2 = 'e';
delay(10);
P2 = 'm';
delay(10);
P2 = 'p';
delay(10);
P2 = ':';
delay(10);
P2 = temp_buf[0];
delay(10);
P2 = temp_buf[1];
delay(10);
P2 = '.';
delay(10);
P2 = temp_buf[2];
delay(10);
P2 = 'C';
delay(10);
P2 = 0xDF; //显示温度符号
delay(10);
P2 = ' ';
delay(10);
P2 = 'H';
delay(10);
P2 = 'u';
delay(10);
P2 = 'm';
delay(10);
P2 = 'i';
delay(10);
P2 = ':';
delay(10);
P2 = humi_buf[0];
delay(10);
P2 = humi_buf[1];
delay(10);
P2 = '%';
delay(10);
}
void main()
{
uchar i;
set_timer(); //初始化定时器
while(1)
{
dht11(); //读取温湿度
display_temp(); //显示温度和湿度
for(i=0;i<20;i++)
{
delay(100); //延时2秒
update_time(); //更新时间
display_time(); //显示时间
}
}
}
void timer0() interrupt 1 //定时器0中断服务程序
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
update_time(); //更新时间
display_time(); //显示时间
}
```
请注意,由于电子万年历的具体实现方式和硬件环境不同,您需要根据实际情况进行代码的修改和调试。
阅读全文