找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1826|回復: 0
打印 上一主題 下一主題
收起左側

單片機定時器中斷及仿真 時間到LED反轉

[復制鏈接]
跳轉到指定樓層
樓主
ID:449849 發(fā)表于 2022-4-8 09:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
設計一個單片機實驗,完成對定時器事件進行計數,當來2個時,通過中斷用數碼管顯示相應信息或執(zhí)行一個任務,當來6個時,又顯示另外的信息或執(zhí)行另一個任務,計數具備清零,發(fā)現中斷時,有相應信息提示。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg51.h>

  2. typedef unsigned int u16;          //對數據類型進行聲明定義
  3. typedef unsigned char u8;

  4. sbit led1=P3^0;
  5. sbit led2=P1^0;

  6. sbit k0=P3^2;  //定義按鍵K3

  7. #define smg P2

  8. u8 tab[]=                   //段碼表
  9. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  10. //0,          1,         2,          3,         4,                5,         6,                7,         8,                9,這是共陰極數碼管0-9的段碼


  11. int count0,count1;

  12. //定時器0溢出中斷程序
  13. void timer0() interrupt 1  //定時器0中斷標志位為1
  14. {
  15.         //重新裝載定時器0計數初值
  16.         TH0=(65536-50000)/256;
  17.         TL0=(65536-50000)%256;
  18.         if(count0==20)   //T0*10=1s LED1閃爍
  19.         {
  20.                 led1=~led1;
  21.                 count0=0;
  22.         }
  23.         count0++;
  24. }

  25. //定時器1溢出中斷程序
  26. void timer1() interrupt 3  //定時器1中斷標志位為3
  27. {
  28.         //重新裝載定時器1計數初值
  29.         TH1=(65536-25000)/256;
  30.         TL1=(65536-25000)%256;
  31.         
  32.         count1++;
  33.         
  34.         if(count1==40)  //T1*10=0.5s LED2閃爍  20為2秒
  35.         {
  36.                 led2=~led2;
  37.                 //count1=0;
  38.         }
  39.         if(count1==120*3) //為6秒
  40.         {
  41.                 smg = tab[6];
  42.                 //count1 = 0;
  43.         }
  44.         
  45. }

  46. int main()
  47. {
  48.         EA=1;    //全局中斷使能
  49.         ET0=1;   //定時器0溢出中斷使能
  50.         ET1=1;   //定時器1溢出中斷使能
  51.         TR0=1;   //定時器0使能
  52.         TR1=1;   //定時器1使能
  53.         TMOD=0x11;   //00010001B,定時器0、1使用工作方式1,16位定時器
  54.         //裝載定時器0計數初值
  55.         TH0=(65536-50000)/256;    //內置時鐘頻率為6MHz,定時器0計數50000次,計數初值為15536轉為16進制
  56.         TL0=(65536-50000)%256;    //機械周期為2us,T0=(65536-計數初值)*2us=0.1s
  57.         //裝載定時器1計數初值
  58.         TH1=(65536-25000)/256;    //內置時鐘頻率為6MHz,定時器0計數25000次,計數初值為40536轉為16進制
  59.         TL1=(65536-25000)%256;    //機械周期為2us,T1=(65536-計數初值)*2us=0.05s
  60.         led1=0;   //控制P3.0
  61.         led2=0;   //控制P1.0
  62.         
  63.         while(1)
  64.         {
  65.                  
  66.         }

  67. }
復制代碼

Keil代碼與Proteus仿真下載:
定時器中斷: 實驗1.7z (48.79 KB, 下載次數: 12)

評分

參與人數 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表