使用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;
}
}
*/
此帖出自
小平头技术问答
他不用中断发送,在while(1)里发送的,当然用不上,开启了就容易出错了,楼主的失败关键就是由于开启了这个中断使能位,结果程序跑到0x0023处执行去了,而那里就不知道是什么指令了,编译器分配的,可以反汇编分析下的,但肯定不是设计者想要的。
但是延时发送为什么没出错呢?那是碰巧了,编译器分配0023处指令太碰巧无关了,但是编程思路是绝对错误的。
另外他也没有接收串行数据的程序,所以无需开启串行中断。
=====================================================
编程要点:如果开启了某中断使能位,一定要设置一个与之对应的intrrupt() n {}函数,哪怕里面啥也没有空的都行;否则程序就非常容易出错了。
一周热门 更多>