基於proteus的51單片機仿真實例五十八、定時器/計數器T1的定時實例

1、本例使用定時器1的定時中斷控制2個LED實現不同的閃爍頻率。
2、實現方法:通過給定時器T1設置適當的初值,實現50MS的定時中斷,由於要控制兩個LED以不同的頻率閃爍,因而需要設置兩個變量來分別計算中斷次數。
3、在keil c51中新建工程ex46,編寫如下程序代碼,編譯並生成ex46.hex文件
#include <reg51.h>   //包含頭文件
 sbit LED1=P1^0;      //端口位定義
 sbit LED2=P1^1;
 unsigned char counter1,counter2;   //定義全局變量,用以存儲定時器的中斷溢出次數
 //主函數
 void main(void)
 {
   EA = 1;     //開總中斷
 ET1 = 1;    //定時器T1中斷允許
 TMOD = 0x10;   // 設置定時器的工作方式
 TH0 = (65536-46083)/256;    //定時器賦初值
 TL0 = (65536-46083)%256;
 TR1 = 1;       //開啓定時器
 LED1 = 1;       //關閉LED
 LED2 = 1;
 counter1 = 0;      //中斷次數初值爲0
 counter2 = 0;
 while(1)
 {
 }
 }
 //定時器1的定時中斷服務函數,定時時長50ms
 void Time1(void) interrupt 3 using 0 
 {
   counter1++;       //中斷次數加1
 counter2++;
 
 if(counter1 == 2)   //如果記滿2次。也即計時夠100ms
 {
   LED1 = ~LED1;   //,LED1端口取反
  counter1 = 0;   //計數值1清0
 }
 if(counter2 == 8)   //如果記滿2次。也即計時夠400ms
 {
   LED2 = ~LED2;     // LED2端口取反
  counter2 = 0;     //計數值2清0
 }
 TH0 = (65536-46083)/256;    //定時器重新賦初值
 TL0 = (65536-46083)%256;
 }
 
4、在proteus中新建仿真文件ex46.dsn,電路原理圖如下所示:

 
5、將ex46.hex文件載入at89c51中,啓動仿真,按動按鍵,觀察程序運行結果,下圖是某一時刻程序運行結果


發佈了112 篇原創文章 · 獲贊 112 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章