51/52单片机:利用外部中断实现4位(多位)数码管动态扫描+1/-1--------计数器

前言
首先此源码设计知识点少,更容易供路人/初学者参考;
介绍
此源码实现了利用外部中断实现多位数码管加1和**减1**效果(无论是几位数码管都可用)
要点讲解

1.设置外部中断初始化.(我放在了一个函数里用来调用)

void intinit()
{
	IT0 = 1;	//设置外部中断0的触发方式为跳沿触发。
	EX0 = 1;	//开启外部中断0
	IT1 = 1;	//设置外部中断1的触发方式为跳沿触发。
	EX1 = 1;	//开启外部中断1
	EA = 1;		//中断总开关
}

2.设置按钮函数

void button(){		
    if(K0==0)		 //按钮--加
    {
      	delay1ms(10);
      	if(K0==0)
   		{
       	  num++;
          if(num==5000)
          num=0;
          while(!K0);
        }
     }
	 if(K1==0)
	 {				 //按钮--减
      	delay1ms(10);
      	if(K1==0)
   		{
       	  num--;
          if(num==0)
          num=5000;
          while(!K1);
        }
	 }
}

3.这是全文了比较有意思的一步,也是初学者想不到的地方(重点看)

void wei()			//抓取各位数
{
	qian=num/1000%10;
	bai=num/100%10;
       shi=num/10%10;
       ge=num%10;	
}

***最后是完整源码,仔细看哦(不要完全照搬)
注意引脚号和共阴共阳;

#include<reg52.h>
unsigned char code segcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                            0x7f,0x6f};//共阴段选
unsigned char vcc[]={0x7f,0xbf,0xdf,0xef};//位选
sbit K0=P3^2;
sbit K1=P3^3;
unsigned int i,j,k;
int num;
int ge,shi,bai,qian;
void delay1ms(int k)
{
	for(i=0;i<k;i++)
	{
		for(j=0;j<100;j++)
		{}
	}
}               //延时
void intinit()
{
	IT0 = 1;	//设置外部中断的触发方式为下降沿触发。
	EX0 = 1;	//开启外部中断0
	EA = 1;		//中断总开关
	IT1 = 1;	
	EX1 = 1;	
	EA = 1;
}

void button(){		
    if(K0==0)		 //按钮--加
    {
      	delay1ms(10);
      	if(K0==0)
   		{
       	  num++;
          if(num==5000)
          num=0;
          while(!K0);
        }
     }
	 if(K1==0)
	 {				 //按钮--减
      	delay1ms(10);
      	if(K1==0)
   		{
       	  num--;
          if(num==0)
          num=5000;
          while(!K1);
        }
	 }
}
void wei()			//抓取各位数
{
	qian=num/1000%10;
	bai=num/100%10;
       shi=num/10%10;
       ge=num%10;	
}

main()
{
	intinit();
 	while(1);

}
void int0() 	interrupt 0
{	   
	EX0=0;
               
	while(1)
   {
	button();
	wei();

    P3=0xef;
    P2=segcc[qian];        
    delay1ms(1);
               
    P3=0xdf;
    P2=segcc[bai];        
    delay1ms(1); 

    P3=0xbf;
    P2=segcc[shi];        
    delay1ms(1);
               
    P3=0x7f;
    P2=segcc[ge];        
    delay1ms(1);
	EX0=1;	
	}	
}

void int1() 	interrupt 2
{	   
	EX1=0;
               
	while(1)
   {
	button();
   	wei();

    P3=0xef;
    P2=segcc[qian];        
    delay1ms(1);
               
    P3=0xdf;
    P2=segcc[bai];        
    delay1ms(1); 

    P3=0xbf;
    P2=segcc[shi];        
    delay1ms(1);
               
    P3=0x7f;
    P2=segcc[ge];        
    delay1ms(1);
	EX1=1;	
	}	
}
  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
首先,我们需要了解MCS-51单片机的基本结构与特性。MCS-51单片机是一款典型的8单片机,包含了CPU、RAM、ROM、I/O端口等基本模块,同时它还具备较强的定时器/计数器、中断、串口通信等功能模块。因此,我们可以考虑利用MCS-51单片机的强大功能来设计一款智能时钟。 一、硬件设计 1.主控芯片:MCS-51单片机 2.显示模块:数码管 3.时钟模块:DS1302时钟芯片 4.按键模块:矩阵按键 5.电源模块:电池或者外部电源 二、软件设计 1.初始化:设置MCS-51单片机的I/O端口方向、定时器/计数器、中断等相关参数。 2.时钟设置:通过DS1302时钟芯片实现时钟的设置与读取,并将其显示数码管上。 3.按键扫描:通过矩阵按键实现对时钟的调整与设置功能。 4.闹钟设置:通过按键设置闹钟,并在闹钟时间到达时,触发相应的中断事件。 5.睡眠模式:在闹钟未触发的情况下,考虑采用睡眠模式,减少功耗,延长电池寿命。 三、C语言编程思路 1.初始化:配置MCS-51单片机的I/O端口、定时器/计数器、中断等相关参数,如下所示: ```c void init() { // 配置IO口 P0 = 0xff; P1 = 0xff; P2 = 0x00; P3 = 0xff; // 定时器/计数器初始化 TMOD = 0x01; TH0 = 0x3c; TL0 = 0xb0; // 中断初始化 EA = 1; ET0 = 1; TR0 = 1; } ``` 2.时钟设置:通过DS1302时钟芯片实现时钟的设置与读取,并将其显示数码管上,如下所示: ```c void displayTime() { int year, month, day, hour, minute, second; // 读取DS1302时钟芯片的时间 year = DS1302_Read(0x8d) + 2000; month = DS1302_Read(0x89); day = DS1302_Read(0x87); hour = DS1302_Read(0x85); minute = DS1302_Read(0x83); second = DS1302_Read(0x81); // 将时间显示数码管上 P2 = 0x01; SBUF = year/1000 + '0'; while(!TI); TI = 0; SBUF = year/100%10 + '0'; while(!TI); TI = 0; SBUF = year/10%10 + '0'; while(!TI); TI = 0; SBUF = year%10 + '0'; while(!TI); TI = 0; P2 = 0x02; SBUF = month/10 + '0'; while(!TI); TI = 0; SBUF = month%10 + '0'; while(!TI); TI = 0; P2 = 0x04; SBUF = day/10 + '0'; while(!TI); TI = 0; SBUF = day%10 + '0'; while(!TI); TI = 0; P2 = 0x08; SBUF = hour/10 + '0'; while(!TI); TI = 0; SBUF = hour%10 + '0'; while(!TI); TI = 0; P2 = 0x10; SBUF = minute/10 + '0'; while(!TI); TI = 0; SBUF = minute%10 + '0'; while(!TI); TI = 0; P2 = 0x20; SBUF = second/10 + '0'; while(!TI); TI = 0; SBUF = second%10 + '0'; while(!TI); TI = 0; } ``` 3.按键扫描:通过矩阵按键实现对时钟的调整与设置功能,如下所示: ```c void keyscan() { int key; key = P3 & 0x0f; switch(key) { case 0x0e: // "SET"键 // 进入设置模式 break; case 0x0d: // "UP"键 // 增加时间 break; case 0x0b: // "DOWN"键 // 减少时间 break; case 0x07: // "ALARM"键 // 设置闹钟 break; default: break; } } ``` 4.闹钟设置:通过按键设置闹钟,并在闹钟时间到达时,触发相应的中断事件,如下所示: ```c void alarm() { int hour, minute; // 读取闹钟时间 hour = DS1302_Read(0x91); minute = DS1302_Read(0x93); // 判断是否到达闹钟时间 if(hour == currentHour && minute == currentMinute) { // 触发中断事件 // ... } } ``` 5.睡眠模式:在闹钟未触发的情况下,考虑采用睡眠模式,减少功耗,延长电池寿命,如下所示: ```c void sleep() { // 进入睡眠模式 PCON |= 0x01; } ``` 以上是基于MCS-51单片机的智能时钟设计的C语言编程思路,其中包括了硬件设计和软件设计两个部分。根据这个思路,我们可以进一步完善代码,实现一款功能齐全、性能稳定的智能时钟。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值