51单片机的中断与定时计数器尝试
2016-08-18 00:04
621 查看
这是我的第一篇有关51单片机的博客,主要记录我的学习历程与中间遇到的问题,如有错漏请指出。
在我理解里面中断与定时计数器是这样的:
中断是通过检查P3.2(INT0)与P3.3(INT1)两个引脚来触发的
计数器是通过检查P3.4(T0)与P3.5(T1)两个引脚的状态,要达到一定的次数(一般是记脉冲数)才触发
定时器不需要检测引脚,直接计数
先说中断的代码
其中,SDT为共阳极静态数码管,P3.2(INT0)与P3.3(INT1)两个引脚分别接两个共阴的开关K1与K2
这个程序的功能就是无按键时,数码管全亮(0x00),
当按下K1时,数码管从一走到九
当按下K2时,数码管熄灭600ms,如果在INT0的执行过程中按K2,INT0会被中断(其实是挂起),立刻执行INT1,完成INT1后再返回INT0
然后说说计数器
定时器
其实定时器和计数器很相似,只用在TMOD里修改就行
总结:
其实中断,计数器,定时器很相似
共用的寄存器:定时计数器控制寄存器TCON, 中断优先寄存器IP 和 中断允许寄存器IE
定时计数器特有的寄存器:工作方式寄存器TMOD
附一些有关这些寄存器的资料(转自 普中科技,侵删)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/35e8a704c7ce82f601e883589bc0a686)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/23a6b0333f5deabb3f481fa4e4254ebf)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/34b7d026d0f545b548d5b12b0fd54f4f)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/5a381fa95abaf4121f588e48e7e9558f)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201608/ae3264677bcf5c963fea7186712bcec5)
在我理解里面中断与定时计数器是这样的:
中断是通过检查P3.2(INT0)与P3.3(INT1)两个引脚来触发的
计数器是通过检查P3.4(T0)与P3.5(T1)两个引脚的状态,要达到一定的次数(一般是记脉冲数)才触发
定时器不需要检测引脚,直接计数
先说中断的代码
#include<reg51.h> #include<intrins.h> #define SDT P0//静态数码管定义 unsigned char temp; unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模 void delay10ms(unsigned int c) { unsigned int i,j; for(;c>0;c--) for(i=38;i>0;i--) for(j=130;j>0;j--); } void interCongf() { //设置中断0 IT0=1;//IT=0表示低电平触发 IT=1表示负跳变沿触发 EX0=1;//EX为外部中断的允许位 PX0=0;//PX=0表示低优先级 PX=1表示高优先级 //设置中断1 IT1=1; EX1=1; PX1=1;//中断1的优先级比中断0高 EA=1;//总中断允许位 } void main() { unsigned char ininum=0; interCongf(); SDT=0x00; while(1){} } void inter0() interrupt 0 //外部中断0 { EX0=0; for(temp=0;temp<10;temp++) //中断内部无法定义函数 { SDT=SDT_map[temp]; delay10ms(10); } EX0=1; //在开始和结尾关开中断,防止中断运行过程中误触 } //void timer0() interrupt 1 {} //定时器中断0 void inter1() interrupt 2 //外部中断1 { EX1=0; SDT=0xff; delay10ms(30); EX1=1; } //void timer1() interrupt 3 {} //定时器中断1 //void serialport() interrupt 4 {} //串行口中断
其中,SDT为共阳极静态数码管,P3.2(INT0)与P3.3(INT1)两个引脚分别接两个共阴的开关K1与K2
这个程序的功能就是无按键时,数码管全亮(0x00),
当按下K1时,数码管从一走到九
当按下K2时,数码管熄灭600ms,如果在INT0的执行过程中按K2,INT0会被中断(其实是挂起),立刻执行INT1,完成INT1后再返回INT0
然后说说计数器
#include<reg51.h> #include<intrins.h> #define SDT P0//静态数码管定义 sbit pulse=P1^0; unsigned char temp=0; unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模 void delay10ms(unsigned int c) { unsigned int i,j; for(;c>0;c--) for(i=38;i>0;i--) for(j=130;j>0;j--); } void timeConfg() { TMOD=0x05; //选用计数模式和 选用模式1 TH0=0xD8; TL0=0xF6; //计数10000次 EA=1; ET0=1; TR0=1; } void main() { SDT=0xff; timeConfg(); while(1) { pulse=0; _nop_(); _nop_(); _nop_(); _nop_(); pulse=1; _nop_(); _nop_(); _nop_(); _nop_(); } } //void inter0() interrupt 0 {} //外部中断0 void timer0() interrupt 1 //定时器中断0 { TH0=0xD8;//如果不更新TH0与TL0的值,第二次计数将从0~65535+1 TL0=0xF6; SDT=SDT_map[(temp++)%10]; } //void inter1() interrupt 2 {} //外部中断1 //void timer1() interrupt 3 {} //定时器中断1 //void serialport() interrupt 4 {} //串行口中断
定时器
#include<reg51.h> #include<intrins.h> #define SDT P0//静态数码管定义 unsigned char temp=0, status=0; unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模 void timeConfg() { TMOD=0x01; //选用定时器模式和 选用模式1 TH0=0xd8; TL0=0xf0; //定时 计数10000次 EA=1; ET0=1; TR0=1; } void main() { SDT=SDT_map[temp]; timeConfg(); while(1) { if(status==100) { temp++; status=0; SDT=SDT_map[temp%10]; } } } //void inter0() interrupt 0 {} //外部中断0 void timer0() interrupt 1 //定时器中断0 { TH0=0xd8;//如果不更新TH0与TL0的值,第二次计数将从0~65535+1 TL0=0xf0; status++; } //void inter1() interrupt 2 {} //外部中断1 //void timer1() interrupt 3 {} //定时器中断1 //void serialport() interrupt 4 {} //串行口中断
其实定时器和计数器很相似,只用在TMOD里修改就行
总结:
其实中断,计数器,定时器很相似
共用的寄存器:定时计数器控制寄存器TCON, 中断优先寄存器IP 和 中断允许寄存器IE
定时计数器特有的寄存器:工作方式寄存器TMOD
附一些有关这些寄存器的资料(转自 普中科技,侵删)
相关文章推荐
- 51单片机定时计数器溢出率计算和串口的波特率之间的关系
- 第一篇:51单片机的中断和定时
- 基于proteus的51单片机仿真实例五十七、定时器/计数器T0的定时实例
- 基于proteus的51单片机仿真实例五十八、定时器/计数器T1的定时实例
- 51单片机以定时中断的方法实现DS18B20时序
- 用Proteus学习51单片机之中断
- 51单片机的外部中断
- 嵌入式学习笔记(9)——51单片机之中断(外部中断)
- 使用51内核单片机检测开关状态中断函数的问题
- 51 单片机扩充外部中断
- 51单片机中断学习
- 单片机 计数/定时 中断实验
- 51单片机中断详解(中)
- 单片机中断定时
- 51 单片机汇编语言:0~100 计数器
- 防干锅51单片机报警程序——很简单的小尝试
- 【51单片机学习过程记录】10 中断之定时计数器1的应用
- 单片机定时记数中断程序1--c语言实现
- 单片机关于定时计数器的C编程
- 3、SONIX单片机T0中断定时