#define TH1 (256 - FOSC / 12 / BAUD) void Usart_Init() { TMOD &= 0x0F; // 设置定时器 1 为模式 1 TMOD |= 0x20; SCON = 0x50; // 设置串口工作在方式 1 TH1 = TH1; TL1 = TH1; TR1 = 1; // 启动定时器 1 ES = 1; // 允许串口中断 EA = 1; // 开启总中断 } 该程序出现了问题: USART.H(7): error C213: left side of asn-op not an lvalue 请问怎么解决
时间: 2024-02-04 14:01:47 浏览: 25
根据错误提示,可以看出问题出在赋值语句的左值不是一个 lvalue(左值),这通常是因为我们试图对一个不可修改的值进行赋值操作。
在这个程序中,出现问题的代码是 TH1 = TH1;,其中 TH1 是一个宏定义,它被定义为一个常量表达式,因此不能被修改。实际上,这行代码是在设置波特率发生器的初值,我们应该将其替换为 TH1 = 256 - FOSC / 12 / BAUD;。
修改后的程序如下:
```
#define TH1 (256 - FOSC / 12 / BAUD)
void Usart_Init() {
TMOD &= 0x0F; // 设置定时器 1 为模式 1
TMOD |= 0x20;
SCON = 0x50; // 设置串口工作在方式 1
TH1 = 256 - FOSC / 12 / BAUD;
TL1 = TH1;
TR1 = 1; // 启动定时器 1
ES = 1; // 允许串口中断
EA = 1; // 开启总中断
}
```
相关问题
#include <reg51.h> #include <stdio.h> #include <stdlib.h> int a; char c; #define FOSC 11059200L #define BAUD 9600 void Usart_Init() { TMOD &= 0x0F; TMOD |= 0x20; SCON = 0x50; TH1 = (256 - FOSC / 12 / BAUD); TL1 = TH1; TR1 = 1; // 启动定时器 1 ES = 1; // 允许串口中断 EA = 1; // 开启总中断 } void Usart_SendChar(char c) { TI = 0; // 清除发送完成标志 SBUF = c; while (!TI); // 等待发送完成 } void Usart_String(char *s) { while (*s) { Usart_SendChar(*s++); } } char Usart_ReceiveChar() { while (!RI); // 等待接收完成 RI = 0; // 清除接收完成标志 return SBUF; } int Usart_ReceiveString(char *s) { char c; while ((c = Usart_ReceiveChar()) != '\r') { *s++ = c; Usart_SendChar(c); // 回显 } *s = 0; } 修改为主机AT89C51通过P3.1口向从机AT89C51P3.0口输出数据的头文件
#include <reg51.h>
#include <stdio.h>
#include <stdlib.h>
int a;
char c;
#define FOSC 11059200L
#define BAUD 9600
sbit TX = P3^1; // 将TX引脚定义为P3.1
sbit RX = P3^0; // 将RX引脚定义为P3.0
void Usart_Init()
{
TMOD &= 0x0F;
TMOD |= 0x20;
SCON = 0x50;
TH1 = (256 - FOSC / 12 / BAUD);
TL1 = TH1;
TR1 = 1;
ES = 1;
EA = 1;
}
void Usart_SendChar(char c)
{
TI = 0;
SBUF = c;
while (!TI);
}
void Usart_String(char *s)
{
while (*s)
{
Usart_SendChar(*s++);
}
}
char Usart_ReceiveChar()
{
while (!RI);
RI = 0;
return SBUF;
}
int Usart_ReceiveString(char *s)
{
char c;
while ((c = Usart_ReceiveChar()) != '\r') {
*s++ = c;
Usart_SendChar(c);
}
*s = 0;
}
#define USART_REC_LEN 100 //定义最大接收字节数 200 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. u16 USART_RX_STA=0; //接收状态标记 void uatr() interrupt 4///中断服务、、 { if(RI==1) { RI=0; if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=SBUF ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } }
这是一段8051单片机的UART串口接收中断服务程序,主要功能是接收串口数据并存储到一个缓冲区中,同时记录接收状态。其中USART_REC_LEN定义了接收缓冲区的最大字节数,USART_RX_BUF为接收缓冲区,USART_RX_STA为接收状态标记。当接收到一个字节时,首先判断是否接收完成,如果接收未完成,则判断是否接收到了0x0D(回车符),如果接收到了,则将接收状态标记置位为0x8000,表示接收完成;如果还没收到0x0D,则将接收的数据存储到接收缓冲区中,同时更新接收状态标记。如果接收的数据超出了缓冲区最大字节数,则将接收状态标记清零,重新开始接收。