- 打卡等级:常住居民III
- 打卡总天数:153
- 最近打卡:2026-03-30 19:54:03
已绑定手机
论坛元老
- 积分
- 3422
|
发表于 2026-1-22 21:01:09
|
显示全部楼层
我们改写一下上节课串口2 的程序:
#include <AI8051U.H>
unsigned char teststr[]={"STC8H Uart2 Test!\r\n"};
unsigned char str_index; //定义索引变量
void Uart2_Init(void); //115200bps@22.1184MHz
void main(void) //主程序,在C语言的主程序中可以不设置堆栈指针
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P4M0 |= 0x24; P4M1 |= 0x24; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
P4M0 |= 0x00; P4M1 |= 0x00;
P4PU = 0x00; //打开内部上拉电阻
SCON=0x50; //8位数据,可变波特率
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
Uart2_Init(); //115200bps@22.1184MHz
//P_SW2 |= 1; //UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7
//Ai8051U试验箱是P4.2 RXD2_2 P4.3 TXD2_2,利用J18A J18B
P_SW2 |= 1; //UART2 switch to: 0: P1.2 P1.3, 1: P4.2 P4.3
IE2 |= 0x01; //允许UART2中断
EA=1; //开中断
str_index = 0;
S2BUF=teststr[str_index];
while(1); //等待中断
}
void Uart2_Isr(void) interrupt UART2_VECTOR
{
if (S2CON & 0x01 != 0) //检测串口2接收中断
{
S2CON &= ~0x01; //清除串口2接收中断请求位
}
if (S2CON & 0x02 !=0) //检测串口2发送中断
{
S2CON &= ~0x02; //清除串口2发送中断请求位
str_index++;
if(teststr[str_index]=0)
IE2^=0xfe; //关串口2中断
else
S2BUF=teststr[str_index];
}
}
void Uart2_Init(void) //115200bps@22.1184MHz
{
S2CON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0xFC; //设置定时初始值
T2H = 0xFF; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x01; //使能串口2中断
}
|
|