| 第一,有可能是你的ttl线接触不好,第二,有可能是你波特率设置太高,通讯造成数据丢失,第三,晶振使用的不合理,造成计算出来的波特率误差较大。 |
| ser中断函数,加一个判断RI的语句? |
|
void uart() interrupt 4 { unsigned char date; date = SBUF;//取出接收到的数据 RI = 0;//清除接收中断标志位 SBUF = date;//将接收到的数据放回发送缓存器 while(!TI);//等待发送数据完成 TI = 0;//清除发送中断标志位 } |
| 建议先接收数据,再清中断位,试试 |
| 建议先接收数据,再清中断位,试试 |
本帖最后由 kaixinjiuhao 于 2017-4-8 21:02 编辑 你像风儿来了 发表于 2017-4-8 10:18 那如果用数组的形式来装载输入的字符,那应该怎么编写呢? 比如: #include <reg52.h> #define uchar unsigned char #define uint unsigned int unsigned char flag,a[4],i,j; void init() { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init(); while(1) { if(flag==1) { flag=0; ES=0; SBUF=a[j++]; while(!TI); TI=0; ES=1; //flag=0 } } } void ser() interrupt 4 { RI=0; a[i++]=SBUF; if(i==4) flag=1; } 我将interrupt 4中的a变为数组a,我只输入四个字符,我在interrupt 4中将SBUF中的四个字符全部放到数组中,然后在主函数中显示数组中数值。 这种方法应该怎样实现呢? |
|
#include <reg52.h> #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; void init() { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init(); while(1) { if(flag==1) { flag=0; ES=0; SBUF=a; while(!TI); TI=0; ES=1; //flag=0 } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } 我把你程序改成这样就可以了; 原因是:原来的程序flag=0,写在了最后一句,要把它写在ES=1前面,否则开串口中断的一瞬间程序被中断了,也就是下一个数据收到了,但是程序不会从if()条件那里开始执行,而是从断点开始执行,所以就有数据丢失了 |
| 参与人数 1 | 黑币 +3 | 收起 理由 |
|---|---|---|
|
| + 3 | 很给力! |
| 晶振是多少的? |
imxuheng 发表于 2017-4-7 14:02 加了延时也不行 |