设计一个单片机实验,完成对定时器事件进行计数,当来2个时,通过中断用数码管显示相应信息或执行一个任务,当来6个时,又显示另外的信息或执行另一个任务,计数具备清零,发现中断时,有相应信息提示。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
中断
单片机源程序如下:
- #include <reg51.h>
- typedef unsigned int u16; //对数据类型进行声明定义
- 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,这是共阴极数码管0-9的段码
- int count0,count1;
- //定时器0溢出中断程序
- void timer0() interrupt 1 //定时器0中断标志位为1
- {
- //重新装载定时器0计数初值
- 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计数初值
- 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计数初值
- TH0=(65536-50000)/256; //内置时钟频率为6MHz,定时器0计数50000次,计数初值为15536转为16进制
- TL0=(65536-50000)%256; //机械周期为2us,T0=(65536-计数初值)*2us=0.1s
- //装载定时器1计数初值
- TH1=(65536-25000)/256; //内置时钟频率为6MHz,定时器0计数25000次,计数初值为40536转为16进制
- TL1=(65536-25000)%256; //机械周期为2us,T1=(65536-计数初值)*2us=0.05s
- led1=0; //控制P3.0
- led2=0; //控制P1.0
-
- while(1)
- {
-
- }
- }
复制代码
Keil代码与Proteus仿真下载:
定时器中断:
实验1.7z
(48.79 KB, 下载次数: 12)
|