基于C语言51单片机数字电子时钟代码.能够实时显示正确温度值;2.能够通过按键调整时和分;*3.能够显示准确时钟可用模块DS1302(第3点按能力选做)
时间: 2024-02-28 18:53:58 浏览: 88
以下是一个基于C语言的51单片机数字电子时钟代码,使用了DS1302实时时钟模块和DS18B20温度传感器,同时支持按键调整和温度显示:
```
#include<reg52.h>
#include<intrins.h>
#include<DS1302.h>
#include<DS18B20.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管0-9的编码
sbit DSPORT=P3^4; //DS1302数据总线
sbit RST=P3^5; //DS1302复位信号
sbit SCLK=P3^6; //DS1302时钟信号
sbit DQ=P1^4; //DS18B20数据总线
sbit KEY1=P1^0; //按键1
sbit KEY2=P1^1; //按键2
uchar sec,min,hour,temph,tempL;
uchar num[8];
uchar i;
bit adjust=0;
bit increase=0;
void main()
{
DS18B20_Init(); //初始化DS18B20
while(DS18B20_Get_Temp()==0); //等待温度稳定
DS1302_Init(); //初始化DS1302
while(1)
{
if(KEY1==0) //按键1被按下
{
delay(10); //消抖
if(KEY1==0)
{
increase=1; //调整模式下按键1表示增加
adjust=1; //进入调整模式
}
while(KEY1==0); //等待按键释放
}
if(KEY2==0) //按键2被按下
{
delay(10); //消抖
if(KEY2==0)
{
increase=0; //调整模式下按键2表示减少
adjust=1; //进入调整模式
}
while(KEY2==0); //等待按键释放
}
if(adjust==1) //调整模式
{
num[2]=10; //冒号闪烁表示进入调整模式
num[5]=10;
if(increase==1) //增加
{
if(KEY1==1) //等待按键释放
{
if(i==0) //调整小时
{
if(hour<23) hour++;
else hour=0;
}
if(i==1) //调整分钟
{
if(min<59) min++;
else min=0;
}
}
}
else //减少
{
if(KEY2==1) //等待按键释放
{
if(i==0) //调整小时
{
if(hour>0) hour--;
else hour=23;
}
if(i==1) //调整分钟
{
if(min>0) min--;
else min=59;
}
}
}
}
else //正常模式
{
sec=DS1302_Read(0x81); //读取秒
min=DS1302_Read(0x83); //读取分
hour=DS1302_Read(0x85); //读取时
temph=DS18B20_Get_Temp()/10; //读取温度的整数部分
tempL=DS18B20_Get_Temp()%10; //读取温度的小数部分
num[0]=hour/10; //十位小时
num[1]=hour%10; //个位小时
num[2]=10; //冒号
num[3]=min/10; //十位分钟
num[4]=min%10; //个位分钟
num[5]=10; //冒号
num[6]=temph; //整数部分
num[7]=tempL; //小数部分
if(num[2]==10&&num[5]==10) i=0;
if(num[2]!=10&&num[5]==10) i=1;
}
for(i=0;i<8;i++)
{
P0=table[num[i]]; //将数码管编码写入P0口
switch(i) //选择对应的数码管
{
case 0: DSPORT=1; RST=0; _nop_(); _nop_(); RST=1; break;
case 1: DSPORT=1; RST=0; _nop_(); _nop_(); RST=1; break;
case 2: DSPORT=1; RST=0; _nop_(); _nop_(); RST=1; break;
case 3: DSPORT=1; RST=0; _nop_(); _nop_(); RST=1; break;
case 4: DSPORT=1; RST=0; _nop_(); _nop_(); RST=1; break;
case 5: DSPORT=1; RST=0; _nop_(); _nop_(); RST=1; break;
case 6: DSPORT=1; RST=0; _nop_(); _nop_(); RST=1; break;
case 7: DSPORT=1; RST=0; _nop_(); _nop_(); RST=1; break;
default: break;
}
_nop_();
_nop_();
P0=0x00; //清空P0口
}
if(adjust==1) //调整模式下闪烁冒号
{
delay(500);
num[2]=10;
num[5]=10;
delay(500);
}
delay(100); //延时100ms
}
}
```
这个代码除了基本的时钟显示功能外,还支持按键调整和温度显示。按键1用于增加调整,按键2用于减少调整。另外,这个代码还使用了DS18B20温度传感器来测量当前温度值,并将温度显示在数码管上。如果你没有DS18B20模块,可以将代码中相关的部分去掉。
阅读全文