你还会写这段C51程序吗?
经典题目解析
定时器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的,让更多的人知道你们也踩过坑~
往期好文合集
他说他是具有文学气息的工科屌丝男(900字文言文,硕士论文致谢)
清华博士告诉你 “0Ω电阻”的系列应用
干货 | 双目摄像头实现手势识别,完美还原人体运动手势。
这篇文章后,不要再问我怎么做一台智能车了。
群体智能,多个机器人协同搬运!
最 后
若觉得文章不错,转发分享,也是我们继续更新的动力。
5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等!
在公众号内回复「更多资源」,即可免费获取,期待你的关注~
长按识别图中二维码关注
你还会写这段C51程序吗?相关推荐
- JavaScript学习(八十)—请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中
JavaScript学习(八十)-请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中 题目: 代码:
- 如何用C语言写一段关机程序,恶搞代码,很简单的呦
如何用C语言去写一段关机程序? 有的初学者觉得C语言编程太枯燥了,想要写个程序来太难了,甚至有的人在学习了C之后就觉得C语言只能去写一些黑白框里的简单程序,其实不是的,C语言是一种面向过程的开发语言, ...
- 写一段c程序,把“rsrp:-107,rsrq:-6,rssi:-81,sinr:11”数字提取出来
以下是可以提取出"rsrp:-107,rsrq:-6,rssi:-81,sinr:11"数字的C程序: #include <stdio.h> #include < ...
- 这家公司为了让员工玩游戏还专门写了一个小程序
宜 游戏 12 2020/9 ------ 星期六 普元第一届王者荣耀公开赛圆满结束! 首先的首先, 恭喜北京Wfp只手遮天战队 获得第一届普元王者荣耀公开赛总冠军! 本次活动,参赛选手累计120余名 ...
- 接口超时后程序还会继续执行嘛_答网友问:分析一段STL程序,并就如何读懂一段程序谈几点感想...
在文章<S7-300/400进阶笔记5.1:300系列PLC的装载存储器的类别及方法>一文后,有小伙伴在评论区提了个问题,驼子决定有必要写一篇文章,和大家一起讨论一下.也希望小伙伴们能向& ...
- 徐磊(Devops):一名写了十几年代码但还没写够的程序员
徐磊(Devops 社区领袖) [个人介绍] 徐磊,微软MVP(微软最有价值专家,大中华区域社区技术总监,Devops 社区领袖),从事过网管.技术支持.网络.软件开发等工作,一名写了十几年代码但还没 ...
- 在记事本上用java写一段代码,程序到底是如何跑起来的?
首先我们在记事本上写一段代码,并把类型改成java文件 不知道大家有没有想过,当我们写下这样一段代码,计算机是如何来运行它的? 它的运行路径如下: 第一步:我们在记事本上写代码,它是一个.java文件 ...
- 有一个函数 x , x大于1 ,y等于 { 2x-1 1大于等于x小于10 3x-11 x大于等于10 写一段程序,输入x,输出y。
题目描述 有一个函数 | x x<1 y= { 2x-1 1<=x<10 | 3x-11 x>=10 写一段程序,输入x,输出y. 将下面的程序填写完整. #include & ...
- python 试题:写一段程序逐行读入一个文本文件,并在屏幕上打印出来。
写一段程序逐行读入一个文本文件,并在屏幕上打印出来. 参考答案: f = open(filename) while True: line = f.readline() if ...
最新文章
- HTTP协议通信原理 (资源)
- 解决在vue中axios请求超时的问题
- 前端学习(603):计算机基础
- 从底层重学 Java 之四大整数 GitChat链接
- JAVA设计模式--简单介绍
- 如何卸载非linux系统分区,如何卸载Linux系统分区?卸载Linux系统分区的方法-站长资讯中心...
- 依赖注入有点_一文读懂Java控制反转(IOC)与依赖注入(DI)
- win8远程访问mysql_Windows 安装 mysql8.0 配置远程访问
- onenote设置默认新建页面颜色非白色
- Shell命令-系统信息及显示之free、cal
- 官网opencv练习题 最简单的多物体分离技术
- Git学习收获(一)
- 使用linux批量引物设计,使用SSRMMD便捷、迅速与准确地进行:SSR位点检测,多态性SSR筛选,与批量SSR引物设计...
- 如何创建sis文件——概叙
- python敏感字替换_python如何实现敏感词替换
- ubuntu拨号上网
- 市场调研-全球与中国沉鱼饲料市场现状及未来发展趋势
- 力扣 面试题 17.09. 第 k 个数
- 如何用读书构建你的思维世界
- 日本代数几何学派简介
热门文章
- 如何下载SAP Intelligent Robotic Process Automation相关的软件
- SAP Gateway 类型为multipart mixed的请求处理逻辑
- setProperty will trigger ui re-render 南京同事提的问题
- SAP ui5 setModel 的核心逻辑
- test of ui5 duplicate control id
- Text determination debug
- SAP官方发布的ABAP编程规范
- Try to create new xs project in AG3
- Document Builder: REMOVE_CC_DEFAULT_TEXTS
- SAP ABAP实用技巧介绍系列之锁住某个特定的工作进程