設(shè)計一個單片機實驗,完成對定時器事件進行計數(shù),當來2個時,通過中斷用數(shù)碼管顯示相應(yīng)信息或執(zhí)行一個任務(wù),當來6個時,又顯示另外的信息或執(zhí)行另一個任務(wù),計數(shù)具備清零,發(fā)現(xiàn)中斷時,有相應(yīng)信息提示。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (71.22 KB, 下載次數(shù): 46)
下載附件
2022-4-8 16:30 上傳
51hei.png (45.77 KB, 下載次數(shù): 42)
下載附件
中斷
2022-4-8 16:30 上傳
單片機源程序如下:
- #include <reg51.h>
- typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
- 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;
- //定時器0溢出中斷程序
- void timer0() interrupt 1 //定時器0中斷標志位為1
- {
- //重新裝載定時器0計數(shù)初值
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(count0==20) //T0*10=1s LED1閃爍
- {
- led1=~led1;
- count0=0;
- }
- count0++;
- }
- //定時器1溢出中斷程序
- void timer1() interrupt 3 //定時器1中斷標志位為3
- {
- //重新裝載定時器1計數(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; //定時器0溢出中斷使能
- ET1=1; //定時器1溢出中斷使能
- TR0=1; //定時器0使能
- TR1=1; //定時器1使能
- TMOD=0x11; //00010001B,定時器0、1使用工作方式1,16位定時器
- //裝載定時器0計數(shù)初值
- TH0=(65536-50000)/256; //內(nèi)置時鐘頻率為6MHz,定時器0計數(shù)50000次,計數(shù)初值為15536轉(zhuǎn)為16進制
- TL0=(65536-50000)%256; //機械周期為2us,T0=(65536-計數(shù)初值)*2us=0.1s
- //裝載定時器1計數(shù)初值
- TH1=(65536-25000)/256; //內(nèi)置時鐘頻率為6MHz,定時器0計數(shù)25000次,計數(shù)初值為40536轉(zhuǎn)為16進制
- TL1=(65536-25000)%256; //機械周期為2us,T1=(65536-計數(shù)初值)*2us=0.05s
- led1=0; //控制P3.0
- led2=0; //控制P1.0
-
- while(1)
- {
-
- }
- }
復(fù)制代碼
Keil代碼與Proteus仿真下載:
定時器中斷:
實驗1.7z
(48.79 KB, 下載次數(shù): 12)
2022-4-8 18:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|