|
這是我學(xué)中斷時(shí)候?qū)懙,你參考一下,這個(gè)程序在51HEL開發(fā)板驗(yàn)證過的,數(shù)碼管從0到59累加后歸零,歸零的時(shí)候蜂鳴器響一聲,希望可以幫到您
#include<reg52.h> //52系列單片機(jī)頭文件
#include<math.h>
#define uint unsigned int//宏定義
#define uchar unsigned char//宏定義
sbit DUAN=P2^6; //74HC573的LE端 U1 數(shù)碼管LED的段選端
sbit WEI=P2^7; //74HC573的LE端 U1 數(shù)碼管LED的位選端
sbit LED8=P2^4;
sbit FG=P2^2; //蜂鳴器和繼電器的控制端
uchar num,num2,shi,ge;
uint num1;
void delayms(uint); //聲明延時(shí)子函數(shù)
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //共陰顯示字庫
void display(uchar,uchar);
void main() //主函數(shù)
{
TMOD=0x11; //設(shè)置定時(shí)器0和1為工作方式1(0001 0001)
TH0=(65536-45872)/256; //裝初值
TL0=(65536-45872)%256;
TH1=(65536-45872)/256; //裝初值
TL1=(65536-45872)%256;
EA=1; //開總中斷
ET0=1; //開定時(shí)器0中斷
ET1=1; //開定時(shí)器1中斷
TR0=1; //啟動(dòng)定時(shí)器0
TR1=1; //啟動(dòng)定時(shí)器1
while(1) //程序在這里不停的對(duì)數(shù)碼管動(dòng)態(tài)掃描同時(shí)等待中斷發(fā)生
{
display(shi,ge);
}
}
void display(uchar shi,uchar ge) //顯示子函數(shù)
{
DUAN=1; //打開段選
P0=table[shi]; //送段選數(shù)據(jù)
DUAN=0; //段選鎖定
P0=0xff; //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時(shí)原來段選數(shù)據(jù)通過位選鎖存器造成混亂
WEI=1; //打開位選
P0=0xfe; //送位選數(shù)據(jù)
WEI=0; //位選鎖定
delayms(5); //延時(shí)
DUAN=1; //打開段選
P0=table[ge]; //送段選數(shù)據(jù)
DUAN=0; //段選鎖定
P0=0xff; //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時(shí)原來段選數(shù)據(jù)通過位選鎖存器造成混亂
WEI=1; //打開位選
P0=0xfd; //送位選數(shù)據(jù)
WEI=0; //位選鎖定
delayms(5); //延時(shí)
}
void delayms(uint xms) //延時(shí)子函數(shù)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--); //i=xms即延時(shí)約xms毫秒
}
void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; //重裝初值
num1++;
if(num1==1200) //如果到了1200次,說明60秒時(shí)間到
{
num1=0; //然后把num1清0重新再計(jì)1200次
FG=~FG; //讓蜂鳴器狀態(tài)取反
delayms(100);
FG=~FG;
}
}
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256; //重裝初值
num2++;
if(num2==20) //如果到了20次,說明1秒時(shí)間到
{
num2=0; //然后把num2清0重新再計(jì)20次
num++;
if(num==60) //這個(gè)數(shù)用來送數(shù)碼管顯示,到60后歸0
num=0;
shi=num/10; //把一個(gè)二位數(shù)分離后分別送數(shù)碼管顯示
ge=num%10; //十位和個(gè)位
}
} |
|