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



