|
/*此實(shí)際旨在同時(shí)使用定時(shí)器中斷和二個(gè)外部中斷。
實(shí)驗(yàn)意圖:開機(jī)后,五位數(shù)碼管顯示當(dāng)前八支二極管燈延時(shí)切換的數(shù)據(jù)100.
外部中斷按鈕可以對延時(shí)數(shù)據(jù)進(jìn)行加和減,由五位數(shù)碼管顯示出來(用六位代替)。
實(shí)驗(yàn)電路:
P0口通過74373接8位共陰LED燈;P2口通過74245接至五位共陰數(shù)碼管段顯端;
P1.0-P1.2接至74138地址端; 74138的低五位輸出接五位數(shù)碼管的位控端,控制其陽極電源;
中斷口:P3.2和P3.3分別接至一開關(guān)(按下時(shí)提供下降脈沖),給中斷口下降觸發(fā)信號。
結(jié)果:實(shí)驗(yàn)結(jié)果按照設(shè)想的達(dá)到目的了,但是是在中斷發(fā)生時(shí),數(shù)碼管會(huì)抖動(dòng)。估計(jì)需要把數(shù)碼管數(shù)據(jù)磅鎖存器才有效果。比如74373IC。
*/
#include<reg52.h> //本程序接8位共陰數(shù)碼管在P0口實(shí)驗(yàn)燈閃電路
#include<intrins.h>
sbit A0=P1^0; //138地址端及使能端
sbit A1=P1^1;
sbit A2=P1^2;
sbit EN_138=P1^3;
sbit EN_373=P1^4; //373使能端1腳,為0時(shí)使能,為1時(shí)輸出高阻
sbit GEN_373=P1^5; //373鎖存端11腳。當(dāng)其由高轉(zhuǎn)低時(shí),輸出端鎖存,當(dāng)其由低為高時(shí),輸出等于輸入
unsigned int jx_hj=500; //延時(shí)指針
unsigned int cnt1=0; //定時(shí)器計(jì)時(shí)指針
unsigned char led=0x01; //Led燈的初始數(shù)據(jù)
static unsigned char led_skip=0; //Led移位指針
unsigned char code Ledchar[]= //用數(shù)組來存貯共陽數(shù)碼管0-9的真值
{0xC0,0xF9,0xa4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
volatile void delay(unsigned char chj) //100us帶參數(shù)的延時(shí)函數(shù)
{
unsigned char mhj;
for(mhj=1;mhj<chj;mhj++)
{
unsigned char a,b,c;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}
}
void main()
{
unsigned char j;
EA=1; //中斷總開關(guān)
//設(shè)立外部中斷:
EX0=1; //外部中斷INT0使能
IT0=1; //下降沿觸發(fā) IT0=0為低電平觸發(fā)
EX1=1; //外部中斷INT1使能
IT1=1; //下降沿觸發(fā) IT1=0為低電平觸發(fā)
//設(shè)置T0中斷及初值:
TMOD=0x01; //設(shè)置T0為模式1
TH0 = 0x0FF;
TL0 = 0x0CE;
ET0=1; //使能T0中斷
TR0=1; //啟動(dòng)T0
while(1)
{
P0=~(led<<led_skip);
for(j=0;j<5;j++)
{
EN_138=0; //關(guān)閉138使能
EN_373=0; //373輸出高阻,起消隱作用
GEN_373=1; //373鎖存數(shù)據(jù);
delay(2); //該延時(shí)長短帶著消隱的效果,太短,消隱效果不好,太長,數(shù)碼管可能會(huì)閃爍
switch(j)
{
case 0: A2=0;A1=0;A0=0;P2=Ledchar[jx_hj%10];break;
case 1: A2=0;A1=0;A0=1;P2=Ledchar[jx_hj/10%10];break;
case 2: A2=0;A1=1;A0=0;P2=Ledchar[jx_hj/100%10];break;
case 3: A2=0;A1=1;A0=1;P2=Ledchar[jx_hj/1000%10];break;
case 4: A2=1;A1=0;A0=0;P2=Ledchar[jx_hj/10000%10];break;
default:break;
}
EN_138=1;
}
}
}
void interruptTimer0() interrupt 1 //定時(shí)器0中斷服務(wù)函數(shù)
{
TH0 = 0x0FF;
TL0 = 0x0CE;
cnt1++; //中斷次數(shù)計(jì)數(shù)值加1
if(cnt1>=jx_hj) //中斷100次即0.1S
{
cnt1=0; //清零計(jì)數(shù)值以重新計(jì)時(shí)
if(led_skip<7) led_skip++;
else led_skip=0;
}
}
/*INT0中斷函數(shù) */
void counter0(void) interrupt 0
{
EX0=0; //關(guān)閉中斷
delay(3);
if(jx_hj<60000) jx_hj+=50; //不曉得什么原因,實(shí)際數(shù)字總是加2位這個(gè)數(shù),即加100.結(jié)果證明是中斷開關(guān)的總是。
//GEN_373=0; //373鎖存打開,輸出等于輸入,以更新數(shù)據(jù);
EX0=1; //兩次打開中斷使能
}
/*INT1中斷函數(shù) */
void counter1(void) interrupt 2
{
EX1=0;
delay(3);
if(jx_hj>100) jx_hj-=50; //同上一樣,總是減100.
//GEN_373=0;
EX1=1;
}
/***************************************/
|
|