帮我看看程序有错么?void UARTInit() PCON=0x7F; //波特率不倍速 SCON=0x50; /*0101 0000 SMO,SM1选择模式;SM2:允许多机通信;REN:串行接收允许控制; TB8:发送数据的第九位;RB8:接受数据的第九位;TI:发送中断标志;RI:接收中断材 TMOD=0x21; /*设定采用定时器11.并且定时器工作方式2,做为波特率发生器, 8位初值自动重装的8位定时器,定时到TH1的值自动装到TL1* TH1 =0xFD; //波特率为9600 TL1 = 0xFD; TR1 =1; ES =1; //打开接收中断 EA =1;
时间: 2023-06-07 07:07:26 浏览: 168
经过查看,代码有一些问题:
1. 在void UARTInit()函数中,应该加上函数声明,否则编译器会报错。
2. 在SCON寄存器的设置中,SM2应该设为0,因为在使用模式1时不需要多机通信。
3. 在TMOD寄存器的设置中,定时器选择应该是01而不是11,因为不需要启用定时器0。
以下为改正后的代码:
void UARTInit();
void UARTInit()
{
PCON = 0x7F; //波特率不倍速
SCON = 0x50; //0101 0000 SMO,SM1选择模式;SM2:不允许多机通信;REN:串行接收允许控制; TB8:发送数据的第九位;RB8:接受数据的第九位;TI:发送中断标志;RI:接收中断材
TMOD = 0x20; //设定采用定时器1.并且定时器工作方式2,做为波特率发生器, 8位初值自动重装的8位定时器,定时到TH1的值自动装到TL1
TH1 = 0xFD; //波特率为9600
TL1 = 0xFD;
TR1 = 1;
ES = 1; //打开接收中断
EA = 1;
}
相关问题
#include<stc15.h> void UartInit(void); void main() { unsigned int i; UartInit(); EA=1; ES=1; // while(1) // { // while(!RI); // RI=0; // i=SBUF; // SBUF=i; // while(!TI); // TI=0; //} //for(i=0;i<256;i++) //{ // SBUF=i; // while(!TI); // TI=0; //} // // // while(1); } void uartlsv() interrupt 4 { unsigned char i; if(RI) { RI=0; i=SBUF; if(i==35) { ES=0; for(i=65;i<91;i++) { SBUF=i; // while(!TI); // TI=0; } ES=1; } } } void UartInit(void) //115200bps@11.0592MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设定定时器1为16位自动重装方式 TL1 = 0xE8; //设定定时初值 TH1 = 0xFF; //设定定时初值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 }
这是一段8051单片机的程序,实现了串口通信功能。程序中定义了UartInit()函数用于初始化UART通信参数,main()函数中调用了该函数,并开启了全局中断和串口中断。在串口中断函数uartlsv()中,当接收到字符“#”时,关闭串口中断,循环发送从“A”到“Z”的26个字母,然后再开启串口中断。程序中还有一段注释掉的代码,分别实现了从串口接收数据并发送回去,以及循环发送0到255之间的所有数。
对下面代码进行注释#include <reg52.h> #include <stdio.h> #define uint unsigned int #define uchar unsigned char void delay(uint z) //毫秒级延时函数定义 {uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } void UARTInit() //串口初始化 { SM0 = 0; SM1 = 1; // TR1 = 1; // TMOD |= 0x20; // TH1 = 0xfd; // TL1 = 0xfd; } void main() { UARTInit(); // while(1) { TI = 1; // printf("? "); while(!TI); // TI = 0; // delay(1000); } }
这段代码是基于 8051 单片机的串口通讯程序代码。主要实现了初始化串口并在循环中不断向串口发送字符 "? " 的功能,每次发送完毕后等待 1 秒再继续发送。具体解释如下:
```C
#include <reg52.h> // 8051 单片机寄存器定义头文件
#include <stdio.h> // 标准输入输出头文件
#define uint unsigned int // 定义无符号整型变量 uint
#define uchar unsigned char // 定义无符号字符型变量 uchar
void delay(uint z) // 毫秒级延时函数定义
{
uint x, y;
for(x = z; x > 0; x--) {
for(y = 114; y > 0; y--);
}
}
void UARTInit() // 串口初始化函数
{
SM0 = 0; // 串口工作模式选择,此处选择模式 1
SM1 = 1;
TR1 = 1; // 定时器 1 启动
TMOD |= 0x20; // 定时器 1 工作模式设置,此处选择自动重装载模式
TH1 = 0xfd; // 波特率设置,此处选择 9600bps
TL1 = 0xfd;
}
void main()
{
UARTInit(); // 调用串口初始化函数
while(1) { // 死循环,不断向串口发送数据
TI = 1; // 清空发送标志位
printf("? "); // 向串口发送数据
while(!TI); // 等待发送完成
TI = 0; // 清空发送标志位
delay(1000); // 延时 1 秒
}
}
```
在这段代码中,TI 表示串口发送标志位,当 TI 置 1 时表示串口可以发送数据,程序才会向串口发送数据。在每次发送数据后,程序需要等待串口发送完成,即 TI 标志位被清零,才能继续发送下一个字符。
串口初始化函数 UARTInit() 中的参数设置如下:
- SM0 = 0,SM1 = 1:选择串口工作模式 1,即异步收发模式。
- TR1 = 1:启动定时器 1。
- TMOD |= 0x20:设置定时器 1 工作模式为自动重装载模式。
- TH1 = 0xfd,TL1 = 0xfd:设置波特率为 9600bps。
在主函数中,程序通过死循环不断向串口发送数据,每次发送完毕后延时 1 秒再继续发送。
阅读全文