天祥TX-1C单片机开发板-时钟程序
时间: 2023-08-07 16:05:22 浏览: 208
TX-1C的试用手册
好的,以下是天祥TX-1C单片机开发板的时钟程序示例:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^1; //定义 I2C 时钟线引脚
sbit SDA=P2^0; //定义 I2C 数据线引脚
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);
uchar code WeekDayTable[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; //星期表
uchar code timeData[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //保存时间日期数据
uchar i; //循环计数变量
void main()
{
DS1307_Init(); //初始化 DS1307
while(1)
{
DisplayTime(); //显示时间
}
}
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 year, month, day, weekDay, hour, minute, second;
year=DS1307_Read(0x06); //读取年份
month=DS1307_Read(0x05); //读取月份
day=DS1307_Read(0x04); //读取日期
weekDay=DS1307_Read(0x03); //读取星期
hour=DS1307_Read(0x02); //读取小时
minute=DS1307_Read(0x01); //读取分钟
second=DS1307_Read(0x00); //读取秒钟
printf("%d/%d/%d %s %d:%d:%d\n", 2000+year, month, day, WeekDayTable[weekDay-1], hour, minute, second); //格式化输出时间
Delay1ms(1000); //延时1秒
}
```
该程序使用了DS1307实时时钟芯片来实现时钟功能,使用I2C总线进行通信。程序中的`DS1307_Init()`函数用于初始化DS1307,将控制寄存器清零,并将时间数据写入DS1307的寄存器中。`DS1307_Write()`和`DS1307_Read()`函数用于向DS1307写入数据和从DS1307读取数据。`DisplayTime()`函数用于读取DS1307中的时间数据并将其格式化输出。
该程序需要在连接好DS1307实时时钟芯片的天祥TX-1C单片机开发板上运行,才能正常显示时间。
阅读全文