📄 index.c
字号:
/************************************************
时钟程序
版本:1.0.0
版权2007,沈佳华所有
************************************************/
#include<reg52.h>
#include<intrins.h>
#include<UserDefine.h>
#include<iic.h>
#define uchar unsigned char
#define uint unsigned int
uchar N=100,en=0,c=0; //N用来定时计数次数,十次为0.5s,en用来是否开启选中为闪烁,c用来控制对那位进行闪烁
uchar Y2=0,Y1=7,M2=1,M1=1,D2=1,D1=0,H2=2,H1=1,MU2=2,MU1=0,S2=0,S1=0,Tem2=1,Tem1=9,W;//年、月、日、时、分、秒、温度,星期的几个外部变量
uchar temp; //临时变量
uchar code TAB[]={0x3f,0x06,0x5b,0x27,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//分别在数码管上显示0-9和"-"负号
uchar code set[]={0x00,0x1f,0x00,0x50,0x20,0x15,0x04,0x11,0x07}; //初始化设定时间为2007年11月15日20点50分00秒
uchar in[7]; //用来接收芯片数据
uchar out[7]; //用来设置闹铃数据缓冲
void Init_Device(void); //初始化单片机和时钟芯片函数
void show(void); //显示
void Start_ADC0809(void); //启动0809对温度传感器测量
uchar transform(uchar); //工程量转换程序
void KEY(void); //按键,调时间和设定闹钟
void Tcs(void); //将时间信号进行BCD译码
void shanshuo(uchar i); //选中为闪烁
main()
{
Init_Device(); //初始化单片机和时钟芯片函数
while(1)
{
KEY();
}
}
void XINT0() interrupt 0 //时钟芯片中断,最高
{
read_N_byte(0x01,0x02,7,in); //9--接收N个字节 CS_I2C为读寻址字节
Tcs(); //将时间信号进行BCD译码
}
void TT0() interrupt 1 using 1 //定时器0中断
{
TR0=0;
show(); //显示
if(--N==0)
{
Start_ADC0809(); //启动0809,对温度传感器测量
shanshuo(en); //对选中为进行闪烁
N=100;
}
TH0=0xEC; //定时5ms
TL0=0x77;
TR0=1;
}
void TADC() interrupt 2 //温度传感器ADC转换完成中断,最低
{
ADC_EN=1; //打开输出使能
_nop_();
temp=P1; //将转换数码取到零时变量中
_nop_();
ADC_EN=0; //关闭输出使能
temp=transform(temp); //工程量转换程序
Tem2=temp;
Tem2=Tem2>>4; //将temp的高4位给了Tem2
//Tem2=Tem2&0x0f;
Tem1=temp&0x0f; //将temp的低4位给了Tem1
}
void shanshuo(uchar i) //选中为闪烁
{
uchar a1,a2,a3=1;
if(i!=0)
{
switch(c)
{
case 0:
{
a1=Y1;
a2=Y2;
if(a3==1)
{
Y1=11;
Y2=11;
}
else
{
Y1=a1;
Y2=a2;
}
}
case 1:
{
a1=M1;
a2=M2;
if(a3==1)
{
M1=11;
M2=11;
}
else
{
M1=a1;
M2=a2;
}
}
case 2:
{
a1=D1;
a2=D2;
if(a3==1)
{
D1=11;
D2=11;
}
else
{
D1=a1;
D2=a2;
}
}
case 3:
{
a1=H1;
a2=H2;
if(a3==1)
{
H1=11;
H2=11;
}
else
{
H1=a1;
H2=a2;
}
}
case 4:
{
a1=MU1;
a2=MU2;
if(a3==1)
{
MU1=11;
MU2=11;
}
else
{
MU1=a1;
MU2=a2;
}
}
case 5:
{
a1=S1;
a2=S2;
if(a3==1)
{
S1=11;
S2=11;
}
else
{
S1=a1;
S2=a2;
}
}
case 6:
{
a1=W;
if(a3==1)
{
W=11;
}
else
{
W=a1;
}
}
}
a3=!a3;
}
}
void Tcs(void) //将时间信号进行BCD译码
{
uchar j,k,H,L;
if(k=0,k<7,k++)
{
switch(k)
{
case 0:
{
in[0]=in[0]&0x7f; //秒的最高位需要屏蔽
j=in[0];
L=j&0x0f;
S1=TAB[L];
H=j>>4;
S2=TAB[H];
}
case 1:
{
in[1]=in[1]&0x7f; //分的最高为屏蔽
j=in[1];
L=j&0x0f;
MU1=TAB[L];
H=j>>4;
MU2=TAB[H];
}
case 2:
{
in[2]=in[2]&0x3f; //时的最高为屏蔽
j=in[1];
L=j&0x0f;
H1=TAB[L];
H=j>>4;
H2=TAB[H];
}
case 3:
{
in[3]=in[3]&0x3f; //日的最高为屏蔽
j=in[1];
L=j&0x0f;
D1=TAB[L];
H=j>>4;
D2=TAB[H];
}
case 4:
{
in[4]=in[4]&0x07; //星期的最高为屏蔽
L=in[4];
D1=TAB[L];
}
case 5:
{
in[5]=in[5]&0x1f; //月的最高为屏蔽
j=in[1];
L=j&0x0f;
M1=TAB[L];
H=j>>4;
M2=TAB[H];
}
case 6: //年
{
j=in[1];
L=j&0x0f;
Y1=TAB[L];
H=j>>4;
Y2=TAB[H];
}
}
}
}
void Init_Device(void) //初始化单片机和时钟芯片函数
{
IE=0x87; //开启定时器0和外中断0和外中断1
IP=0x03; //设置外中断0和定时器0为高优先级
TMOD=0x01; //设置定时器0为16位定时器模式
TH0=0xEC; //定时5ms
TL0=0x77;
LED=0; //LED灯灭
write_N_byte(0,0,9,set); //发送N个字节 CS_I2C为24C02 IC地址
TR0=1; //启动定时器0
}
void Start_ADC0809(void) //启动0809对温度传感器测量
{
ADC_EN=0; //输出使能关闭
ADC_S=1;
_nop_();
_nop_();
ADC_S=0;
}
void delay10ms(void) //延时10ms
{
uchar i=100,j=100;
while(i--)
{
while(j--);
}
}
void KEY(void) //按键,调时间和设定闹钟
{
if(key1==1) //设定时间,未完成
{
delay10ms(); //延时10ms
if(key1==1)
{
while(key1==0);
}
}
if(key3==1) //设定闹钟,未完成
{
delay10ms();
if(key3==1)
{
while(key3==0);
}
}
}
uchar transform(uchar i) //对温度的工程量转换程序
{
//比如说当数码为0FFH时的温度是50摄氏度,00H时为负5摄氏度.请按实际情况修改
uchar j;
//添加实际代码
j=i;
return j;
}
void show(void) //显示
{
P2=Year4; //最高位显示2
P0=TAB[0];
_nop_();
P2=Year3; //第二位显示0
P0=TAB[0];
_nop_();
P2=Year2; //一下是根据变量显示
P0=TAB[Y2];
_nop_();
P2=Year1;
P0=TAB[Y1];
_nop_();
P2=Month2; //显示月份
P0=TAB[M2];
_nop_();
P2=Month1;
P0=TAB[M1];
_nop_();
P2=Day2; //显示日
P0=TAB[D2];
_nop_();
P2=Day1;
P0=TAB[D1];
_nop_();
P2=Hour2; //显示时间
P0=TAB[H2];
_nop_();
P2=Hour1;
P0=TAB[H1];
_nop_();
P2=Minute2; //显示分钟
P0=TAB[MU2];
_nop_();
P2=Minute1;
P0=TAB[MU1];
_nop_();
P2=Second2; //显示秒
P0=TAB[S2];
_nop_();
P2=Second1;
P0=TAB[S1];
_nop_();
P2=Temperature2; //显示温度
P0=TAB[T2];
_nop_();
P2=Temperature1;
P0=TAB[T1];
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -