本帖最后由 铛铛铛挡 于 2016-9-10 10:46 编辑
首先讲一下我的思路:1,按键外部触发中断,即INT0或者INT1
2,响应中断,通过串口发送字符到PC机,在串口助手上显示
然而就这样简单的程序,我却被难住了
第一个程序:串口中断收发,运行正常
void main()
{
bstv51_init();
TMOD=0X20; //先设置T1为工作方式2 ,工作方式2会自动重装
TH1=0XFC; //
TL1=0XFC; //
PCON=0X80; //倍增位赋1,1000 0000,以上3句设置波特率14400
SCON=0X50; //设置串口工作方式,0101 0000
EA=1; //打开全局中断
ES=1; //打开串行口中断
TR1=1; //打开计数器1
while(1)
{
}
}
void uart() interrupt 4
{
uchar date;
date=SBUF; //接受缓存区的值赋给date ,接受完毕则中断标志位置1
RI=0; //缓存区的值提取完毕后,将接受中断标志位手动赋0
SBUF=date; //将date的值赋给发送缓存区,等待发送完毕
while(!TI); //等到发送完毕,发送中断标志位会置1产生中断
TI=0; //发送完毕,手动赋0标志位
}
第二个程序:在第一个程序的基础上,在main里加了3行:
P3=0X08; //0000 1000 P3.3(INT1)赋1,以接受第4排按键触发信号(下降沿触发)
EX1=1; //INT1中断允许,按键中断 P3.3,第4排按键
IT1=1; //INT1触发方式为下降沿触发 如果是沿触发,响应中断后,硬件自动清除中断标志。
P1=0XF0; //1111 0000,LED灯一半亮一半灭
同时增加了INT1的中断服务函数
void KEY() interrupt 2
{
uchar date[9]={"123456789"};
uint i=0;
P1=~P1; //LED灯变化 ,表明进入中断
for(i=0;i<9;i++)
{
SBUF=date
;; //将date的值赋给发送缓存区,等待发送完毕
while(!TI); //等到发送完毕,发送中断标志位会置1产生中断
TI=0; //发送完毕,手动赋0
}
}
串口助手设置波特率14400,数据位8位,停止位1位,没有校验位。
然而,在这里就跪了,串口助手发送字符没有收到返回,
按键可以触发中断(因为LED灯变化了),,串口助手却收不到date[9]={"123456789"},啥也没有。
各位大神,我就加了那么几句而已,找来找去都找不出问题,请帮帮小弟
此帖出自小平头技术问答
P3=0X08; //0000 1000 P3.3(INT1)赋1,以接受第4排按键触发信号(下降沿触发)
因为P3.3是INT1, P3.2是INT0;所以在上面的句子中,INT0一直收到低电平(即有效触发电平)
我改成了
P3=0X0f; //0000 1111 P3.3(INT1)和P3.2(INT0)都赋1,以接受第4排按键触发信号(下降沿触发)
程序就正常了
产生了疑问,请大侠帮忙
1.INT0中断我并没有打开,而且也没有写INT0的中断函数,为什么还会造成干扰?
2.我通过LED等能够判断,即使INT0收到低电平,我仍然能够进入INT1中断,但是字符却发送不成功,这又是为什么?
3.按照楼上大侠的思路,我设置了一个全局变量flag,在中断中置位,在main中扫描该位并执行相应当作,但其实还是没有效果。
一周热门 更多>