|
設(shè)計(jì)一個(gè)單片機(jī)實(shí)驗(yàn),完成對(duì)定時(shí)器事件進(jìn)行計(jì)數(shù),當(dāng)來2個(gè)時(shí),通過中斷用數(shù)碼管顯示相應(yīng)信息或執(zhí)行一個(gè)任務(wù),當(dāng)來6個(gè)時(shí),又顯示另外的信息或執(zhí)行另一個(gè)任務(wù),計(jì)數(shù)具備清零,發(fā)現(xiàn)中斷時(shí),有相應(yīng)信息提示。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
中斷
單片機(jī)源程序如下:
- #include <reg51.h>
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- typedef unsigned char u8;
- sbit led1=P3^0;
- sbit led2=P1^0;
- sbit k0=P3^2; //定義按鍵K3
- #define smg P2
- u8 tab[]= //段碼表
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,這是共陰極數(shù)碼管0-9的段碼
- int count0,count1;
- //定時(shí)器0溢出中斷程序
- void timer0() interrupt 1 //定時(shí)器0中斷標(biāo)志位為1
- {
- //重新裝載定時(shí)器0計(jì)數(shù)初值
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(count0==20) //T0*10=1s LED1閃爍
- {
- led1=~led1;
- count0=0;
- }
- count0++;
- }
- //定時(shí)器1溢出中斷程序
- void timer1() interrupt 3 //定時(shí)器1中斷標(biāo)志位為3
- {
- //重新裝載定時(shí)器1計(jì)數(shù)初值
- TH1=(65536-25000)/256;
- TL1=(65536-25000)%256;
-
- count1++;
-
- if(count1==40) //T1*10=0.5s LED2閃爍 20為2秒
- {
- led2=~led2;
- //count1=0;
- }
- if(count1==120*3) //為6秒
- {
- smg = tab[6];
- //count1 = 0;
- }
-
- }
- int main()
- {
- EA=1; //全局中斷使能
- ET0=1; //定時(shí)器0溢出中斷使能
- ET1=1; //定時(shí)器1溢出中斷使能
- TR0=1; //定時(shí)器0使能
- TR1=1; //定時(shí)器1使能
- TMOD=0x11; //00010001B,定時(shí)器0、1使用工作方式1,16位定時(shí)器
- //裝載定時(shí)器0計(jì)數(shù)初值
- TH0=(65536-50000)/256; //內(nèi)置時(shí)鐘頻率為6MHz,定時(shí)器0計(jì)數(shù)50000次,計(jì)數(shù)初值為15536轉(zhuǎn)為16進(jìn)制
- TL0=(65536-50000)%256; //機(jī)械周期為2us,T0=(65536-計(jì)數(shù)初值)*2us=0.1s
- //裝載定時(shí)器1計(jì)數(shù)初值
- TH1=(65536-25000)/256; //內(nèi)置時(shí)鐘頻率為6MHz,定時(shí)器0計(jì)數(shù)25000次,計(jì)數(shù)初值為40536轉(zhuǎn)為16進(jìn)制
- TL1=(65536-25000)%256; //機(jī)械周期為2us,T1=(65536-計(jì)數(shù)初值)*2us=0.05s
- led1=0; //控制P3.0
- led2=0; //控制P1.0
-
- while(1)
- {
-
- }
- }
復(fù)制代碼
Keil代碼與Proteus仿真下載:
定時(shí)器中斷:
實(shí)驗(yàn)1.7z
(48.79 KB, 下載次數(shù): 12)
2022-4-8 18:40 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|