51单片机——学习笔记1

一、作业展示:

上传中……

二,外设介绍:

1、独立按键:

a.独立按键原理图:

可以看到:按键之间并联连接,实现每个按键相互独立。对每一个按键,都通过P3的一位,即一个IO口与单片机相连。按键的按下与否,对于内置电路来说,是联通状态的变化,这种变化以电平的方式(1或0)在单片机内进行表示按键的状态(0为低电平,按下;1为高电平;未按下)

b.按键的抖动,在程序中的不良影响与解决

我们知道:独立按键是通过按键内部的金属弹片受力弹动来实现接通和断开,所以在按下与恢复的过程中,不可避免地会产生两次振动,而在程序中,不处理这种振动,会导致程序对按键的按下的判断不够灵敏。对于振动,从硬件上解决较为麻烦,所以我们选择从软件上进行消振。

介绍代码前,我们先介绍其中需要用到延迟函数Delay:

这个函数可以在stc应用上配置,这里配置的是延迟xms的延迟函数(循环体每次执行延迟1ms,循环x次)

在上图15-17行即为消振操作:我们再按下按钮后,通过延迟20ms,使程序在第一次振动再开始进行,接着用while循环将按下状态也除去,最后再延迟20ms,去掉第二次振动。因为程序的每一步执行的时间可以忽略不计(不要求精度的操作可以忽略),所以再消振后再进行按下按键的反应操作可以视为按下即操作,达到消除振动不良影响的作用。

2、数码管:

a.数码管原理图:

可以看到:对每一个数码管,都由八个LED组成,7个构成数字,1个用来标记小数点,用字母a,b,c,d,e,f,g,dp来表示,并且八个数码管相同位置的LED都被接到同一个IO口,同时八个数码管又通过IO口与74HC138编码器相连(减少对单片机IO口的占用)。由此可见,对一个LED数码管,它的控制由LED口和八位P0控制。

b.数码管的控制

概念引入:
段选和位选:

段选的意思为对某一数码管进行选择,使得P0的控制只对该数码管生效。而位选则是P0对选中数码管LED亮灭情况的控制。

段选:

利用74HC138编码器,用三个单片机的IO口来实现段选,具体为用三位IO口可以用电平信号表示0~7八个二进制数,而LED对应的编码和由电平信号组成八个二进制数一一对应,从而实现选中。P2_4是高位,降序低位。

位选:

P0组成的八位二进制数,每一位1或者是0代表一个电平状态,一般我们对P0进行赋值,换成二进制数就是每个IO口的电平状态。LED数码管采用高电平点亮,P0_7为最高位,降序低位。(如赋值P0=0x40即是只有LEDg发亮)

静态显示与动态显示:
显示操作:

静态显示一个数码管,显然只需要进行一次位选和段选即可。那么,静态的显示多个数码管呢,显然我们需要多步控制。但明显顺序结构的代码无法满足这个需求,因为顺序结构之后保留最后一次操作的状态。那么显然的需要一个循环,使得数码管在不断地进行短时间地多次切换。对于单独的动态显示,也是很简单的,我们只需要在两次点亮直接用一个Delay函数,就能实现一定间隔的数码管数字切换。对于静态与动态并存,我们则需要/中断/的使用,在下面“定时器与中断系统——中断函数”会填坑。

重影显示:

如果我们尝试只是用一个{段选位选段选位选}的循环体,我们会发现除了需要点亮的数码管,一些不需要点亮的数码管也会保持一个较低的亮度。这是因为循环体内部也是顺序结构,导致上一次的位选可能与下一次的段选组合进行一次不合法的数码管点亮(即{段选位选段选位选})对于这种问题的解决我们称之为消影。

消影操作:

对循环体的部分进行改造,在一次段选和位选后对位选进行赋值清零操作。但是这还是不足的,因为每一步代码的操作间隔时间可忽略不计,快速的清零可能会使人眼无法捕捉到上一次位选的现象。所以在清除前,我们可以用一个Delay(1)保持位选效果后在清零

3、定时器与中断系统:

注:本模块的中断特指定时器引发的中断,即定时器中断。事实上还有其他的中断控制,在此不展开说明

a.定时器:

是单片机自带资源,基本原理是利用“脉冲”和“脉冲的累计”来实现记录一段时间。其中这里我们暂且将脉冲粗浅的理解成一个极短时间发送出的信号。脉冲的间隔时间由“晶振”和“运行模式”决定。本次介绍以12MHz的晶振频率和12T的模式来讲解,12MHz,12T意味着在1s内有12/12M即10^6个脉冲,也就是单个脉冲的间隔是1us。

下图是简化版定时器0在16位模式下的原理图:

b.定时器的相关概念:

对于一个单片机,我们首先要清楚它内置多少个定时器。对于定时器的使用,我们需要清楚:使用哪个定时器,定时器寄存器的设置。以定时器0为例:

相关寄存器:TMOD,TCON,TL0,TH0

TMOD

前四位控制定时器1,后四位控制定时器0

GATE:与电路有关,置0即可

C/T:置0定时,置1计时

M1与M0:用来选择定时器模式,以两位二进制数对应模式序号

定时器模式:

我们以作业中选用的16位模式为例:16位可以表示0~65535的二进制数,而开启定时模式后,脉冲每进行一次,则这个“16位二进制数”加1,而到65535之后,因为位数不够出现溢出,引发中断。所以16位模式意味着该定时器最大的单次定时长度是65535us。定时器选0还是1则根据需求而定。

TH0与TL0:

因为实际情况下,我们需要定以s为单位较长的时间,并且一般习惯于定规整时长。所以未来方便累积,我们希望单次定时的长度为整数。因此在我们再引入和定时器0的16位模式相配的两个寄存器:TH0与TL0。前面我们提到了16位二进制数,这16位就以两个八位寄存器TH0与TL0存储数据,而对他们的初始化也就是对16进制数的赋初值。举个例子:如果我们希望定时长度为1ms=1000us,那么我们只需要对TH0(高位部分)与TL0(低位部分)赋值65536-1000即可。即TH0=64536/256;TL0=64536%256;

TCON

控制定时器的开关,看上原理图:只需要配置TR0,TF0

定时器0的总配置:

c.定时器中断:

定时器中断:

由定时器溢出引发的中断,中断即主程序暂时停止运行,记录断点。先执行中断函数内的程序后,再回到断点继续执行主程序内容

中断系统简化原理图:

中断寄存器:

同样地,看原理图,只需要导通:ET0,EA,PT0(都是高电平导通,因为只设置一种中断,所以设置中断优先级的PT0可以不导通)

中断函数:

设置中断函数,其实相当于两套程序同时在运作,因为用Delay函数是占用单片机CPU处理时间的,会导致代码阻塞,如静态数码管显示与动态数码管显示并存,若用Delay就会延长while循环体每次执行的时间,无法使数码管保持静态显示

这里我们就可以选择用定时器中断来解决:

首先先介绍中断类型对应的中断函数序号:

可以看到定时器0的中断函数需要一个后缀interrupt 1后缀

先上模板:

我们逐句解读:变量T0Count相当于一个计数器,我们可以看到,每次进入函数后都进行了T0Count++与T0Count的大小判断,这里的1000指定时1000次就可以执行if语句,其实也就是定时1000ms等于1s后进行一次操作,这样短时的判断可以避免Delay的延时情况。而对TH0和TL0赋值是因为要保证每次定时器定的都是1ms,而if内的T0Count赋值0显然是为了可持续操作性,在T0Count=0后可以进行想要在定时1s后进行的操作。

我们以作业中U3模式--的闪烁为例:

注:Nixietube函数是已经被模式化了,功能是实现数码管显示(段选,位选),位选已经模式化,0~9为对应数字,10为-,11为U,12为清空

以上就为51单片机作品的展示和相关外设的控制方法,如有错误,还请指出!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值