- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
stc89c52rc 单片机串口中断发送问题
stc89c52rc 单片机串口中断发送问题发表于 2014-5-1
00:33:04 2366 查看
20 回复 只看该作者 倒序浏览我用串口中断发送数据,开始单片机发送正常,也 能接受!当我再次将程序烧录到单片机就发现单片机不能正 常工作了!我的单片机晶振是 11.0592M 的。波特率 9600 ! 单片机工作不正常的表现为:单片机运行熟读变得相当相当 慢,比以前慢了许多!不知道是怎么回事,还请各位高手帮 帮忙,看看我的程序哪里出了问题!在此谢过了!
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code ptrData[] ={0x7e,0x04,0xa1,0x00,0x00,0x7e};
//命令//电机正转sbit djz = P 2
//命令
//电机正转
uint txbuffer[];
uint txbuffer[];
//串口发送缓存区
//
//发送状态标志
uint bufferhead,bufferCt;
void init()
TMOD = 0x21;
//定时器 1 工作方式 2,
定时器 0 工作方式 1(用于延迟 )
SCON = 0x50;
TH1 = 0xfd;
//串口 9600 波特率初值
TL1 = 0xfd;
TR1=1;
EA =1;
ES =1;
bufferhead=bufferCt=0;
}void delay(uint i)
uchar j;
while(i--)
for(j=0;j<115;j++)//1ms
for(j=0;j<115;j++)
//1ms 基
准延时程序
}
}
}void uart_senddata(uchar j)
uint i;
for(i=0;i<6;i++)
if(i!=4)
txbuffer[bufferCt]=ptrData[i];// 循
环添加待发送数据
bufferCt++;
if(i==4)
txbuffer[i]=j;
bufferCt++;
TI=1;
//命令数据存缓存期完毕后,立刻触发串口发送中断
}void main()
init();
delay(200);
uart_senddata(4);
delay(100);
while(1)
djz=0;
delay(500);
djz=1;
delay(500);
}void uart_int(void) interrupt 4
if(TI)
TI=0;
if(bufferCt)
SBUF=txbuffer[bufferhead++];
bufferCt--;
if(bufferCt==0)
bufferhead = 0;
//当发送数据个数大于 16 时, bufferhead 清零
}你是不是烧录的时候没有设置晶振的参数啊
我用的 stc-isp 下载软件,对于这个单片机不需要设置晶振参 数啊
我也看不懂你的程序,不过有一点,如果你的单片机
也接收数据,那么串口中断里面也要对串口接收触发的中断 进行处理,就是清 RI, 如果不清除则不断触发中断。谢谢你 的帮助,还真是这个 RI 搞的鬼!一般串口发送是不用中断 的窝,因为发送是主动的。接收才用中断,因为接收是被动 的。可以参考 stc 官网手册,发送一般用
SBUF = temp;
while(!TI);
TI =0 ;
这样的结构。问题解决就好,一般串口中断都要判断TI
这样的结构。问题解决就好,一般串口中断都要判断
TI 和
RI. 清零再做出对应的中断操作 .恩恩,这个我知道,主要是
开始我发这个数据的时候,时间有点长,照成我的数码管在 扫描显示的时候发生抖动!当时是想到这么写,所以就这么 弄了,用数码管中断扫描显示也能达到目标!只是上次遇到 这个,想摸清这个原因! 不过同样谢谢你的热心回答, 谢谢! 可以用定时器中断不断扫描数码管,那么就不会出现抖动了。
文档评论(0)