两个stm32定时器中断嵌套串口中断和串口中断如何同时工作

21ic官方微信-->
定时器0的中断和串口中断不能同时工作么
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
定时器0的中断和串口中断不能同时工作么
资深工程师, 积分 15310, 距离下一级还需 4690 积分
资深工程师, 积分 15310, 距离下一级还需 4690 积分
资深工程师, 积分 15310, 距离下一级还需 4690 积分
资深工程师, 积分 15310, 距离下一级还需 4690 积分
就这一句话?
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
有2个单片机组成双向通信,一个主机一个从机,主机每20ms采集一次数据并向从机发送一次,从机用while(1)循环不停地向主机发送数据。程序都没有问题。现在的问题就是在主机,无论我用while(1)不停地接收数据还是用串口中断的方式接收,都接收不到从从机发过来的数据。
资深工程师, 积分 12491, 距离下一级还需 7509 积分
资深工程师, 积分 12491, 距离下一级还需 7509 积分
资深工程师, 积分 12491, 距离下一级还需 7509 积分
资深工程师, 积分 12491, 距离下一级还需 7509 积分
程序是不是有问题啊
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
可能就是有些原理性的问题
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
什么意思?
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
譬如中断优先级或者其他的
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
主机程序:
#include &STRING.H&
#include&REG52.H&
#define _MHZ_ 11& &
LED1=P0^0;
LED2=P0^1;
P0_2=P0^2;
P0_3=P0^3;
P0_6=P0^6;
P0_7=P0^7;
LED3=P1^0;
LED4=P1^1;
LED5=P1^2;
P1_3=P1^3;
P1_4=P1^4;
P1_5=P1^5;
P2_0=P2^0;
P2_1=P2^1;
P2_2=P2^2;
P2_3=P2^3;
P2_4=P2^4;
P2_5=P2^5;
P2_6=P2^6;
unsigned char data1[6];
unsigned char data2[6];
void init_serial0();
void init_serial1();& &
void coll_data() ;& &
void send_data(unsigned char *data1);&&
void recv_data(unsigned char *data2);
void delay10ms(unsigned int count);& &&&
unsigned char ecc=0x00;
/*************** 延时程序*********** */
void delay10ms(unsigned int count)
for(i=0; i& i++)
for(j=0; j&200; j++);
//for(k=0; k&150; k++);
/******************采集数据**********************/
void coll_data()
data1[0]=0xC5;
data1[1]=0xFF;
data1[2]=0xF6;
data1[3]=0xC8;
/***************** ******************/
/*****************?1******************/
&&delay10ms(1);
& & if(K1==0)
data1[1]=data1[1]&0x7F;
& & if(K2==0)
&&delay10ms(1);
& & if(K2==0)
data1[1]=data1[1]&0xBF;
&&delay10ms(1);
& & if(K3==0)
data1[1]=data1[1]&0xDF;
& & if(K4==0)
&&delay10ms(1);
& & if(K4==0)
data1[1]=data1[1]&0xEF;
& & if(K5==0)
&&delay10ms(1);
& & if(K5==0)
data1[1]=data1[1]&0xF7;
data1[4]=0xC5+ data1[1]+ 0xF6+0xC8;//D£?é×??ú£?oí×??ˉò?3?è?×?μí8??
/****************** ·发送数据 **********************/
void send_data(unsigned char *data1)
/* ·¢?íêy?Y */
for(i=0; i&5; i++)
SBUF = data1[i];& &
while(!TI);
& &/****************串口初始化********************/
void init_serial1()
TMOD = 0x20;
TH1 = 250;& &
TL1 = 250;
TR1 = 1;& &
PCON = 0x80;& &
SCON = 0x50;
/* *****************?¨ê±?÷0 **********************/
void init_serial0()
TMOD = 0x10;
TH0 = 0xB8;& &
TL0 = 0x00;
TR0 = 1;& &
/*************** 定时器0中断*********** */
void timer0_int () interrupt 1 using 1
TH0 = 0xB8;& &
TL0 = 0x00;
send_data(data1);
coll_data();
/* 接收数据*/
void recv_data(unsigned char *data2)
/* ?óê?êy?Y */
for(i=0; i&5; i++)
while(!RI);
data2[i] = SBUF;& &
ecc=(data2[0])+(data2[1])+(data2[2])+(data2[3]);
data2[5]=0;
if((data2[0]==0xA5)&&(data2[4]==ecc))
& & if((data2[1]&0x80)==0x80)&&
& &LED1=1;
& && & LED1=0;
& &if((data2[1]&0x40)==0x40)
& &LED2=1;
& && &LED2=0;
& & if((data2[1]&0x20)==0x20)
& &LED3=1;
& &&&LED3=0;
& & if((data2[1]&0x10)==0x10)
& && & LED4=1;
& && &LED4=0;
& & if((data2[1]&0x08)==0x08)
& &LED5=1;
& &&&LED5=0;
/* **********************主程序******************** */
void main(void)
init_serial1();&&//串口初始化
init_serial0();&&//启动定时器0
recv_data(data2); //接收程序
//////串口中断///////////
void Serial_INT() interrupt 4
/* ?óê?êy?Y */
for(i=0; i&5; i++)
while(!RI);
data2[i] = SBUF;& &
ecc=(data2[0])+(data2[1])+(data2[2])+(data2[3]);
data2[5]=0;
& & // ±íê?êy?Y?áê?
/* 如果接收到程序,使灯亮 */
//if((data2[0]==0xA5)&&(data2[4]==ecc))
& & if((data2[1]&0x80)==0x80)&&
& &LED1=1;
& && & LED1=0;
& &if((data2[1]&0x40)==0x40)
& &LED2=1;
& && &LED2=0;
& & if((data2[1]&0x20)==0x20)
& &LED3=1;
& &&&LED3=0;
& & if((data2[1]&0x10)==0x10)
& && & LED4=1;
& && &LED4=0;
& & if((data2[1]&0x08)==0x08)
& &LED5=1;
& &&&LED5=0;
资深工程师, 积分 14010, 距离下一级还需 5990 积分
资深工程师, 积分 14010, 距离下一级还需 5990 积分
资深工程师, 积分 14010, 距离下一级还需 5990 积分
资深工程师, 积分 14010, 距离下一级还需 5990 积分
有一定难度呀
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
怎么用11MHZ的晶振呢?11.0592MHZ会更好点
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
还有延时程序写的不是很刁,应该这样:
void delay(uint z)
& &for(z;z&0;z--)
& && & for(j=110;j&0;j--);
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
楼主在中断发送数据,建议改到主函数里面发送比较好
资深工程师, 积分 13139, 距离下一级还需 6861 积分
资深工程师, 积分 13139, 距离下一级还需 6861 积分
资深工程师, 积分 13139, 距离下一级还需 6861 积分
资深工程师, 积分 13139, 距离下一级还需 6861 积分
这种问题如何解决的呢?现在我也遇到这种问题,定时器0和串口中断一起时,程序跑起来会出错(1.定时器不起作用& &或2.定时器不准) ,若单独工作时,就不会出错。。& & 请指教一下,查了很久了这个问题
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
可以同时工作,两个中断向量
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
/****************串口初始化********************/
void init_serial1()
TMOD = 0x20;
TH1 = 250;& &
TL1 = 250;
TR1 = 1;& &
PCON = 0x80;& &
SCON = 0x50;
/* *****************?¨ê±?÷0 **********************/
void init_serial0()
TMOD = 0x10;
TH0 = 0xB8;& &
TL0 = 0x00;
TR0 = 1;& &
第2組初始化會不會將 TIMER1 模式2 改為 模式1 的可能
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽
技术总监, 积分 41698, 距离下一级还需 8302 积分
技术总监, 积分 41698, 距离下一级还需 8302 积分
技术总监, 积分 41698, 距离下一级还需 8302 积分
技术总监, 积分 41698, 距离下一级还需 8302 积分
这肯定是程序问题,51这么成熟的内核不可能犯这么低级的错误
扫描二维码,随时随地手机跟帖
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
您需要登录后才可以回帖后使用快捷导航没有帐号?
请完成以下验证码
查看: 3867|回复: 15
两个定时器和串口中断如何同时工作?
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
c51我不太熟悉,现在我用c8051编程,碰到这个问题,不知道怎么弄,定时器0用来扫描键盘,串口用来发送数据,定时器1用来其他计数,请各位大侠介绍下经验,应该怎么做?
最好是列代码出来。
void init_serialcomm( void )
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFA ; //Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
& & & & EA = 1;& & & & & & & & & & & & & & & & //允许CPU中断
& & & & ET0 = 1; & & & & & & & & & & & & & & & & //定时器0中断打开
& & & & ET1=1;
& & & & TMOD = 0x1;& & & & & & & & & & & & //设定时器0为模式1,16位模式
& & & & TH0=0xB1;
& & & & TL0=0xDF;& & & & & & & & & & & & & & & & //设定时值为20000us(20ms)
& & & & TR0 = 1;
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
串口本身就要用一个定时器。扫描为什么要用定时器啊?
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
是什么芯片?波特率发生首先要用掉一个定时器,你可以把扫描按键和计数合到一个定时器去做,或者用定时器T2
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
请问用上定时器T2代码怎么写的?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
89c52有T2,可以用来作波特率发生器。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
具体可以看下AT89C52芯片手册,自己就可以搞定的
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
对了,是stc89c52芯片,我网上买的现成开发板,所以没有pdf文档,能不能帮我写写?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用 7 楼 gzhjic 的回复:
对了,是stc89c52芯片,我网上买的现成开发板,所以没有pdf文档,能不能帮我写写?网上都有STC89c52的手册啊,Google一下
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
52本身就只有两个定时,一个要为串口使用,所以你的键盘扫描可以放在主程序中,定时0为串口使用,定时1作为计数
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
你买的开发板应该有资料的啊,你问一下买家要资料啊
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用楼主 gzhjic 的回复:
c51我不太熟悉,现在我用c8051编程,碰到这个问题,不知道怎么弄,定时器0用来扫描键盘,串口用来发送数据,定时器1用来其他计数,请各位大侠介绍下经验,应该怎么做?
最好是列代码出来。
void init_serialcomm( void )
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFA ; //Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
EA = 1; //允许CPU中断
ET0 = 1; //定时器0中断打开
TMOD = 0x1; //设定时器0为模式1,16位模式
TL0=0xDF; //设定时值为20000us(20ms)
其实这个不是互相冲突的,Timer1被用于设置UART的波特率,只要使能中断还是可以照样进入中断1计数的,只是你每次进入定时器中断1的时间是固定的,按照UART里面设置的时间为准,但您可以通过计数来控制时间。至于定时器中断0丝毫没有影响。三个完全可以一起工作。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一个定时器和一个串口我是可以正常工作,原来我是想一个串口加两个定时器,因为TR0是定时器,TR1是串口,我想第二个定时器应该是TR2之类的,不过资料好像不是这么写的,所以想看大家碰到两个定时器以上加串口通讯时一般是怎么处理的?如果用定时器0联合count0++,count1++。。。来做好像有点误差,不过估计也是一种好办法,键盘扫描放在主程序建议应该不错,多谢各位的回答。
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
#define uint& &unsigned int& &
(uint)RCAP2L=65536-18;& && & & & //2
//(uint)RCAP2L=65536-20;&&//M
T2CON =0x34;& && && && & & & //TC2作为串行通讯波特率发生器
SCON&&=0x50;& && && && & & & //方式1,允许中断
复制代码
这是TC2作为串口波特率发生器的方法.
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
将按键扫描和你的计数共用一个
EEWORLD 官方微信
Powered by52单片机的两个定时器如何同时工作,一个为串口,一个定时,
52单片机的两个定时器如何同时工作,一个为串口,一个定时,定时器是否和占用CPU资源
09-05-05 &
baidu我以前做实验的时候发现,用单片机串口工作方式一给计算机发数据并不能准确的发过去,经常是发一个0x00,计算机收到的可能是0xFE。我老师分析说可能是出现丢码现象,后来我的解决方法是设置用单片机的串口工作方式三发送数据,也就是多发一位数据,但计算机是忽略多发的那一位的。这多发的一位只是为了保证不会丢码。 你的VB程序我看不懂,但我建议是这样: 1:先去下一个通用的串口调试软件代替你的VB程序,用你原来单片机的程序给计算机发数据,这样如果串口调试软件接收到的数据是正确,说明你的VB程序问题。 2:如果上述方法接收的还是错误数据,则建议把单片机串口工作方式改成方式三,波特率和其他的不用变。再然串口调试软件接收数据看看。 另外:“PCON=0x00; //开总中断,开串口中断” PCON不是中断控制器,下面那句才是。 开中断。
请登录后再发表评论!两个定时器和串口中断如何同时工作?
[问题点数:50分,结帖人gzhjic]
本版专家分:5
结帖率 100%
CSDN今日推荐
本版专家分:5
本版专家分:5
本版专家分:5
本版专家分:5
本版专家分:5
匿名用户不能发表回复!|
其他相关推荐21ic官方微信-->
定时器0的中断和串口中断不能同时工作么
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
定时器0的中断和串口中断不能同时工作么
资深工程师, 积分 15310, 距离下一级还需 4690 积分
资深工程师, 积分 15310, 距离下一级还需 4690 积分
资深工程师, 积分 15310, 距离下一级还需 4690 积分
资深工程师, 积分 15310, 距离下一级还需 4690 积分
就这一句话?
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
有2个单片机组成双向通信,一个主机一个从机,主机每20ms采集一次数据并向从机发送一次,从机用while(1)循环不停地向主机发送数据。程序都没有问题。现在的问题就是在主机,无论我用while(1)不停地接收数据还是用串口中断的方式接收,都接收不到从从机发过来的数据。
资深工程师, 积分 12491, 距离下一级还需 7509 积分
资深工程师, 积分 12491, 距离下一级还需 7509 积分
资深工程师, 积分 12491, 距离下一级还需 7509 积分
资深工程师, 积分 12491, 距离下一级还需 7509 积分
程序是不是有问题啊
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
可能就是有些原理性的问题
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
什么意思?
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
譬如中断优先级或者其他的
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
主机程序:
#include &STRING.H&
#include&REG52.H&
#define _MHZ_ 11& &
LED1=P0^0;
LED2=P0^1;
P0_2=P0^2;
P0_3=P0^3;
P0_6=P0^6;
P0_7=P0^7;
LED3=P1^0;
LED4=P1^1;
LED5=P1^2;
P1_3=P1^3;
P1_4=P1^4;
P1_5=P1^5;
P2_0=P2^0;
P2_1=P2^1;
P2_2=P2^2;
P2_3=P2^3;
P2_4=P2^4;
P2_5=P2^5;
P2_6=P2^6;
unsigned char data1[6];
unsigned char data2[6];
void init_serial0();
void init_serial1();& &
void coll_data() ;& &
void send_data(unsigned char *data1);&&
void recv_data(unsigned char *data2);
void delay10ms(unsigned int count);& &&&
unsigned char ecc=0x00;
/*************** 延时程序*********** */
void delay10ms(unsigned int count)
for(i=0; i& i++)
for(j=0; j&200; j++);
//for(k=0; k&150; k++);
/******************采集数据**********************/
void coll_data()
data1[0]=0xC5;
data1[1]=0xFF;
data1[2]=0xF6;
data1[3]=0xC8;
/***************** ******************/
/*****************?1******************/
&&delay10ms(1);
& & if(K1==0)
data1[1]=data1[1]&0x7F;
& & if(K2==0)
&&delay10ms(1);
& & if(K2==0)
data1[1]=data1[1]&0xBF;
&&delay10ms(1);
& & if(K3==0)
data1[1]=data1[1]&0xDF;
& & if(K4==0)
&&delay10ms(1);
& & if(K4==0)
data1[1]=data1[1]&0xEF;
& & if(K5==0)
&&delay10ms(1);
& & if(K5==0)
data1[1]=data1[1]&0xF7;
data1[4]=0xC5+ data1[1]+ 0xF6+0xC8;//D£?é×??ú£?oí×??ˉò?3?è?×?μí8??
/****************** ·发送数据 **********************/
void send_data(unsigned char *data1)
/* ·¢?íêy?Y */
for(i=0; i&5; i++)
SBUF = data1[i];& &
while(!TI);
& &/****************串口初始化********************/
void init_serial1()
TMOD = 0x20;
TH1 = 250;& &
TL1 = 250;
TR1 = 1;& &
PCON = 0x80;& &
SCON = 0x50;
/* *****************?¨ê±?÷0 **********************/
void init_serial0()
TMOD = 0x10;
TH0 = 0xB8;& &
TL0 = 0x00;
TR0 = 1;& &
/*************** 定时器0中断*********** */
void timer0_int () interrupt 1 using 1
TH0 = 0xB8;& &
TL0 = 0x00;
send_data(data1);
coll_data();
/* 接收数据*/
void recv_data(unsigned char *data2)
/* ?óê?êy?Y */
for(i=0; i&5; i++)
while(!RI);
data2[i] = SBUF;& &
ecc=(data2[0])+(data2[1])+(data2[2])+(data2[3]);
data2[5]=0;
if((data2[0]==0xA5)&&(data2[4]==ecc))
& & if((data2[1]&0x80)==0x80)&&
& &LED1=1;
& && & LED1=0;
& &if((data2[1]&0x40)==0x40)
& &LED2=1;
& && &LED2=0;
& & if((data2[1]&0x20)==0x20)
& &LED3=1;
& &&&LED3=0;
& & if((data2[1]&0x10)==0x10)
& && & LED4=1;
& && &LED4=0;
& & if((data2[1]&0x08)==0x08)
& &LED5=1;
& &&&LED5=0;
/* **********************主程序******************** */
void main(void)
init_serial1();&&//串口初始化
init_serial0();&&//启动定时器0
recv_data(data2); //接收程序
//////串口中断///////////
void Serial_INT() interrupt 4
/* ?óê?êy?Y */
for(i=0; i&5; i++)
while(!RI);
data2[i] = SBUF;& &
ecc=(data2[0])+(data2[1])+(data2[2])+(data2[3]);
data2[5]=0;
& & // ±íê?êy?Y?áê?
/* 如果接收到程序,使灯亮 */
//if((data2[0]==0xA5)&&(data2[4]==ecc))
& & if((data2[1]&0x80)==0x80)&&
& &LED1=1;
& && & LED1=0;
& &if((data2[1]&0x40)==0x40)
& &LED2=1;
& && &LED2=0;
& & if((data2[1]&0x20)==0x20)
& &LED3=1;
& &&&LED3=0;
& & if((data2[1]&0x10)==0x10)
& && & LED4=1;
& && &LED4=0;
& & if((data2[1]&0x08)==0x08)
& &LED5=1;
& &&&LED5=0;
资深工程师, 积分 14010, 距离下一级还需 5990 积分
资深工程师, 积分 14010, 距离下一级还需 5990 积分
资深工程师, 积分 14010, 距离下一级还需 5990 积分
资深工程师, 积分 14010, 距离下一级还需 5990 积分
有一定难度呀
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
怎么用11MHZ的晶振呢?11.0592MHZ会更好点
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
资深工程师, 积分 14175, 距离下一级还需 5825 积分
还有延时程序写的不是很刁,应该这样:
void delay(uint z)
& &for(z;z&0;z--)
& && & for(j=110;j&0;j--);
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
资深工程师, 积分 12456, 距离下一级还需 7544 积分
楼主在中断发送数据,建议改到主函数里面发送比较好
资深工程师, 积分 13139, 距离下一级还需 6861 积分
资深工程师, 积分 13139, 距离下一级还需 6861 积分
资深工程师, 积分 13139, 距离下一级还需 6861 积分
资深工程师, 积分 13139, 距离下一级还需 6861 积分
这种问题如何解决的呢?现在我也遇到这种问题,定时器0和串口中断一起时,程序跑起来会出错(1.定时器不起作用& &或2.定时器不准) ,若单独工作时,就不会出错。。& & 请指教一下,查了很久了这个问题
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
资深工程师, 积分 13995, 距离下一级还需 6005 积分
可以同时工作,两个中断向量
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
资深工程师, 积分 13232, 距离下一级还需 6768 积分
/****************串口初始化********************/
void init_serial1()
TMOD = 0x20;
TH1 = 250;& &
TL1 = 250;
TR1 = 1;& &
PCON = 0x80;& &
SCON = 0x50;
/* *****************?¨ê±?÷0 **********************/
void init_serial0()
TMOD = 0x10;
TH0 = 0xB8;& &
TL0 = 0x00;
TR0 = 1;& &
第2組初始化會不會將 TIMER1 模式2 改為 模式1 的可能
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
资深工程师, 积分 12251, 距离下一级还需 7749 积分
嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽
技术总监, 积分 41698, 距离下一级还需 8302 积分
技术总监, 积分 41698, 距离下一级还需 8302 积分
技术总监, 积分 41698, 距离下一级还需 8302 积分
技术总监, 积分 41698, 距离下一级还需 8302 积分
这肯定是程序问题,51这么成熟的内核不可能犯这么低级的错误
扫描二维码,随时随地手机跟帖
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
您需要登录后才可以回帖

我要回帖

更多关于 dsp定时器中断和串口中断冲突 的文章

 

随机推荐