- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2025-05-16 08:03:31
已绑定手机
新手上路
- 积分
- 17
|
发表于 2025-5-16 08:07:14
|
显示全部楼层
串口烧录用的USB Link1d,程序#include <STC8H.H>
#include <intrins.h>
#define FOSC 11059200L // 系统频率
#define BAUD 9600 // 波特率
/* 系统时钟初始化 */
void Clock_Init(void)
{
P_SW2 |= 0x80; // 允许访问XSFR
CLKDIV = 0x00; // 时钟不分频
P_SW2 &= 0x7F; // 禁止访问XSFR
}
/* 串口初始化 */
void UART_Init(void)
{
// 设置IO口模式
P3M0 &= ~0x30; // P3.0(RxD)和P3.1(TxD)设为准双向口
P3M1 &= ~0x30;
// 串口配置
SCON = 0x50; // 8位数据,可变波特率,允许接收
AUXR |= 0x40; // 定时器1时钟为Fosc,即1T
AUXR &= 0xFE; // 串口1选择定时器1为波特率发生器
TMOD &= 0x0F; // 清除定时器1模式位
TMOD |= 0x20; // 设定定时器1为8位自动重装方式
// 波特率设置
TL1 = TH1 = (256 - (FOSC/4/BAUD)); // 计算重装值
// 启动定时器
ET1 = 0; // 禁止定时器1中断
TR1 = 1; // 启动定时器1
// 中断配置(如果需要接收)
ES = 1; // 使能串口中断
EA = 1; // 开总中断
}
/* 发送一个字节 */
void UART_SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI); // 等待发送完成
TI = 0; // 清除发送中断标志
}
/* 发送字符串 */
void UART_SendString(char *s)
{
while(*s) // 检测字符串结束符
{
UART_SendByte(*s++); // 发送当前字符
}
}
/* 接收一个字节(查询方式) */
unsigned char UART_ReceiveByte(void)
{
while(!RI); // 等待接收完成
RI = 0; // 清除接收中断标志
return SBUF;
}
/* 延时函数(约1ms) */
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<1000; j++);
}
/* 串口中断服务函数 */
void UART_ISR(void) interrupt 4
{
if(RI)
{
RI = 0; // 清除接收中断标志
// 在此处理接收数据
UART_SendByte(SBUF); // 示例:回传接收到的数据
}
if(TI)
{
TI = 0; // 清除发送中断标志
}
}
/* 主函数 */
void main(void)
{
Clock_Init(); // 时钟初始化
UART_Init(); // 串口初始化
UART_SendString("STC8H1K08 UART Test Ready\r\n");
while(1)
{
// 示例1:定时发送测试数据
UART_SendString("System Running...\r\n");
delay_ms(1000);
// 示例2:查询方式接收处理
if(RI)
{
RI = 0;
UART_SendByte(SBUF); // 回显接收到的字节
}
}
} |
|