你还会写这段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的,让更多的人知道你们也踩过坑~


扫码或长按关注

回复「 篮球的大肚子」进入技术群聊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDBC连接数据库(Java DataBase Connectivity,java)

通过JDBC操作数据库(以mysql为例) 1、官网下载JDBC的相关JAR包 【https://dev.mysql.com/downloads/connector/j/】 2、解压后&#xff0c;导入jar包 连接数据(引入外部jar包)项目上右键->build path->configure build path->上面Libraries->Add External JARs 3、…

过年回家抢票攻略

每年过年抢票都是一个困难的事情&#xff0c;所以决定发一篇文章汇总一下各种抢票软件&#xff0c;大家自己有方案的可以在文章后面留言&#xff0c;让跟多的人看到&#xff0c;希望大家都能顺利抢到车票&#xff0c;顺利回家。超级抢票机&#xff0c;一款超强的火车票抢票神器…

C语言,函数不可返回指向栈内存的指针

预备知识&#xff1a;内存的分类C/C程序占用的内存分为两大类&#xff1a;静态存储区与动态存储区。其示意图如下所示&#xff1a;数据保存在静态存储区与动态存储区的区别就是&#xff1a;静态存储区在编译-链接阶段已经确定了&#xff0c;程序运行过程中不会变化&#xff0c;…

android 界面绘制完毕,几种获取android 界面性能数据的快捷方法

探测 界面绘制性能获取界面的绘制性能有很多种方法&#xff0c;比如说 Systrace 但是这种方法 有一个不太好的地方就是使用起来较为复杂&#xff0c; 有没有一种 谷歌官方推荐 的方便一点的方法 &#xff0c;其实是有的&#xff0c;只需要一个函数 就可以获得layout的时间 非常…

联想rd650怎么装系统win7_Lenovo g50重装win7系统|U盘重装联想g50笔记本系统

Lenovo可以说是个家喻户晓的品牌很多小伙伴们也是使用联想的电脑&#xff0c;今天有小伙伴和小编提了一款Lenovo g50笔记本&#xff0c;小编了解到这款笔记本电脑的口碑和销量都很不错&#xff0c;其实这位小伙伴的问题呢是要如何重装win7系统&#xff0c;毕竟质量再好的电脑也…

书籍推荐

今天天气很好&#xff0c;风和日丽&#xff0c;艳阳高照&#xff0c;大家心情应该也很不错&#xff0c;毕竟&#xff0c;今天是周五&#xff0c;就像上学的时候一样&#xff0c;下午的铃声一响&#xff0c;每个同学都像脱缰的野马一样&#xff0c;周五&#xff0c;上班族的人们…

【转】JMeter学习(十三)分布式部署

Jmeter 是Java 应用&#xff0c;对于CPU和内存的消耗比较大&#xff0c;因此&#xff0c;当需要模拟数以千计的并发用户时&#xff0c;使用单台机器模拟所有的并发用户就有些力不从心&#xff0c;甚至会引起JAVA内存溢出错误。为了让jmeter工具提供更大的负载能力&#xff0c;j…

android mvp框架基类,Android MVP架构模式基类封装

前言MVP模式是Android官方推荐的架构模式&#xff0c;可使视图与数据层完全解耦。本文旨意封装在MVP模式中的基类如Activity&#xff0c;Fragment&#xff0c;Presenter类。以下内容建议在了解了mvp模式的读者阅读&#xff0c;如果还有对mvp架构模式有疑问的&#xff0c;请看我…

C语言,字符串指针做函数参数

看一下下面这段代码有什么问题&#xff1f;#include "stdio.h" //#include "stdbool.h" #include "string.h" #include "stdlib.h" #include "math.h"void getMemory(char *p) {/*char *p str*/p (char *)malloc(100);str…

java创建一个未知长度的数组_Java数组的创建操作

数组是一个固定长度的&#xff0c;包含了相同类型数据的 容器步骤1:声明数组步骤2:创建数组步骤3:访问数组步骤4:数组长度步骤5:练习-数组最小值步骤6:答案-数组最小值步骤 1 : 声明数组int[] a; 声明了一个数组变量。[]表示该变量是一个数组int 表示数组里的每一个元素都是一个…

Linux内核中的GPIO系统

一、前言作为一个工作多年的系统工程师&#xff0c;免不了做两件事情&#xff1a;培训新员工和给新员工分配任务。对于那些刚刚从学校出来的学生&#xff0c;一般在开始的时候总是分配一些非常简单的任务&#xff0c;例如GPIO driver、LED driver。往往CPU datasheet的关于GPIO…

初识函数集锦

python之路——初识函数 阅读目录 为什么要用函数  函数的定义与调用  函数的返回值  函数的参数  本章小结为什么要用函数 现在有一个需求&#xff0c;让你计算hello world的长度&#xff0c;你怎么计算&#xff1f; s1hello world length0 for i in s1:length1 print…

送你一个Git命令地图

上周&#xff0c;公众号举办了一个活动&#xff0c;抽取Git鼠标垫&#xff0c;现在已经结束了&#xff0c;大家不用再过去找&#xff0c;周末我收到了鼠标垫&#xff0c;然后看到有几个读者朋友圈也发了&#xff0c;我感觉也算是做了一个好事&#xff0c;拿到鼠标垫&#xff0c…

文件的权限与隐藏属性

一、文件的属性 1. 权限详解 r 表示读权限————————————读取文件内容 w 表示写权限————————————编辑、新增、修改内容(非删除) x 代表执行权限———————————读取文件内容 — 表示没有该权限——————————读取文件内容 2. 权限对目录的重…

利用insert、update和delete命令可以同时对多个表进行操作_学习笔记-操作系统(1)...

概念负责管理协调硬件、软件等计算机资源的工作为上层用户、应用程序提供简单易用的服务是一种系统软件功能和目标资源的管理者处理机管理&#xff1a;进程管理&#xff08;进程控制、进程同步、进程通信、死锁处理、处理机调度&#xff09;存储器管理&#xff1a;内存管理&…

uboot和Linux内核移植

这篇文章是一个读者昨晚发给我的&#xff0c;文章很长&#xff0c;里面的细节也比较多&#xff0c;但是微信公众号只能发 50000 字的文章&#xff0c;如果想阅读全文。请发送「 uboot和Linux内核移植 」到公众号后台获取下载链接。这篇文章是一个读者昨晚发给我的&#xff0c;文…

android界面元素识别,Android 10不能使用uiautomatorviewer定位元素的终极解决方法

Android app 元素定位除了使用Appium Inspector 外&#xff0c;还可以使用Android SDK 里tools中的uiautomatorviewer 工具。但今天打算使用 uiautomatorviewer 进行元素定位的时候&#xff0c;发现无法截图&#xff0c;并报如下错误&#xff1a;Unexpected error while obtain…

小程序背景图满屏_竞赛答题小程序

越来越多的企业部门团体举办知识竞赛答题活动&#xff0c;根据更加好玩的答题活动规则开发了本款知识竞赛答题小程序。本知识竞赛答题小程序采用云开发&#xff0c;无需搭建服务器&#xff0c;无需域名即可使用数据管理能力&#xff0c;更方便答题活动等场景&#xff0c;无需域…

STM32的map文件学习笔记

前言 前几个月针对公司自己的芯片写了个程序&#xff0c;这个程序有个硬性要求&#xff0c;就是能用的FLASH空间只有4KB&#xff0c;之前已经写得差不多了&#xff0c;最终占用空间3.6KB。这不&#xff0c;最近又得加需求&#xff0c;还剩一点点FLASH空间可以使用&#xff0c;这…

html网易云音乐图片轮播效果,Vue之网易云音乐PC版轮播图的实现

Github - program-learning-lists最近在刷网易云音乐歌单时发现首页的轮播图很有意思&#xff0c;正好自己想尝试做一个PC版的网易云音乐&#xff0c;于是就是使用Vue去做这个demo&#xff0c;废话少说&#xff0c;我要出招了&#xff0c;接招吧页面的DOM结构:style"slide…