找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1411|回复: 0
收起左侧

单片机定时器中断及仿真 时间到LED反转

[复制链接]
ID:449849 发表于 2022-4-8 09:56 | 显示全部楼层 |阅读模式
设计一个单片机实验,完成对定时器事件进行计数,当来2个时,通过中断用数码管显示相应信息或执行一个任务,当来6个时,又显示另外的信息或执行另一个任务,计数具备清零,发现中断时,有相应信息提示。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

中断

中断


单片机源程序如下:
  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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表