求教单片机程序问题

来源:百度知道 编辑:UC知道 时间:2024/06/01 13:06:42
我想实现的功能是:外中断0时,把单片机1的变量flag1通过串行方式1发给单片机2,外中断1时,把单片机1的变量flag2通过串行方式1发给单片机2,单片机1中的主函数一旦接收到信息就执行Practice指令,不知何故,无法执行。下面是我的程序:
#include<reg52.h>//单片机1
#include"lcd.h"
sbit ay_zs_led=P3^7;

void cpu1_init()//初始化
{
IP=0x05;//INTI,INT2设为高优先级
IE=0x95;//开总中断, 禁止T1,T2中断,允许INT1,INT0中断;
IT0=IT1=0;//使INT0,INT1为下降沿触发中断
PCON=0x00;//波特率不倍增
SCON=0x50;//工作在串行方式1,同时允许接受信息
TMOD = 0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
EA = 1;
TL1 = 0xfd;
TH1 = 0xfd; //波特率9600
TR1=1;

IT0=IT1=1;//使INT0,INT1为下降沿触发中断
}

void ay() interrupt 0//按压中断
{ SBUF=flag1;
while(TI==0);
TI=0;
lcd2();
}

void cq() interrupt 2//按压中断
{ SBUF=flag2;
while(TI==0);
TI=0;
lcd2();
}

void main()
{

cpu

你这个是查询法来接收返回信息,你这样有时候单片机是收不到东西的,你可以用串口中断法来接收,这个方法实时性更好,一有数据来就从中断接收。
开串口中断
ES=1;

加个中断服务函数
void uart_rev() interrupt 4
{

RI=0;
ay_zs_led=0;
delayms2(100);
practice();

}

个人建议:

1>你有没有考虑到当第一个按键按下时数据正发送(未发送完)又有另一个按键按下了(假如优先级比上次高),于是程序去执行另一个按键中断,而上次的数据正在发送?这时你又重新写SBUF,会不会出错?

2>你用外部中断做,有没考虑到去抖,也许我按一下,有抖动的话就产生了两次或两次以上的中断,余是数据也同样被发送了好多次,况且抖动的时间是不定的,也许是US级的,于是你的程序又出现了第一种情况;

3>lcd2();这个函数你的二个中断里都有,你定义的时候是否把这个函数定义成了可重入?就是在第一个中断执行lcd2()时,另一个高级中断产生了,又去执行led2()?你考虑到了吗?

先不去看功能如何,楼主的程序架构要多考虑一下。

仅供参考。