|
发表于 2025-1-1 08:50:08
来自手机
|
显示全部楼层
以下是测试程序
#include <STC8051U.H> // 头文件见下载软件
#include "intrins.h"
#include "stdio.h"
#define MAIN_Fosc 22118400L
#define Baudrate 115200L
#define TM (65536 -(MAIN_Fosc/Baudrate+2)/4)
bit B1S_Flag;
void RTC_config(void);
void UartInit(void)
{
SCON = (SCON & 0x3f) | 0x40;
T2L = TM;
T2H = TM>>8;
S1BRT = 1;
T2x12 = 1;
T2R = 1;
}
void UartPutc(unsigned char dat)
{
SBUF = dat;
while(TI==0);
TI = 0;
}
char putchar(char c)
{
UartPutc(c);
return c;
}
void RTC_Isr() interrupt 13
{
if(RTCIF & 0x08) // 判断是 否 秒中断
{
RTCIF &= ~0x08; // 清中断标志
B1S_Flag = 1;
}
}
void main(void)
{
P_SW2 = 0X80; // 使能访问 XFR, 没有冲突不用关闭
CKCON = 0x00; // 设置外部数据总线速度为最快
WTST = 0x00; // 设置程序代码等待参数,
// 赋值为 0 可将 CPU 执行程序的速度设置为最快
P0M1 = 0; P0M0 = 0; // 设置为准双向口
P1M1 = 0; P1M0 = 0; // 设置为准双向口
P2M1 = 0; P2M0 = 0; // 设置为准双向口
P3M1 = 0; P3M0 = 0; // 设置为准双向口
P4M1 = 0; P4M0 = 0; // 设置为准双向口
P5M1 = 0; P5M0 = 0; // 设置为准双向口
UartInit();
RTC_config();
EA = 1;
printf("RTC Test Programme!\r\n"); //UART 发送一个字符串
while (1)
{
if(B1S_Flag)
{
B1S_Flag = 0;
P01=!P01;//LED测试
printf("Year=20%bd ", YEAR);
printf("Month=%bd ", MONTH);
printf("Day=%bd ", DAY);
printf("Hour=%bd ", HOUR);
printf("Minute=%bd ", MIN);
printf("Second=%bd ", SEC);
printf("\r\n");
}
}
}
void RTC_config(void)
{
// 选择内部 低速 IRC
// IRC32KCR = 0x80; // 启动内部 低速 IRC 振荡器
// while (!(IRC32KCR & 0x01)); // 等待时钟稳定
// RTCCFG |= 0x02; // 选择内部 低速 IRC 作为 RTC 时钟源
// 选择外部 32K
X32KCR = 0xc0; // 启动外部 32K 晶振
while (!(X32KCR & 0x01)); // 等待时钟稳定
RTCCFG &= ~0x02; // 选择外部 32K 作为 RTC 时钟源
INIYEAR = 21; //Y:2021
INIMONTH = 12; //M:12
INIDAY = 31; //D:31
INIHOUR = 23; //H:23
INIMIN = 59; //M:59
INISEC = 50; //S:50
INISSEC = 0; //S/128:0
RTCIF = 0; // 清中断标志
RTCIEN = 0x08; // 使能 RTC 秒中断
RTCCR = 0x01; // RTC 使能
RTCCFG |= 0x01; // 触发 RTC 寄存器初始化
while(RTCCFG & 0x01); // 等待初始化完成 , 需要在 "RTC 使能 " 之后判断 .
// 设置 RTC 时间需要 32768Hz 的 1 个周期时间 ,
// 大约 30.5us. 由于同步 , 所以实际等待时间是 0~30.5us.
// 如果不等待设置完成就睡眠 , 则 RTC 会由于设置没
// 完成 , 停止计数 , 唤醒后才继续完成设置并继续计数 .
}
/*isr.asm
CSEG AT 0123H
JMP 006BH
END
*/ |
|