使用中断INT0和INT1来实现数码管显示以及清零

//用LED数码管显示计数器对T0的计数值
#include<reg52.h>   //包含52单片机寄存器定义的头文件
unsigned char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //段码表
unsigned int x;
sbit P33=P3^3;
void delay1ms(unsigned int i)
{


unsigned char j;
 while(i--)
 {
 for(j=0;j<115;j++)  //1ms基准延时程序 
 {
  ;
 }
 
 
 }
  
}
 void Display(unsigned char x)
{
    
P2=0xdf;        //P2.6引脚输出低电平,DS6点亮 
    P0=Tab[x/100];   //显示十位
    delay1ms(5);

P2=0xbf;        //P2.6引脚输出低电平,DS6点亮 
    P0=Tab[x%100/10];   //显示十位
    delay1ms(5);
    P2=0x7f;      //P2.7引脚输出低电平,DS7点亮 
    P0=Tab[x%10];  //显示个位
    delay1ms(5);
P2=0xff;
 } 


/*******************************************
函数功能:主函数
******************************************/
void main(void)
  {  
       
       EA=1;         //开总中断   
  EX0=1;       //允许外中断INT0 
  EX1=1;       //允许外中断INT1 
  IT0=1;   //INT0为下负脉冲触发方式
  IT1=1;   //INT1为下负脉冲触发方式
   
 while(1)  //无限循环,不停地将TL0计数结果送P1口
 {
       //x=TL0;  
    Display(x);
    }
 }
//INT0终端函数
void clear0() interrupt 0
{
 
 x=0;


}


//T0 计数器中断
 void Key_counter() interrupt 2
 {
   if(P33==0){
   delay1ms(20);
   if(P33==0){
   
    x=(x+1)%1000; //因为是3位数码管显示 所以要把计的数控制在1000以内(000~999)
   }
   
   }
 
 
 }
 
好的!下面是基于Proteus仿真环境,利用单片机定时器以及外部中断 `INT0` 实现按键控制数码管清零功能的一个简单示例代码及说明。 --- ### 功能描述: 1. 单片机使用AT89C51作为主控芯片。 2. 定时器T0用于生成秒计数信号,每过一秒更新一次数码管显示值。 3. 按键连接到P3.2(即外部中断INT0),按下按键时触发中断并清除当前计数值(即将数码管归零)。 以下是具体的代码: ```c #include <reg51.h> sbit key = P3^2; // 定义按键输入口 (INT0) unsigned char count = 0; // 计数值 void timer0_init() { TMOD |= 0x01; // 设置T0为模式116位定时器) TH0 = 0xFC; // 装入初值 预设时间大约为1ms TL0 = 0x18; EA = 1; // 开启全局中断 ET0 = 1; // 允许定时器0中断 } // 数码管显示函数 void display(unsigned char num) { switch(num){ case 0: P2=0xC0;break;// 显示0” case 1: P2=0xF9;break;// 显示1”... case 2: P2=0xA4; case 3: P2=0xB0; case 4: P2=0x99; case 5: P2=0x92; case 6: P2=0x82; case 7: P2=0xF8; case 8: P2=0x80; case 9: P2=0x90; } } // 定时器0中断服务程序 void Timer_ISR(void) interrupt 1 { static unsigned int overflow_count = 0; overflow_count++; // 累加溢出次数 if(overflow_count >= 1000){ // 延迟约1秒钟 overflow_count = 0; count++; if(count > 9) { // 如果超过最大数字,则从头开始循环 count = 0; } display(count); // 更新数码管显示 } } // 外部中断0处理程序 (KEY按下的响应) void External_ISR(void) interrupt 0{ __asm nop __endasm; count = 0; // 清零操作 display(count); } void main(){ IT0 = 1; // 设置下降沿触发 EX0 = 1; // 打开外部中断0 timer0_init(); // 初始化定时器 while(1); // 主循环空转 } ``` --- **电路设计部分** - **单片机**: AT89C51 - **外接设备**: - **数码管**: 连接到P2端口; - **按键开关**: 接至P3.2 引脚,并通过上拉电阻保持高电平;当按键闭合时会产生低脉冲激活中断。 --- ### 注意事项 1. Proteus模拟环境下需要正确配置好硬件连线元件属性才能正常运行上述程序。 2. 根据实际使用的晶振频率调整TH0、TL0初始化装载值得以匹配精确延时需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值