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;
}
}
}
}
仿真:



