stc89c52rc单片机串口中断发送问题

2019-07-15 19:56发布

我用串口中断发送数据,开始单片机发送正常,也能接受!当我再次将程序烧录到单片机就发现单片机不能正常工作了!我的单片机晶振是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 = P2^4;                        //电机正转
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基准延时程序
                { ;        }
        }
}


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清零               
                        }
                }                               
        }       
}



               


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
依然落叶飘零
1楼-- · 2019-07-16 14:03
Keil_ㄨ_亻訁仰 发表于 2014-5-1 11:13
我就是让单片机while(1)前面发送了几个数据,但是数据发完了的话TI就被软件置零了,就不会再进发送中断了 ...

我也看不懂你的程序,不过有一点,如果你的单片机也接收数据,那么串口中断里面也要对串口接收触发的中断进行处理,就是清RI,如果不清除则不断触发中断。
发烧友之麒麟
2楼-- · 2019-07-16 17:20
发烧友之麒麟 发表于 2014-5-1 08:49
你是不是烧录的时候没有设置晶振的参数啊

你把那延时函数的j<115改为j<111看看
Keil_ㄨ_亻訁仰
3楼-- · 2019-07-16 17:42
发烧友之麒麟 发表于 2014-5-1 12:40
你把那延时函数的j

谢谢您帮助,8楼的回答解决了问题!
Keil_ㄨ_亻訁仰
4楼-- · 2019-07-16 23:16
依然落叶飘零 发表于 2014-5-1 11:35
我也看不懂你的程序,不过有一点,如果你的单片机也接收数据,那么串口中断里面也要对串口接收触发的中断 ...

谢谢你的帮助,还真是这个RI搞的鬼!
依然落叶飘零
5楼-- · 2019-07-17 02:20
 精彩回答 2  元偷偷看……
爱我别走
6楼-- · 2019-07-17 04:21
Keil_ㄨ_亻訁仰 发表于 2014-5-1 10:38
打错字啦,就是单片机的运行速度变得慢了许多!比如像我让主程序点一个led灯,我让led亮灭的时间为500毫 ...

一般串口发送是不用中断的窝,因为发送是主动的。接收才用中断,因为接收是被动的。可以参考stc官网手册,发送一般用
SBUF = temp;
while(!TI);
TI =0 ;
这样的结构。

一周热门 更多>