📄 text1.c
字号:
#include <at89x52.h>
#include <intrins.h>
unsigned char code LED_DATA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9数字数据
unsigned char code TEM_DATA[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x46}; //加有小数点的数据
unsigned char time[2],dis_buff[4],temp[4];
unsigned int i,b,ti,F;
unsigned char set;
static unsigned int tr0,tr1; //定时器定时变量
char tdata;
bit S; //标志当前是否显示的是温度
sbit k1=P1^0; //调整模式
sbit k2=P1^1; //+按钮
sbit k3=P1^2; //-按钮
sbit k4=P1^3; //(未使用)
sbit SLED=P3^3; //秒指示灯
sbit PLED=P3^1; //显示温度时作小数点 (显示时间时作点)
sbit di1=P3^4;
sbit di2=P3^5;
sbit di3=P3^6;
sbit di4=P3^7;
void w_1302 (unsigned char add,unsigned char dat); //对指定的寄存器写数据,add寄存器地址,dat数据
unsigned char r_1302 (unsigned char add); //读指定的寄存器数据,返回值为十进制数
void init_ds1302 (void);
get_18b20 (void);
void init_key (void)
{
set=1;
k1=1;
k2=1;
k3=1;
}
void get_time ()
{
time[0]=r_1302 (0x83);//读秒
time[1]=r_1302 (0x85);//读分
}
void time_updata ()
{
dis_buff[0]=LED_DATA[time[1]/10];
if (dis_buff[0]==LED_DATA[0]) dis_buff[0]=0xff; //时间第一位是0的话,就不显示
dis_buff[1]=LED_DATA[time[1]%10];
dis_buff[2]=LED_DATA[time[0]/10];
dis_buff[3]=LED_DATA[time[0]%10];
}
void get_temp ()
{
F=get_18b20 ();
temp[0]=F/1000;//温度十位值
temp[1]=(F%1000)/100;//温度个位值
temp[2]=((F%1000)%100)/10;//温度小数位值
}
void temp_updata ()
{
dis_buff[0]=LED_DATA[temp[0]];
if (dis_buff[0]==LED_DATA[0]) dis_buff[0]=0xff; //温度第一位是0的话,就不显示
dis_buff[1]=LED_DATA[temp[1]];
dis_buff[2]=LED_DATA[temp[2]];
dis_buff[3]=TEM_DATA[10]; //显示℃符号
}
void displayscanf (void) interrupt 1 using 0 //定时器0中断服务程序,用于数码管动态显示扫描
{
tr0++;
TH0=0xcd; //刷新周新6.5ms
TL0=0x38;
if (tr0==77) {SLED=~SLED;PLED=SLED;tr0=0;} //LED每秒闪一次
if (set!=0) //判断当前是否是调时模式
{
if (set==1) {SLED=0;PLED=1;} //调整小时时,SLED灯亮
if (set==2) {SLED=1;PLED=0;}//调整分钟时,PROT灯亮
}
if (S==1) {SLED=1;PLED=0;} //判断当前是否显示的是温度
i++;
if (i==4) i=0; //扫描完一圈后,从新开始!
if (i==0) {P0=dis_buff[0];di1=0;}
if (i!=0) di1=1;
if (i==1) {P0=dis_buff[1];di2=0;}
if (i!=1) di2=1;
if (i==2) {P0=dis_buff[2];di3=0;}
if (i!=2) di3=1;
if (i==3) {P0=dis_buff[3];di4=0;}
if (i!=3) di4=1;
}
void dis_other (void) interrupt 3 using 0 //控制分时显示
{
tr1++;
TH1=0x00; //定时最大值32.76ms
TL1=0x00;
if (tr1>1000) tr1=0;
if ((tr1>610)&&(tr1<1000)) //每20秒显示一次温度
{
S=1;
temp_updata ();
}
else
{
time_updata ();
S=0;
}
}
void key_delay (unsigned int m) //按键消抖动
{
unsigned char t;
t=10;
while (m--)
{
while (t--);
}
}
void set_time (void) //调整时间函数
{
if (k1==0)
{
key_delay (500);
if (k1==0)
{
set++;
if (set!=0) TR1=0; //停止显示温度
if (set==3)
{
set=0; //退出时间调整模式
TR1=1; //恢复每30秒显示一次温度
w_1302 (0x8e,0x00); //禁止写保护
w_1302 (0x80,0x00); //将秒复位
w_1302 (0x8e,0x80);//允许写保护
}
while(!k1); //等待热键释放
}
}
if (set!=0)
{
if (k2==0)
{
key_delay (20);
if (k2==0)
{
while (k2==0);
if (set==1) //调时
{
tdata=r_1302 (0x85);
tdata++;
if (tdata>23) tdata=0;
tdata=(tdata/10)*16+tdata%10; //把十进制数转换为BCD码准备写入DS1302
w_1302 (0x8e,0x00); //禁止写保护
w_1302 (0x84,tdata); //将调整后的数据写入DS1302
time[1]=r_1302 (0x85);//重新读时
time_updata ();
w_1302 (0x8e,0x80); //允许写保护
}
if (set==2) //调分
{
tdata=r_1302 (0x83);
tdata++;
if (tdata>59) tdata=0;
tdata=(tdata/10)*16+tdata%10; //把十进制数转换为BCD码准备写入DS1302
w_1302 (0x8e,0x00); //禁止写保护
w_1302 (0x82,tdata); //将调整后的数据写入DS1302
time[0]=r_1302 (0x83);//重新读时
time_updata ();
w_1302 (0x8e,0x80); //允许写保护
}
}
}
}
if (k3==0)
{
key_delay (20);
if (k3==0)
{
while (k3==0);
if (set==1) //调时
{
tdata=r_1302 (0x85);
tdata--;
if (tdata<0) tdata=23;
tdata=(tdata/10)*16+tdata%10; //把十进制数转换为BCD码准备写入DS1302
w_1302 (0x8e,0x00); //禁止写保护
w_1302 (0x84,tdata); //将调整后的数据写入DS1302
time[1]=r_1302 (0x85);//重新读时
time_updata ();
w_1302 (0x8e,0x80); //允许写保护
}
if (set==2) //调分
{
tdata=r_1302 (0x83);
tdata--;
if (tdata<0) tdata=59;
tdata=(tdata/10)*16+tdata%10; //把十进制数转换为BCD码准备写入DS1302
w_1302 (0x8e,0x00); //禁止写保护
w_1302 (0x82,tdata); //将调整后的数据写入DS1302
time[0]=r_1302 (0x83);//重新读时
time_updata ();
w_1302 (0x8e,0x80); //允许写保护
}
}
}
}
main ()
{
P0=0X00; //第一次上电时做测试数码管用
P3=0X00;
key_delay (300); //延时
P0=0xff;
P3=0xff;
init_key (); // 按键初始化(全出高电平)
init_ds1302 (); //时间芯片初始化
TMOD=0x11;
TH0=0xcd; //定时6.5ms
TL0=0x38;
TH1=0x00; //定时最大值
TL1=0x00;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
P3=0XFF; //关闭显示
i=0;
set=0;
while (1)
{
get_time();
get_temp ();
set_time ();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -