51单片机向电脑发送数据。显示00错误解决方法!!!

本文详细探讨了嵌入式编程中函数部分的延时错误、串口通信的常见问题以及主函数的注意事项,特别关注了如何正确初始化串口,如UartInit函数中的波特率设置和定时器配置,提醒读者参考相关文档以适应不同芯片的参数。
摘要由CSDN通过智能技术生成

一、函数部分错误

1、延时部分的错误

二、串口部分常见错误

三、主函数问题

四、串口初始化

//最好参考文档来写,因为每个芯片都有可能不一样的参数

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

以下是基本代码: ```c #include <reg51.h> #define FOSC 18432000ul // 时钟频率 #define BAUD 9600ul // 波特率 #define DIV_THX(x) ((char)(256 - (FOSC / (12ul * BAUD * x)))) void init_uart() // 初始化串口 { // 配置波特率 TMOD |= 0x20; // 采用定时器1作为波特率发生器 TH1 = DIV_THX(1); // 波特率发生器初值 TL1 = DIV_THX(1); // 波特率发生器重装值 TR1 = 1; // 启动波特率发生器 // 配置数据格式 SCON = 0x50; // 工作在模式1(8位数据,可变波率) ES = 1; // 允许接收中断 EA = 1; // 全局中断使能 } void send_data(char c) // 发送1个字节 { SBUF = c; while(!TI); // 等待发送完成 TI = 0; // 发送完成标志清零 } void send_string(char *s) // 发送字符串 { while(*s != '\0') { send_data(*s); s++; } } char receive_data() // 接收1个字节 { while(!RI); // 等待接收完成 RI = 0; // 接收完成标志清零 return SBUF; } void receive_string(char *s) // 接收字符串 { do { *s = receive_data(); s++; } while(*(s-1) != '\r'); // 输入回车结束 *(s-1) = '\0'; // 字符串结束符 } void main() { init_uart(); while(1) { char s[50]; send_string("Input some data: "); receive_string(s); // 接收字符串 send_string("Received data: "); send_string(s); // 发送字符串 send_data('\n'); send_data('\r'); } } void uart_interrupt() interrupt 4 // 串口中断处理程序 { if(RI) { RI = 0; // 接收完成标志清零 // 收到数据以后的处理 } if(TI) { TI = 0; // 发送完成标志清零 // 发送下一个数据 } } ``` 请注意:这篇文章只是代码的展示,为了编写代码的完整性和清晰性,省略了相关说明和注释。如果您要使用这段代码,请认真阅读详细的说明和注释,避免出现任何的错误和问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值