微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 定时器中断使用+数码管动态显示

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

时间:11-30 来源:互联网 点击:
先上图


主要用到

EA:中断总控制 1 开启 0关闭

ET0 :定时器0溢出中断 1开启 0关闭

要点:中断号计算



公式:中断向量=8×中断号+3

timer0为例 中断向量=0x0b (11十进制) 中断号=(11-3)/8=1

中断函数:

void timer0_interrupt() interrupt1 //中断号为1

中断优先级可以查书。

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

代码如下:

#include 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,	// 00xF9,	// 10xA4,	// 20xB0,	// 30x99,	// 40x92,	// 50x82,	// 60xF8,	// 70x80,	// 80x90,	// 90x88,	// A0x83,	// B0xC6,	// C0xA1,	// D0x86,	// E0x8E	// F};uint8 table[]={0,0};void timer0_init(){TMOD|=0x01;	 //工作模式1TMOD&=0xfd;TH0=0xdc;	 //初始值  10ms ×100=1sTL0=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;}}	}}

仿真:



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top