单片机外部中断控制数码管电子时钟。

作者&投稿:曾荷 (若有异议请与网页底部的电邮联系)
单片机数码管显示,外部中断~

while(1)
{
DU=1;
P0=SMG[b];
DU=0;

WE=1;
P0=0xfe;
WE=0;
加延时
while(a);

DU=1;
P0=SMG[b];
DU=0;

WE=1;
P0=0xfe;
WE=0;
加延时
while(~a);
}
打字不易,如满意,望采纳。

给你个电路和程序,//前几天帮一个网友写,单片机定时时钟在调节功能,可以参考一下我程序

/***************************************************
* 6位数码管显示电子钟
*
* 功能: 按键加,按键减, 按键,启动和停止。
*
*
***************************************************/
#include "REG52.H"

sbit SHUG_01 = P2^0; //数码管1
sbit SHUG_02 = P2^1; //数码管2
sbit SHUG_03 = P2^2; //数码管3
sbit SHUG_04 = P2^3; //数码管4
sbit SHUG_05 = P2^4; //数码管5
sbit SHUG_06 = P2^5; //数码管6
sbit KEY0_01 = P0^0; //按键 启动或停止sbit KEY0_02 = P0^1; //按键 加
sbit KEY0_03 = P0^2; //按键减
sbit KEY0_04 = P0^3; //按键菜单
#define LED_DATA P1 //P1数据端口
unsigned char value_temp = 0;unsigned char value_Outk = 0;
unsigned char value_shio = 8;
unsigned char value_feno = 40;
unsigned char value_miao = 0;
unsigned char code value_tab0[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //共阳极unsigned char code value_tab1[]={0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //共阳极带点

/*
* 延时1ms延时子函数
**/
void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
/* * 程序运行【启动和停止】子函数
**/
void Disp_layledketCmd(void)
{
/***小时***/
SHUG_01 = 1;
LED_DATA = value_tab0[value_shio / 10]; /*******小时的十位数显示***************/
Delay_1ms(5);
SHUG_01 = 0;
SHUG_02 = 1;
LED_DATA = value_tab1[value_shio % 10]; /*******小时的个位数显示***************/
Delay_1ms(5);
SHUG_02 = 0;
/***分钟***/ SHUG_03 = 1;
LED_DATA = value_tab0[value_feno / 10]; /*******分钟的十位数显示***************/
Delay_1ms(5);
SHUG_03 = 0;
SHUG_04 = 1;
LED_DATA = value_tab1[value_feno % 10]; /*******分钟的个位数显示***************/
Delay_1ms(5);
SHUG_04 = 0;
/***秒钟***/ SHUG_05 = 1;
LED_DATA = value_tab0[value_miao / 10]; /*******秒钟的十位数显示***************/
Delay_1ms(5);
SHUG_05 = 0;
SHUG_06 = 1;
LED_DATA = value_tab0[value_miao % 10]; /*******秒钟的个位数显示***************/
Delay_1ms(5);
SHUG_06 = 0;
}
/* * 定时器初始化定时50ms
**/
void Tero_Init(void)
{
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
EA = 1;
}
/* * 按键开关【启动和停止】子函数
**/
void Scan_keyoutCmd(void)
{
if(KEY0_01 == 0)
{
Delay_1ms(10);
if(KEY0_01 == 0)
{
TR0 = ~ TR0;
}
while(KEY0_01 == 0);
}
if(KEY0_02 == 0) {
Delay_1ms(10);
if(KEY0_02 == 0)
{
value_miao--;
if(value_miao == -1)
{
value_feno--;
value_miao = 59;
if(value_feno == -1)
{
value_shio--;
value_feno = 59;
if(value_shio == -1)
{
value_shio = 23;
}
}
}
while(KEY0_02 == 0);
}
}
if(KEY0_03 == 0) {
Delay_1ms(10);
if(KEY0_03 == 0)
{
value_miao++;
if(value_miao == 60)
{
value_miao = 0;
value_feno++;
if(value_feno == 60)
{
value_feno = 0;
value_shio++;
if(value_shio == 24)
{
value_shio = 0;
}
}
}
while(KEY0_03 == 0); //检测松手
}
}
}
/* * 函数主体
**/
int main(void)
{
P1 = P2 = P3 = 0x00;
Tero_Init();

while(1)
{
Scan_keyoutCmd();
Disp_layledketCmd(); //执行应运程序
}
}
/* * 定时器中断服务程序
**/
void Tmero()interrupt 1
{
TH0 = 0x4C;
TL0 = 0x00;
value_temp++;
if(value_temp == 20)
{
value_temp = 0;
value_miao++;
if(value_miao == 60)
{
value_feno++;
value_miao = 0;
if(value_feno == 60)
{
value_shio++;
value_feno = 0;
if(value_shio == 24)
{
value_shio = 0;
}
}
} }
}

数码管用8位一体的,共阴的。仿真图如下

程序如下

#include<reg51.h>

#define uchar unsigned char

#define uint  unsigned int

sbit k1=P3^1;  //第一个按键,选择设置

uchar code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴数码管段码表

uchar disbuf[8]; //声明显示缓冲区8个单元

uchar hour=12;   //声明小时变量,初值为12

uchar minute=59; //声明分变量,初值为59

uchar second;    //声明秒变量

uchar t0n;       //定时器T0中断计数,定时50ms,中断20次为1秒

uchar dis;       //调时状态下,显示小数点位

void delay()     //延时子程序,用于显示子程序

{

uint j;

for(j=300;j>0;j--);

}

//显示子程序,参数dis为显示小数点位

void display(uchar dis)

{

uchar j,disbit=0x01; //位码

for(j=0;j<8;j++)

{

P2=~disbit;       //P2口输出位码

if(dis>0&&dis==j) //调时状态下,显示小数点

P0=distab[disbuf[j]]+0x80; //在小时,分,秒位上显示小数点

else

P0=distab[disbuf[j]]; //其它位正常显示

disbit<<=1;           //取下一个位码

delay();              //延时

}

}

void main()

{

disbuf[2]=disbuf[5]=10;//数码管第3,6位显示-

TMOD=0x01;

TH0 =0x3C;    //单片机晶振频率=12M,定时50ms,时间常数=3CB0

TL0 =0xB0;

IE  =0x82;    //开定时器T0中断

TR0 =1;       //启动定时器T0

IT0 =1;       //设置外部中断为下降沿有效

IT1 =1;

while(1)

{

display(dis); //调显示子程序

if(k1==0)     //选择设置

{

dis++;    //停止计时,进入调时状态

EX0=1;    //调时状态下,允许外部INT0,INT1中断

EX1=1;    //用来调小时,分,秒

if(dis>7) //调小时,在小时位显示小数点

{

dis=0; //灭小数点

t0n=0; //调时结束,开始计时

TR0=1;

EX0=0; //关外部中断

EX1=0;

}

else if(dis==2)dis=4; //调分,在分位显示小数点

else if(dis==5)dis=7; //调秒,在秒位显示小数点

while(k1==0)display(dis); //等待按键释放

}

if(t0n>=20&&dis==0) //中断20次,1秒到,计时状态下时钟计时

{

t0n=0;

second++;      //秒加1

if(second>=60) //到60秒

{

second=0;

minute++;      //分加1

if(minute>=60) //到60分

{

minute=0;

hour++;    //小时加1

if(hour>=24)

hour=0;

}

}

}

disbuf[0]=hour/10;    //显示小时十位

disbuf[1]=hour%10;    //显示小时个位

disbuf[3]=minute/10;  //显示分十位

disbuf[4]=minute%10;  //显示分个位

disbuf[6]=second/10;  //显示秒十位

disbuf[7]=second%10;  //显示秒个位

}

}

//定时器T0中断服务子程序

void T0_isr() interrupt 1

{

TH0=0x3C;  //重写时间常数

TL0=0xb0;

t0n++;     //中断次加1

}

//外部中断INT0服务程序,调时状态下,加1

void INT0_ISR() interrupt 0

{

if(dis==1)     //调小时

{

hour++;    //小时加1

if(hour>=24)

hour=0;

}

if(dis==4)     //调分

{

minute++;  //分加1

if(minute>=60)

minute=0;

}

if(dis==7)     //调秒

{

second++;  //秒加1

if(second>=60)

second=0;

}

}

//外部中断INT1服务程序,调时状态下,减1

void INT1_ISR() interrupt 2

{

if(dis==1)   //调小时

{

hour--;  //小时减1

if(hour==0xff)

hour=23;

}

if(dis==4)    //调分

{

minute--; //分减1

if(minute==0xff)

minute=59;

}

if(dis==7)   //调秒

{

second--;//秒减1

if(second==0xff)

second=59;

}

}




7-外部中断事件控制器(EXTI)
在STM32F4微控制器中,外部中断事件控制器(EXTI)扮演着关键的角色,它是一个灵活的解决方案,用于处理各种自定义紧急事件。总共配备了22个常规中断和额外的23个事件,其中包括GPIO中断和硬件唤醒功能,为系统提供了强大的事件管理能力。EXTI的每一根线,从0到15,都可根据需要配置为不同的触发事件,如...

单片机中同一个外部中断可以即控制计数器有控制定时器吗?怎么控制...
同一个外部中断只能控制定时器,不能控制计数器的计数。因为在这个外部中断服务函数里,可以写TRx=1启动定时器,或者给定时装初值,或者控制器定时器的中断开关,这些寄存器都是可以通过软件控制的,所以用外部中断可以控制。但是不能控制计数器的计数,因为计数器计数是外部发生的,而外部中断口和计数器的计...

c51单片机中断程序中的interrupt1,2,3是由什么决定的?
1、INT0——外部中断0,由P3.2端口引入,低电平或下降沿引起。默认优先级最高。2、INT1——外部中断1,由P3.3端口引入,低电平或下降沿引起。默认优先级第二。3、T0——定时器/计数器0中断,由T0计数器计满回零引起。默认优先级第三。4、T1——定时器/计数器1中断,由T1计数器计满回零引...

主机与外部设备间数据传输的控制方式除了中断方式还有哪些?说明中断...
回答:1、程序直接控制方式、中断控制方式、DMA方式和通道方式 2、中断控制方式是利用向CPU发送中断的方式控制外围设备和CPU之间的数据传送。它的优点是大大提高了CPU的利用率且能支持多道程序和设备的并行操作。它的缺点是由于数据缓冲寄存器比较小,如果中断次数较多,仍然占用了大量CPU时间;在外围设备较多时,...

单片机的外部中断的电平触发,触发中断,为什么数码还能动?
所以只有当中断程序执行完成后,单片机会自动清除中断标志,然后由于中断条件(低电平)依然满足,所以单片机会重新响应中断。但是因为中断标志置低然后置高是需要时间的,借着这点点时间差主程序会执行一条指令。所以,虽然主程序的执行总是被中断干扰,但是他还是会运行下去,只是速度严重受到影响。

单片机的外部中断源有 ** ?, ** ? 和串口中断。
2、INT1(P3.3),外部中断2。可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。3、TF0(TCON.5),片内定时\/计数器T0溢出中断请求标志。当定时\/计数器T0发生溢出时,置位TF0,并向CPU申请中断。4、...

8086中断系统可以管理几种中断啊。。求大神帮忙解答。
(1)外部中断 外部中断是来自8086CPU之外的原因引起的程序中断。它又分成两种情况:·可屏蔽中断——外部的这个中断请求可以在CPU的内部被屏蔽掉,即CPU可以控制它是否引起程序中断。标志寄存器中的中断允许标志IF就是用于控制可屏蔽中断的。·非屏蔽中断——外部的这个中断请求不能在CPU的内部被屏蔽,CPU...

单片机:采用外部中断0和1,控制两位数码管进行00~99的计数,其中外部中断0...
这好办!定义一个寄存器num,若是外中断0,则num--;若是外中断1,则num++;然后让num显示即可。

...控制3个IO口的输出。C语言编写。随时在线可在线聊
\/\/低0.3S,P02 = 0; \/\/P0.2口输出低电平.DL_x_10ms(30);\/\/下面的定时,可以自行编写 \/\/高0.3S,\/\/低0.58S,\/\/高0.12S,\/\/低1.08S,\/\/高2.55S,\/\/低0.47S,\/\/高0.075S,高低电平很多次这样。.EX0 = 0;EX1 = 1; \/\/开放INT1(K3)中断 } ...

51单片机中的外部中断有什么作用?
1、51单片机的外部中断int0对应的引脚为p3.2。2、设置寄存器,打开终端并选择中断的触发方式。EA为整体中断允许位,首先要将EA置1,打开中断。EX0为外部中断INT0,置1开启。IT0寄存器:置0为低电平触发,置1为下降沿触发。3、编写中断函数,int0的中断编号为0,这里使用中断控制led的点亮与熄灭。中...

易门县19895246232: 51单片机控制数码管显示时钟,独立按键怎么弄 -
众乳清开: 独立按键处理起来是非常简单的,一般都是IO口单独控制,所以只需要消抖和判断按键按下抬起状态就好.比如: sbit key=P1^0; if(key==0) {delay(10);if(key==0){keyval=1;while(key==0);} }

易门县19895246232: 单片机做电子时钟 -
众乳清开: 那可以用P3.3作外部中断输入,是INT1,还可以用P3.4或P3.5输入时钟脉冲,用定时器T0或T1,工作在计数状态,也可以的.如果整个P3口都用于数码管了,那就不能用中断方式输入了,采用查询方式会影响精度.其实,外加了一个50hz的固定脉冲,也未必就是非常准确吧.用一个12MHZ的晶振,用内部定时器计时,也可以做到很准确的吗,也不会比外部的固定脉冲误差大的.最好的方法是用一片时钟芯片,DS1302,这是做电子钟的典型配置,计时精确,还可以带备用电池,计时不间断.

易门县19895246232: 单片机89c51做简单的电子时钟,以下程序中如何加一个中断,使其有清零功能? -
众乳清开: 开外部中断0,或1 void clear_s() interrupt 0 //2 { sec=0,min=0,hou=0; //变量清0 void disp( ) //调用显示函数 }

易门县19895246232: 急求:单片机上电时数码管显示“0”,编写C51语言程序 利用单片机的外部中断0(P3.2)功能实现当按下 -
众乳清开: #include#define uchar unsigned char; uchar distab[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; uchar flag; sbit key=P3^2; void ext0() interrupt 0 { flag=1; } main() { IT0=1; EA=1; EX0=1; P1=distab[0];...

易门县19895246232: 51单片机里2个外中断触发计时器开始和结束,将所记得的时间显示出来的程序怎么写啊? -
众乳清开: /************************************************// 中断初始化函数 //************************************************/ void Init(void) { EX1 = 1;//开外部中断1 EX2 = 1;//开外部中断2 TMOD = 0x01;//设置定时器为工作模式1 //定时时间设置为5ms,频率为200...

易门县19895246232: 用单片机中断控制的电子时钟程序怎么写? -
众乳清开: 1.时钟肯定要由按键了,个数看个人设计,有了按键肯定要外部中断了~ 2.计时则会用到定时中断以确定最小精度单位 3.最小精度单位依次进位的换算微妙、秒、分、时、日、星期、月、年……的函数 4.结果要显示出来,显示函数必不可少,看个人用哪种硬件了

易门县19895246232: 单片机控制6位数码管显示0 - 5(刷新时间1秒),外部中断0请求中断时,控制6位数码管显示ERROE 3秒钟 -
众乳清开: 是仿真?还是实物开发板?要有仿真图或原理图,才能写程序.要滚动显示,还要用外部中断和定时器中断,写程序还是比较麻烦的,才5个财富值,恐怕没有人愿意写,而且写完了,又不给采纳.要仿真实现比较容易.显示ERROE(应该是ERROR吧),字母R只能显示小写字母r,见下图.

易门县19895246232: 单片机 C 语言 做一个可调时的时钟 数码管显示 -
众乳清开: void delay(uint t) { for(;t>0;t--) for(j=110;j>0;j--); } void tiaojie(char i) { if(key1==0) { delay(5); if(key1==0) { while(!key1); i++; if(i==10) { i=0; } } } if(key2==0) { delay(5); if(key2==0) { while(!key2); i--; if(i==-1) { i=9; } } } } void INT0() interrupt 0 { uchar A,B,C,D...

易门县19895246232: 请问一下,单片机如何用中断实现LED电子钟的闹钟功能~~~ -
众乳清开: 可以尝试着添加一个变量,来存储闹钟时间,然后每秒和这个时间比较,如果相等,就让蜂鸣器响

易门县19895246232: 用单片机做电子时钟需要的材料 -
众乳清开: 做电子时钟需要的材料:1 6个七段数码管(2个显示:0~23小时 、2个显示:0~59分、2个显示:0~59秒)2 6个三极管 作为 6个七段数码管的驱动3 一个51单片机(P1口作为6个七段数码管的段形控制、P2口作为七段数码管的位控、动态显示)4 需要4个微动按钮,可以分别用来设置或修改小时、分、秒的按键.5 需要电阻或电阻排(220欧姆、10K)6 最后就是需要焊接工具:电烙铁一把20~30瓦、焊锡一卷.7 电路板 可以使用简易的实验电路板 呵呵 满意 就选满意回答啊

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网