📄 yaohuaxwj.c
字号:
/*----------------------------------------
yaohuaxwj.c
实时时钟模DS1302程序列子
----------------------------------------*/
#include <AT89X51.h>
//#include <instrins.h>
sbit CLK = 0x95; //时钟线
sbit IO = 0x96; //数据线
sbit RST = 0x97; //复位线
sbit ACC_0 = ACC^0;
sbit ACC_7 = ACC^7;
unsigned data second,mintue,hour,dat,month,week,year;
//秒,分,时,日,月,星期,年
unsigned data ucBuffer;
void main(void) //测试版本,同时代表12台下位机,三种型号每种4台
{
void InitCom(unsigned char BaudRate);
void Delay();
void Write_Data(unsigned char ucSendData);
unsigned char Read_Data();
void Write_DS1302(unsigned char ucAddress,unsigned char ucData);
unsigned char Read_DS1302(unsigned char ucAddress);
P1 = 85; //设置 P1 口状态,为操作 62256 作准备
InitCom(6); //设置波特率为9600 1-8波特率300-57600
// EA = 1; //允许CPU中断
// ES = 1; //开串口中断
do
{
SBUF = 0xf0 ; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
Write_DS1302(0x8e,0x00);//WP=0
Delay(); //延时
Delay();
Write_DS1302(0x90,0xa5);//
Delay();
Delay();
Write_DS1302(0x80,0x00);//设定second=0x00
Delay();
Delay();
Write_DS1302(0x82,0x30);//设定mintue=0x00
Delay();
Delay();
Write_DS1302(0x84,0x08);//hour=8
Delay();
Delay();
Write_DS1302(0x86,0x08);//dat=1
Delay();
Delay();
Write_DS1302(0x88,0x06);//month=6
Delay();
Delay();
Write_DS1302(0x8a,0x01);//week=1
Delay();
Delay();
Write_DS1302(0x8c,0x05);//year=5
while(1)
{
second=Read_DS1302(0x81);//读秒
Delay();
Delay();
mintue=Read_DS1302(0x83);//读分
Delay();
Delay();
hour=Read_DS1302(0x85);//读时
Delay();
Delay();
dat=Read_DS1302(0x87);//读日
Delay();
Delay();
month=Read_DS1302(0x89);//读月
Delay();
Delay();
week=Read_DS1302(0x8b);//读星期
Delay();
Delay();
year=Read_DS1302(0x8d);//读年
SBUF = second ; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
SBUF = mintue ; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
SBUF = hour ; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
SBUF = dat ; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
SBUF = month ; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
SBUF = week ; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
SBUF = year ; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
}
}
while(1);
}
//串口初始化 晶振为11.0592M 方式1 波特率300-57600
void InitCom(unsigned char BaudRate)
{
unsigned char data THTL;
switch (BaudRate)
{
case 1: THTL = 64; break; //波特率300
case 2: THTL = 160; break; //600
case 3: THTL = 208; break; //1200
case 4: THTL = 232; break; //2400
case 5: THTL = 244; break; //4800
case 6: THTL = 250; break; //9600
case 7: THTL = 253; break; //19200
case 8: THTL = 255; break; //57600
default: THTL = 208;
}
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1定时方式2
TCON = 0x40; //设定时器1开始计数
TH1 = THTL;
TL1 = THTL;
PCON = 0x80; //波特率加倍控制,SMOD位
RI = 0; //清收发标志
TI = 0;
TR1 = 1; //启动定时器
}
/***********************************************************
***功能:延时
************************************************************/
void Delay()
{
int j;
for(j=250; j>0; j--) j=j;
}
/**************************************************************
***功能:写入数据
***入口参数:ucSendData
**************************************************************/
void Write_Data(unsigned char ucSendData)
{
int i;
for(i=8;i>0;i--)
{
ACC=ucSendData;
IO=ACC_0;//从第0位开始传输
ACC=ACC>>1;//右移一位
ucSendData=ACC;
CLK=1; //上升沿写入数据
Delay();
CLK=0;
}
}
/****************************************************************
***功能:读出数据
***出口参数:ACC
****************************************************************/
unsigned char Read_Data()
{
int i;
unsigned char Rdata=0;
for(i=8;i>0;i--)
{
ACC=Rdata;
ACC=ACC>>1;
ACC_7=IO;//读取数据线上的数据
Rdata=ACC;
CLK=1; //下降沿读出数据
Delay();
CLK=0;
}
return Rdata;
}
/**************************************************************
***功能:向DS1302中写入数据
***说明:先写地址,后写数据 ucAddress-地址,ucData-数据
**************************************************************/
void Write_DS1302(unsigned char ucAddress,unsigned char ucData)
{
RST=0;
Delay();
CLK=0;
Delay();
RST=1;
Delay();
Write_Data(ucAddress);//写入地址
Delay();
Delay();
Write_Data(ucData);//写入数据
Delay();
CLK=0;
Delay();
RST=0;
Delay();
}
/****************************************************************
***功能:从DS1302中读出数据
***说明:先写地址,后读数据 ucAddress-地址,ucBuffer-接收数据
****************************************************************/
unsigned char Read_DS1302(unsigned char ucAddress)
{
RST=0;
Delay();
CLK=0;
Delay();
RST=1;
Delay();
Write_Data(ucAddress);//写入地址
ucBuffer=Read_Data();//读出数据
Delay();
CLK=0;
Delay();
RST=0;
Delay();
return ucBuffer;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -