经典题目解析
定时器T1采用计数模式,方式1中断,计数输入引脚 P3.5外接开关按钮作为计数信号输入,P1口控制8个LED小灯,初始状态所有小灯全亮,按3次按钮开关产生计数中断时,高3位和低5位交替闪烁3次,中断响应后返回初始状态 。
51里的计数器溢出中断
啥是中断?啥是计数?
通俗的说,单片机在执行main 函数时被打扰了而停下来去做其他的事,完事了又返回main 里继续执行,叫中断;
计数又叫计数器,来一个脉冲计一个数,这个过程无关于每个脉冲之间的时间间隔长短。
什么是溢出?溢出这个词是翻译英文「Overflow」过来的,通俗点说就是满了,装不下了,就是溢出,比如一个水桶可以装 100 个兵乓球,你放了101 个进去,放第 101 个的时候,就会导致水桶溢出「Overflow」。
单片机里有5个中断源以及各个中断,这里不加详细说了。特殊功能寄存器里的定时器/计数器工作「规定时间到了或者计数满了」就会溢出产生中断。定时器中断很好写,这个题目主要是介绍计数器产生中断的流水灯和总结。
硬件原理图
用一个按键接在P3.5 上面,P1 外接 8个LED 小灯。
C51代码
#include <reg51.h>unsigned char blink = 0x1F;void Delay(unsigned int i)//延时函数
{unsigned int j;for(;i>0;i--)//i是形参,不赋值for(j=0;j<125;j++){;}
}void main(void)
{TMOD = 0X50;TH1 = 0XFF;TL1 = 0XFD;/*这里表示按键按 3 次后就会溢出进入中断*/P1=0x00; /*初始灯都亮*/EA = 1; /*系统允许中断*/ET1 = 1; /*使能定时器1中断*/TR1 = 1;while(1){P1=0x00; }}void T1_int(void) interrupt 3
{
unsigned int c;
/*重装初值,只有方式2可以不用重装初值,其他方式都必须用*/
TH1 = 0XFF;TL1 = 0XFD; /*重装初值*/for(c=0;c<3;c++)/*闪烁3次*/{P1 = blink;Delay(500);/*按位取反*/blink = ~blink;P1 = blink;Delay(500);}
}
重点讲解两个寄存器
C51定时器结构看图片,P3.5 对应的是T1,TH1,TL1 统计P3.5的脉冲个数
工作方式寄存器高 4 位对应的是设置T1 的工作方式,低 4 位对应的是设置T0的工作方式。
定时器/计数器控制寄存器
了解一下:
51单片机定时器方式0,方式1,都不能自动重新置初值。当溢出后,定时器的TLI,THI已经变成了0,而我们是从计数初值开始计数才正确,所以需要重新赋初值。
T1方式1逻辑结构框图
方式2可以自动重装,所以不需要。初值在运行过程中计数器的不断加1,直到溢出时产生中断。因为这种定时方式(有的方式可以自动重置的),单片机不能重置初值,所以进入中断后必须人工重置初值,为下一次中断做准备。
第二部分,实验操作
1.敲代码,编译成hex文件,如下图
2.点击调试,在main函数里的分别第一句和最后一句代码前面对应的黄色和蓝色光标用鼠标先左键后右键(或者双击左键),选择插入/删除断点。黄色光标的位置就是执行当前代码的位置
3.插入断点后变红色
4.查看单片机寄存器 点击外围设备,弹出下面的窗口。然后点击复位键RST和旁边的运行键FS执行(都多点两次);最后,TMOD寄存器和TCON寄存器是不是符合预期值的,要是符合就没有问题。
6.这个过程叫烧录 双击主单片机,进入选择hex文件步骤,选择后直接执行左下角的执行就可以了
7.按开关SW1到第3次后,8个小灯就像下面图示交替闪烁三次,最后又回到初始全亮的样子。如果再按三次SW1又重复上面的状态。(备注:如果小灯闪烁现象不明显,就看电阻与小灯串联后的两端电位变化现象。红色点是高电平,蓝色点是低电平,黄色点是不正常。)
如下图:
为什么有这篇文章
我应该有8年没写过C51代码了,这个是一个粉丝朋友,在学习的过程中遇到了问题,发给我让我帮忙看,我寻思了下,发现这个东西还是挺有意思的,就一起调试了出来,从开始到调通,应该花了40分钟吧,中间插播各种喝水,上厕所,吹牛的时间。
然后我就让他写了这篇文章,主要是想总结下这个学习,避免以后遇到做重复的工作,然后就有了这篇文章,希望各位读者在学习中养成总结的好习惯。
我一个初中老师跟我说的一句话,叫做 「好记性不如烂笔头」 。我现在还记得,因为我觉得我不是聪明人,但是我觉得我可以用勤奋来弥补自己的不聪明。
总结一下
单片机的世界里面充满了无穷无尽的乐趣,刚开始学习C51单片机的时候,可能有很多都无法理解,但是就是从不知道到知道这个过程中,慢慢体会到电子的乐趣,就好像上面那个C51代码,刚开始,我是很不理解怎么跑到中断服务子程序里面去执行的,为什么会这样呢?想到一个词语,叫做 「百思不得姐」。然后就去看C51的构成,说白了,就是有一个开关,检测某个地方,发成异常了,CPU就判断这个溢出标志,然后就跑到中断里面去执行。
好了,就这样~ 留言说说下,你们当初是如何学习C51的,让更多的人知道你们也踩过坑~
扫码或长按关注
回复「 篮球的大肚子」进入技术群聊