新手求助,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条回答
辛昕
1楼-- · 2019-03-25 23:54
额,想问一下,串口下,定时器1用作波特率发生器,是不是说,不开这个定时器中断也可以?
xu__changhua
2楼-- · 2019-03-26 00:54
原帖由 辛昕 于 2011-5-11 23:52 发表 额,想问一下,串口下,定时器1用作波特率发生器,是不是说,不开这个定时器中断也可以?
按你说的话那就规定不能开这个中断!开了就不合理了。
she1987
3楼-- · 2019-03-26 04:25
在串口下,用定时器1作波特率发生器,若将定时器1 设置在工作方式2下,即当定时器计满溢出后,单片机自动为其装初值,可不开定时器中断,其它方式必须开定时器中断,重新为定时器赋初始值。建议在串口下,最好将定时器设置在工作方式2下,这样波特率才会准确。
she1987
4楼-- · 2019-03-26 09:56
T1定时器设置在工作试2,可自动重载初始值,不需要开中断。
xu__changhua
5楼-- · 2019-03-26 11:42
原帖由 she1987 于 2011-5-12 10:28 发表 在串口下,用定时器1作波特率发生器,若将定时器1 设置在工作方式2下,即当定时器计满溢出后,单片机自动为其装初值,可不开定时器中断,其它方式必须开定时器中断,重新为定时器赋初始值。建议在串口下,最好将定时 ...

原帖由 she1987 于 2011-5-12 10:28 发表 在串口下,用定时器1作波特率发生器,若将定时器1 设置在工作方式2下,即当定时器计满溢出后,单片机自动为其装初值,可不开定时器中断,其它方式必须开定时器中断,重新为定时器赋初始值。建议在串口下,最好将定时 ...

理论上是如你所说,实践中方式1几乎不用,除非在非常低速场合下方式2解决不了问题了。

定时器1只有三种方式(0,1,2),除了方式2外,就方式1了,因为方式0是为了兼容早起8048单片机而设置的,方式0能解决的,方式1没有解决不了的。

方式1重装初值只能用在低速传输场合,如50,300,其波特率也还是不准的;到几千以上时如4800,9600,19200根本不能产生正确的波特率,因为中断响应需要时间(3-8个机器周期)、执行重装初值(也包括执行RETI)的时间已经远远大于定时器计数空间了。

所以实际上绝大多数都用方式2不中断能获得标准波特率其误差仅取决于时钟。

she1987
6楼-- · 2019-03-26 16:34
 精彩回答 2  元偷偷看……

一周热门 更多>