钻石会员
主题
回帖0
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
|
本帖最后由 LBQ691477940 于 2012-12-2 17:36 编辑
我认为中断函数太长是不好,但楼主程序中的问题其实根本就不关中断函数里面有无延时函数的事,中断里面用延时好像也不会死呀?以下是我写的程序两个中断都用了,功能为按下后给串口分别返回不同的一个值,带颜色部分的语句可以有效保证中断一次只响应一次。在实际使用中暂未发现有多次触发的问题。
/****************************************************************
按P3.2口开关时产生外部中断同时由串口输出 01
按P3.3口开关时产生外部中断同时由串口输出 02
晶振:11.0592_22.1184MHZ 波特率57600
程序设计:lbq691477940 21-03-2012
/****************************************************************/
#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int
void delay_1ms(uint x);//1MS延时
bit key0 = 0;
bit key1 = 0;
/****************************************************************/
void main()
{
SP = 0X60; //堆栈指针
TMOD = 0x21; //设置定时器1为模式2;定时器0为模式1
TH1 = 0xff; //装初值设定波特率//22.1184MHZ=57600
TL1 = TH1; //19200=0xfd
PCON = 0x80; //波特率加倍
//若为PCON = 0x80波特率加倍(11.0592MHZ = 57600)
TR1 = 1; //启动定时器 SM0 SM1
SM0 = 0; //串口通信模式设置 0 0 = 0
SM1 = 1; // 0 1 = 1
// 1 0 = 2
// 1 1 = 3
SM1 = 1;
EX0 = 1; //使能外部中断0中断
IT0 = 1; //设为下降沿触发方式
EX1 = 1; //使能外部中断1中断
IT1 = 1; //设为下降沿触发方式
//ES=1; //开串中断
EA = 1; //开总中断
while(1)
{
if(P3_2) //如果P3.2口的开关已放开
key0 = 0; //将KEY0置0,目的使下次中断生效
if(P3_3) //如果P3.3口的开关已放开
key1 = 0; //将KEY1置0,目的使下次中断生效
}
}
/****************************************************************/
//向串口发送一个字符
void send_char_com(uchar ch)
{
EA = 0; //开总中断
SBUF = ch;
while(!TI); //如果TI为0等待
TI = 0;
EA = 1; //开总中断
}
/****************************************************************/
//外部中断0子函数
void int_0 () interrupt 0 //using 0
{
EX0 = 0; //暂停外部中断0中断
delay_1ms(5); //稍作延时
if((P3_2 == 0)&&(!key0)) //中断进来后如果P3.2和key0都为0
{
send_char_com(0x01); //向串口发 01
key0 = 1; //将key0置1防止按一次产生多次的效果
}
EX0 = 1; //使能外部中断0中断
}
/****************************************************************/
//外部中断1子函数
void int_1 () interrupt 2 //using 2
{
EX1 = 0; //暂停外部中断1中断
delay_1ms(5); //稍作延时
if((P3_3 == 0)&&(!key1)) //中断进来后如果P3.3和key1都为0
{
send_char_com(0x02);
key1 = 1; //将key1置1防止按一次产生多次的效果
}
EX1 = 1; //使能外部中断1中断
}
/****************************************************************/
/*22.1184MHZ时 = 1.0026MS为单位的延时程序*/
void delay_1ms(uint x)
{
uchar j;
while(x--)
{
for(j = 0;j < 227;j++)
{;}
}
}
/****************************************************************/ |
|