51单片机中断0
/*本例中的计数按键连接单片机的P3.2引脚(INT0),代码中IE=0x81(即10000001),其最
高位为中断许可位EA,右边第0~4位分别是EX0,ET0,EX1,ET1,ES,它们分别许可INT0,
INT1,T0,T1和串口中断,可见0x81表示允许INTO中断,TCON寄存器中的IT0=1将INTO的
中断触发方式设置为下降沿触发,这样使得计数按键按下时,P3.2上由高到低的跳变会触发中断,
如果按下后没有释放,中断则不会持续触发,只有在释放按键后再次按下时,才会因为又出现了高
电平到低电平的跳变而再次触发中断,这样设置会使计数值仅在计数键每次重新按下时累加。
//IE寄存器:EA,-,ET2,ES,ET1,EX1,ET0,EX0.字节地址A8H
//EX0:外部中断INT0允许位,置1,开,置0,关
//ET0:定时器T0允许位
//EX1:外部中断INT1允许位
//ET1:定时器T1允许位
//ES:串口中断允许位
//ET2:定时器T2允许位(89C52)
//EA: 总中断允许位。控制所有中断使能的总开关
////////////////////////////////////////////////
//TCON:中断请求标志寄存器,TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0字节地址88H
//IT0:外部中断INT0的触发方式控制位。置0为低电平触发,置1为下降沿触发
//IE0:外部中断INT0的请求标志位,硬件自动轩1,响应后自动为0
//IT1:外部中断INT1 的触发方式控制位。
//IE1:外部中断INT1的请求标志位。
//TR0:定时器T0的运行控制位,置1为开始运行,置0停止运行
//TF0:定时器T0的溢出中断请求标志位。发生溢出中断请求时,硬件自动置1,响应后自动置0
//TR1:定时器T1的运行控制位
//TF1:定时器T1的溢出中断请求标志位
#include<reg51.h>
//链接: https://pan.baidu.com/s/1Zp6OQjIf4JnFIfDkvzEGpg 提取码: 4zyq */
#define uint unsigned int
uchar code shu_zi[]={0X3F,0X06,0X5B,0X4F,0X66,
0X6D,0X7D,0X07,0X7F,0X6F,0X00};
uchar shu_zi_zai_cu[]={0,0,0};
uint zong_shu=0;
sbit an_jian=P3^6;
//在数码管上显示计数器
void shi_xian_chengxu()
{
shu_zi_zai_cu[2]=zong_shu/100;
shu_zi_zai_cu[1]=zong_shu%100/10;
shu_zi_zai_cu[0]=zong_shu%10;
if(shu_zi_zai_cu[2]==0)//显示位
{
shu_zi_zai_cu[2]=10;//显示0X00;
if(shu_zi_zai_cu[1]==0)
shu_zi_zai_cu[1]=10;
}
P0=shu_zi[shu_zi_zai_cu[0]];
P1=shu_zi[shu_zi_zai_cu[1]];
P2=shu_zi[shu_zi_zai_cu[2]];
}
//主程序
void main()
{
P0=0XFF;
P1=0XFF;
P2=0XFF;
IE=0X81;//1000 0001 EA打开总中断允许位。EX0打开外部中断0允许位。
IT0=1;//边沿触发方式,(下降沿有效)
while(1)
{
if(an_jian==0)
zong_shu=0;
shi_xian_chengxu(); //显示程序
}
}
void zhogduan() interrupt 0 //中断0
{
zong_shu++;//外部中断一次,加一
}








最新发布