单片机中断控制为什么用两个数码管?
好酷屋教程网小编为您收集和整理了单片机中断控制为什么用两个数码管?的相关教程:单片机中断控制和数码管是没有关系的。你想问的应该是怎么用中断去控制两个数码管吧。中断控制是单片机的一个功能,也可以用作定时器。中断控制可以作为数码管扫描控制器。利用单片机的定时器/计数器定时和记数的原
单片机中断控制和数码管是没有关系的。你想问的应该是怎么用中断去控制两个数码管吧。中断控制是单片机的一个功能,也可以用作定时器。中断控制可以作为数码管扫描控制器。
利用单片机的定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及按键来设计计时器,具有00-99分
#include"reg51.h"
#include "intrins.h" //_nop_();延时函62616964757a686964616fe58685e5aeb931333264633436数用
#define uchar unsigned char
#define uint unsigned int
#define SEG_OUT P2 //段码输出口
#define BIT_OUT P3 //扫描口
#define KEY_IO P0 //键盘接口
sbit dot=P2^7; //LED小数点控制
uchar code tab[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
uchar data dis_buff[6]={1,2,0,0,0,0}; //待显示单元数据,共6个数据
uchar data keytemp,key; //键值存放
uchar data t10ms=0,ts=0,tmin=0,thour=12,t50ms=0;
uchar data flag=0x00;
bit flag_key=0;
/*************1毫秒延时程序**************/
delay1ms(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
//
/***********LED显示动态扫描函数**********/
display()
{
char k;
char m=0xfe;
for(k=0;k<6;k++) //6位LED扫描控制
{ BIT_OUT=0xff;
SEG_OUT=tab[dis_buff[k]];
if(k==1|k==3) {dot=0;}
BIT_OUT=m;
if((flag!=0)&(t50ms>=10))
{
switch(flag)
{
case 1:BIT_OUT|=0x03;break;
case 2:BIT_OUT|=0x0c;break;
case 3:BIT_OUT|=0x30;break;
default:break;
}
}
delay1ms(3);
m=(m<<1)|0x01;
}
}
/***************按键扫描函数*************/
void keyscan()
{
uchar i,t=0xef; //1110 1111
KEY_IO=0x0f;
keytemp=(~KEY_IO)&0x0f;
if(keytemp!=0) //0000 0000 ;0000 1000; 0000 0100; 0000 0010; 0000 0001;
{
delay1ms(1);
for(i=0;i<4;i++)
{
KEY_IO=t;
keytemp=(~KEY_IO)&0x0f;
if(keytemp!=0&flag_key==0)
{
flag_key=1;
switch(keytemp)
{
case 0x08:key=0*4+i;break;
case 0x04:key=1*4+i;break;
case 0x02:key=2*4+i;break;
case 0x01:key=3*4+i;break;
default:break;
}
switch(key)
{
case 0:thour++;if(thour==24)thour=0;break;
case 1:tmin++;if(tmin==60)tmin=0;break;
case 2:ts++;if(ts==60)ts=0;break;
default:break;
}
}
t=(t<<1)|0x01;
}
}
else flag_key=0;
}
/**************初始化程序****************/
void initiation()
{
TMOD=0x11;
TH0=-10000/256;
TL0=-10000%256; //10MS定时初值(T0计时用)
TH1=-25000/256;
TL1=-25000%256; //25MS定时初值(T1计时用)
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
/****************定时器0中断服务程序*****/
void init_timer0(void) interrupt 1
{
TH0=-10000/256;
TL0=-10000%256; //10MS定时初值(T0计时用)
t10ms++;
if(t10ms==100)
{
t10ms=0;
ts++;
if(ts==60)
{
ts=0;
tmin++;
if(tmin==60)
{
tmin=0;
thour++;
if(thour==24)thour=0;
}
}
}
dis_buff[0]=thour/10;
dis_buff[1]=thour%10;
dis_buff[2]=tmin/10;
dis_buff[3]=tmin%10;
dis_buff[4]=ts/10;
dis_buff[5]=ts%10;
}
/****************主程序******************/
main()
{
initiation();
while(1)
{
display();
keyscan();
}
}
这是一个矩形按键控制6位数码管的一个时钟,里面都包含你所说的要求了,至于你说的哪个计数器可以通过TMOD寄存器来设置的。计数器跟定时器的区别是没有益出中断的功能。希望对你有帮助。
以上就是好酷屋教程网小编为您收集和整理的记数,计时器,数码管相关内容,如果对您有帮助,请帮忙分享这篇文章^_^
本文来源: https://www.haoku5.com/youxi/640974f3bf2660610106ba47.html
相关推荐