新手求助,51串口每秒发送数据。

2019-03-24 19:59发布

使用delay函数能串口能接收到字符串。但是,中断就悲剧了想来很久,还是不知道原因在哪里。求解。。。





#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16;
uint16 cnt=0;
uint8 Buf[]="hello world! ";
void delay(uint16 ms){ uint8 i; while(ms--) { for(i=0;i<120;i++); }

}
void UART_init(void){
ES=1; EA=1;
SCON=0x50; TMOD=0x20;// TMOD=0x21; PCON=0x00;   
// TH0=0xD8; //设置定时器0// TL0=0xF0;

TH1=0xFA; //设置波特率 TL1=0xFA;
// TR0=1; TR1=1;
// ET0=1; ET1=0;}
void UART_send_byte(uint8 dat){ SBUF=dat; while(TI==0); TI=0;}
void UART_send_string(uint8 *buf){ while(*buf!='') { UART_send_byte(*buf++); }}
main(){ UART_init(); while(1) { UART_send_string(Buf); delay(1000); }// while(1);}/*void timeint() interrupt 1{
cnt++; TH0=0xD8; TL0=0xF0; if(cnt==200) { UART_send_string(Buf); cnt=0; }

} */ 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
xu__changhua
1楼-- · 2019-03-24 23:20
你的ES=1语句用的错误。
程序编的子程序嵌套级数也不必那么多。
xu__changhua
2楼-- · 2019-03-25 02:25
SCON=0x50
你的程序中没有看到接收模块,干嘛要REN=1?改SCON=0x50为SCON=0x40
xu__changhua
3楼-- · 2019-03-25 05:03

试试看帮你修改了的程序

jckimi
4楼-- · 2019-03-25 09:09
ES不是串口中断使能位么,不明白为什么要去掉。
xu__changhua
5楼-- · 2019-03-25 13:47

原帖由 jckimi 于 2011-5-11 19:35 发表 ES不是串口中断使能位么,不明白为什么要去掉。

 

他不用中断发送,在while(1)里发送的,当然用不上,开启了就容易出错了,楼主的失败关键就是由于开启了这个中断使能位,结果程序跑到0x0023处执行去了,而那里就不知道是什么指令了,编译器分配的,可以反汇编分析下的,但肯定不是设计者想要的。

 

但是延时发送为什么没出错呢?那是碰巧了,编译器分配0023处指令太碰巧无关了,但是编程思路是绝对错误的。

 

另外他也没有接收串行数据的程序,所以无需开启串行中断。

=====================================================

 

编程要点:如果开启了某中断使能位,一定要设置一个与之对应的intrrupt() n {}函数,哪怕里面啥也没有空的都行;否则程序就非常容易出错了。

辛昕
6楼-- · 2019-03-25 18:43
 精彩回答 2  元偷偷看……

一周热门 更多>