标题:
单片机定时器与串口中断不能一起吗?
[打印本页]
作者:
hfsdage
时间:
2016-6-7 19:03
标题:
单片机定时器与串口中断不能一起吗?
这个源码烧入单片机后好像不行,单片机没串口数据的时候就是开机的时候是正常的,一有数据了定时器0就挂了,就不会动了,求大神看看什么问题
#include<reg52.h>
#include<STDIO.H>//printf()
#define uchar unsigned char
#define uint unsigned int //宏定义
bit RXAAOK; //接收到[开头标志
bit RXFRMOK; //接收一帧完整数据标
bit tflag;
sbit S1=P0^0;
sbit S2=P0^2;
sbit S3=P0^3;
sbit S4=P0^1;
sbit FM=P0^4;
sbit DS=P0^5;
sbit keypad1=P1^0;
sbit keypad2=P1^1;
sbit keypad3=P1^2;
sbit keypad4=P1^3;
/*下面是数码管位选*/
sbit one=P1^4;
sbit two=P1^5;
sbit three=P1^6;
/*char code table[]={ 0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};*/
uint temp;
uchar ketnum,t,RXBUF[10],RX_P;
void main()
{
IP = 0x10; //即设置串口中断为最高优先级
TMOD=0x21; //定时器1的工作方式2,定时器0的工作方式1,16位
TH1=0xfd; //定时器1的初值,决定波特率9600
TL1=0xfd;
TH0=0X4C; //高八位的初值 50MS一次
TL0=0X00; //第八位的初值
PCON=0x00; //波特率倍增0x00不加倍 0x80加倍
SCON=0x50; //设置工作方式1 开启接受允许
EA=1; //开启总中断
ES=1; //开启串口接受中断
ET0=1; //允许定时器0发出中断
TR1=1; //计数器1开始运行
TR0=1; //计数器0开始运行
while(1)
{
if(RXFRMOK)
{
switch(RXBUF[0])
{
case 'A' : S1=~S1;
}
}
}
}
void UARTO_ISR() interrupt 4 //接收中断,不同处理器可能是不同的函数声明
{
uchar i; //用处提取接收缓冲器的字符
if(RI)
{
i=SBUF; //提取字符
RI=0;
if(RXFRMOK==0) //判断是否接收到起始字符[
{
if(RXAAOK) //如果接收到[,继续接收后面的字符
{
RXBUF[RX_P]=i; //字符存入数组
if((RX_P>3)&&(RXBUF[RX_P-3]==0x7C)&&(RXBUF[RX_P-2]==0x7D)&&(RXBUF[RX_P-1]==0x7E)&&(RXBUF[RX_P]==0x5D) )
{
RXFRMOK=1; //如果接收完成,置位RXFRMOK;
RXAAOK=0; //清零开始标志位RXAAOK
}
RX_P++; //接收计数器加一
}
if(!RXAAOK&&(i==0x5B)) //字符[,协议格式:[数据|}~]
{
RXAAOK=1;
RX_P=0;
}
}
}
}
void Timer0() interrupt 1
{
TH0=0x4C;
TL0=0x00;
t++;
S1=~S1; //PC串口发送数据过来后S1就不会翻转了
}
复制代码
作者:
flame1o
时间:
2016-12-23 13:42
标志位放在最后清零试试
作者:
飒飒冷遇
时间:
2017-2-20 22:34
楼主这个问题解决了么?解决了告诉我啊啊。
作者:
MCU爱好者
时间:
2017-2-21 08:53
同求这个问题
作者:
期待和努力
时间:
2017-12-3 13:31
解决了许多长期想解决
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1