专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

定时器中断使用+数码管动态显示

作者:佚名   来源:本站原创   点击数:  更新时间:2013年01月15日   【字体:

TMD  楼上在装修,叮叮咚咚的烦死了,脑袋有点晕,也不知道代码写的有问题没,反正仿真是过了 

嗷嗷嗷  受不了了,楼上的动电转了。。。 

 
先上图

 

 
主要用到
EA:中断总控制 1 开启  0关闭
ET0 :定时器0溢出中断 1开启  0关闭

 
要点:中断号计算


 
公式:中断向量=8×中断号+3
timer0为例   中断向量=0x0b  (11十进制)   中断号=(11-3)/8=1
中断函数: 
void timer0_interrupt() interrupt 1  //中断号为1

中断优先级可以查书。

数码管动态显示就是用一组io口  显示多个led数码管   扫描频率1~10ms

代码如下:

#include <reg52.h>

typedef unsigned char uint8;
typedef unsigned int uint16;

uint8 flag=0;
uint16 i=0;
sbit led1=P1^6;
sbit led2=P1^7;
sbit bee=P1^5;

code uint8 ledcode[]={
0xC0,	// 0
0xF9,	// 1
0xA4,	// 2
0xB0,	// 3
0x99,	// 4
0x92,	// 5
0x82,	// 6
0xF8,	// 7
0x80,	// 8
0x90,	// 9
0x88,	// A
0x83,	// B
0xC6,	// C
0xA1,	// D
0x86,	// E
0x8E	// F
};

uint8 table[]={0,0};

void timer0_init()
{
TMOD|=0x01;	 //工作模式1
TMOD&=0xfd;
TH0=0xdc;	 //初始值  10ms ×100=1s
TL0=0x00;
TR0=1;
}

void intr_init()
{
ET0=1;	    //timer0中断开启
EA=1;	//总中断开启
}

void frush()	 //动态显示数码管  10ms扫描一次
{
static uint8 k=0;
switch (k)
{
case 0 :led1=0;led2=1;P2=ledcode[table[0]]; break;	//低位
case 1 :led2=0;led1=1;P2=ledcode[table[1]]; break;	//高位
}
k++;
if(k==2)
k=0;
}

void main()
{
   timer0_init();
   intr_init();
   led1=1;
   led2=1;
   while(1);
}

void timer0_interrupt() interrupt 1	//中断函数
{	
static uint8 sec=0;
TH0=0xdc;
TL0=0x00;
frush();
if(flag==0)
{
i++;
if(i==100 )
{
i=0;
sec++;
table[0]=sec%10;
table[1]=sec/10%10;
if (sec==60)	  //到60秒
{
bee=0;
flag=1;
}
}	
}
}

仿真:


 

关闭窗口

相关文章