天祥TX-1C单片机开发板-电子时钟
时间: 2023-07-07 16:46:38 浏览: 202
好的,以下是天祥TX-1C单片机开发板的电子时钟程序示例:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^1; //定义 I2C 时钟线引脚
sbit SDA=P2^0; //定义 I2C 数据线引脚
sbit LSA=P2^2; //定义数码管位选引脚
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code LedCharTable[]={ //LED 显示字符表
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9
0x77,0x7c,0x39,0x5e,0x79,0x71 //A~F
};
uchar code WeekDayTable[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; //星期表
uchar timeData[]={0x00,0x58,0x23,0x06,0x08,0x02,0x20}; //保存时间日期数据:年月日星期时分秒
uchar secondFlag=0; //秒闪烁标志
uchar i; //循环计数变量
void I2C_Start(void);
void I2C_Stop(void);
void I2C_SendByte(uchar dat);
uchar I2C_RecvByte(void);
void Delay1ms(uint cnt);
void DS1307_Init(void);
void DS1307_Write(uchar addr, uchar dat);
uchar DS1307_Read(uchar addr);
void DisplayTime(void);
void DisplayDate(void);
void DisplayWeekDay(void);
void DisplaySecond(void);
void main()
{
DS1307_Init(); //初始化 DS1307
while(1)
{
DisplayTime(); //显示时间
DisplayDate(); //显示日期
DisplayWeekDay(); //显示星期
DisplaySecond(); //闪烁显示秒
}
}
void I2C_Start(void)
{
SDA=1; //数据线高电平
SCL=1; //时钟线高电平
Delay1ms(1); //延时
SDA=0; //数据线低电平,发出起始信号
Delay1ms(1); //延时
SCL=0; //时钟线低电平,准备发送或接收数据
}
void I2C_Stop(void)
{
SDA=0; //数据线低电平
SCL=1; //时钟线高电平
Delay1ms(1); //延时
SDA=1; //数据线高电平,发出停止信号
Delay1ms(1); //延时
}
void I2C_SendByte(uchar dat)
{
uchar i;
for(i=0; i<8; i++)
{
SDA=dat>>7; //发送数据的最高位
dat<<=1; //数据左移一位,准备发送下一位数据
SCL=1; //时钟线高电平,数据线上的数据被采样
Delay1ms(1); //延时
SCL=0; //时钟线低电平,准备发送或接收下一位数据
Delay1ms(1); //延时
}
}
uchar I2C_RecvByte(void)
{
uchar i, dat=0;
SDA=1; //数据线高电平,准备接收数据
for(i=0; i<8; i++)
{
dat<<=1; //数据左移一位,准备接收下一位数据
SCL=1; //时钟线高电平,数据线上的数据被采样
Delay1ms(1); //延时
if(SDA) //如果数据线上的数据为高电平
{
dat|=0x01; //将数据线上的数据存入 dat 的最低位
}
SCL=0; //时钟线低电平,准备发送或接收下一位数据
Delay1ms(1); //延时
}
return dat;
}
void Delay1ms(uint cnt)
{
uint i, j;
for(i=0; i<cnt; i++)
{
for(j=0; j<110; j++);
}
}
void DS1307_Init(void)
{
uchar i;
I2C_Start(); //发起 I2C 起始信号
I2C_SendByte(0xd0); //发送器件地址+写命令
I2C_SendByte(0x07); //发送内部地址:时钟芯片控制寄存器
I2C_SendByte(0x00); //发送控制字节:清除 CH、RS0、RS1 位
I2C_Stop(); //发起 I2C 停止信号
I2C_Start(); //发起 I2C 起始信号
I2C_SendByte(0xd0); //发送器件地址+写命令
I2C_SendByte(0x00); //发送内部地址:秒
for(i=0; i<7; i++)
{
I2C_SendByte(timeData[i]); //发送时间数据
}
I2C_Stop(); //发起 I2C 停止信号
}
void DS1307_Write(uchar addr, uchar dat)
{
I2C_Start(); //发起 I2C 起始信号
I2C_SendByte(0xd0); //发送器件地址+写命令
I2C_SendByte(addr); //发送内部地址
I2C_SendByte(dat); //发送数据
I2C_Stop(); //发起 I2C 停止信号
}
uchar DS1307_Read(uchar addr)
{
uchar dat;
I2C_Start(); //发起 I2C 起始信号
I2C_SendByte(0xd0); //发送器件地址+写命令
I2C_SendByte(addr); //发送内部地址
I2C_Start(); //发起 I2C 起始信号
I2C_SendByte(0xd1); //发送器件地址+读命令
dat=I2C_RecvByte(); //接收数据
I2C_Stop(); //发起 I2C 停止信号
return dat;
}
void DisplayTime(void)
{
uchar hour, minute;
hour=DS1307_Read(0x02); //读取小时
minute=DS1307_Read(0x01); //读取分钟
LSA=0; //显示小时的十位
P0=LedCharTable[hour/10];
Delay1ms(5);
LSA=1;
LSB=0; //显示小时的个位
P0=LedCharTable[hour%10];
Delay1ms(5);
LSB=1;
LSC=0; //显示分钟的十位
P0=LedCharTable[minute/10];
Delay1ms(5);
LSC=1;
LSA=0; //显示分钟的个位
P0=LedCharTable[minute%10];
Delay1ms(5);
LSA=1;
}
void DisplayDate(void)
{
uchar year, month, day;
year=DS1307_Read(0x06); //读取年份
month=DS1307_Read(0x05); //读取月份
day=DS1307_Read(0x04); //读取日期
LSA=0; //显示年份的十位
P0=LedCharTable[year/10];
Delay1ms(5);
LSA=1;
LSB=0; //显示年份的个位
P0=LedCharTable[year%10];
Delay1ms(5);
LSB=1;
LSC=0; //显示月份的十位
P0=LedCharTable[month/10];
Delay1ms(5);
LSC=1;
LSA=0; //显示月份的个位
P0=LedCharTable[month%10];
Delay1ms(5);
LSA=1;
LSB=0; //显示日期的十位
P0=LedCharTable[day/10];
Delay1ms(5);
LSB=1;
LSC=0; //显示日期的个位
P0=LedCharTable[day%10];
Delay1ms(5);
LSC=1;
}
void DisplayWeekDay(void)
{
uchar weekDay;
weekDay=DS1307_Read(0x03); //读取星期
LSA=0; //显示星期的第一个字符
P0=LedCharTable[10];
Delay1ms(5);
LSA=1;
LSB=0; //显示星期的第二个字符
P0=LedCharTable[11];
Delay1ms(5);
LSB=1;
LSC=0; //显示星期的第三个字符
P0=LedCharTable[12];
Delay1ms(5);
LSC=1;
LSA=0; //显示星期的第四个字符
P0=LedCharTable[weekDay-
阅读全文