20180903 实验1 单片机资源的使用

本文介绍51单片机的基本概念和发展历程,并通过实际案例讲解如何使用C语言控制单片机,包括点亮LED小灯、实现PWM脉冲宽度调制及利用定时器和串口等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本实验主要内容有:①……,②该单片机所有的资源,③如何用C语言编程控制该单片机。

如果想详细了解单片机的发展历史,请上网搜索。特别地,如果有同学有幸运地选上了光电学院老张老师的课,你们将对单片机有更加丰富的了解。

51单片机,来源于Intel公司于1981年推出的8051芯片。之后,Intel公司将51内核授权给了其他的公司。后来,很多公司就基于该内核开发出了具有更多功能、更低功耗的芯片,延续至今。

过去,51单片机甚至可以参与计算。现在,单片机的主要功能仅仅为采集数据、初步处理、上传数据和控制输出。时下,不可能让如此之慢的芯片,参与到高速运算与高速数据传输当中了。

笔者对单片机的理解,单片机外部有个晶振,负责持续产生一高一低的方形电压波形,称之为方波。这个过程,类似于打节拍。这个节拍,称之为工作频率,传递给了单片机,单片机才能正常工作,执行指令。有些指令,只要一个节拍;有些指令,需要多个节拍。这些指令分类如下:

  1. 数据传送指令,让寄存器、内存、立即数中的数据,传送来,传送去,相互传送,相互转换;
  2. 计算指令,使寄存器、内存、立即数中的数据,进行加减乘除或逻辑运算;
  3. 转移指令,当满足条件,或不满足条件,或无条件之时,跳转到别的地方去执行。

寄存器,是一种临时存储小量数据的地方,离单片机的核心最近,单片机调用寄存器是最快的;内存,是存储较大量数据的地方,相比于调用寄存器,单片机修改内存中的数据较慢;立即数,是指令中直接包含的数字,只能读取,不能修改。

另外,单片机的各种功能,都会映射到内存的特定位置,修改内存中这些特定位置的值,可以达到使用单片机某些功能的效果。这些特殊的内存位置,称之为SFR特殊功能寄存器。

图是传统8051单片机的引脚图,借古观今,现在我们使用的单片机兼容了曾经的设计,增加功能,速度更快。由图可知,这些引脚分为了很多组,有P0、P1、P2、P3和其他。其中,P开头这些引脚,可以直接由程序控制它们的输出或者读取它们的输入,有些引脚标注上还带有括号,表明它们具有第二功能。

l0.4

P0组的字母AD,分别表示Address地址和Data数据。P2组的字母A表示Address。P0和P2这两组,与P36、P37的读/写使能信号,以及31号引脚的地址有效信号,这些信号可以使得单片机读取"外部"RAM存储器里的数据。其中,P0这种同时表示两种功能的设计,是为了节省引脚,称之为引脚的复用。

P1组引脚上没有标记它们具有第二功能,但这些引脚默认为输入模式,可以通过修改SFR配置为正常的IO口。

P3组引脚每一个都具有特殊功能。

P30和P31的第二功能为一组,它们是当时一种叫做UART的通讯方式必需的引脚。TXD表示TransmitData,发送,RXD表示ReceiveData,接收。这俩引脚可以通过电平转换芯片接到串口上,以便单片机和计算机通讯,或者接到其他的单片机上,让它俩来通讯。现在的计算机上通常没有直接的串口,需要通过串口转USB芯片,模拟出一个串口来。

P32和P33的第二功能一样,INT表示Interrupt,中断。当这些引脚上的信号满足预设的变化时,例如产生上升沿或下降沿,将中断单片机正在干的活,并调用处理中断的程序,中断处理完成以后,再返回并继续运行刚才干的活。

P34和P35的第二功能一样,T表示Timer,定时器。单片机中,定时器和计数器采用同样的结构,只是信号来源不同。定时器来源于内部的工作频率,计数器来源于外部的信号,P34和P35端口。当这俩端口每接收到一个上升沿,内部计数变量就+1/-1,直到满足预设的条件,就告诉单片机,又要中断来干特定的活了。

其他的端口:VCC、GND是电源;XTAL是晶振。传统的51单片机的外部引脚图就解释到这了,我们这个实验中使用的单片机比传统的多了很多功能,具体情况详见芯片手册和图。

STC15宣传图片

STC15系列的单片机,也采用了51内核,也具有并行端口PX,串口,外部中断,计数器,还具有存储数据用的E2PROM,PWM输出等等。

话不多说,作为单片机的学习者,也作为未来的电子工程师们,让我们来结合原理图、芯片手册等必备资料,创建一个新的工程吧!

控制LED小灯亮灭

在计算机上的C语言学习中,打印出"Hello World!"标志着初窥C的门槛。而在单片机的学习中,点亮小灯的地位相当于打印"Hello World!"。

在实验0中,为什么"P35=0;"这行代码可以使得小灯亮起来,原理请看图。

l0.4

图中,m1接高电平,P35接单片机P35接口。LED小灯的两端,需要有一个电压差才能亮起来。故,当P35为低电平时,两端存在电压差,LED导通,发光。因此,这里用C语言代码可以使得小灯亮灭:"P35=0;"小灯亮,"P35=1;"小灯灭。

控制LED小灯闪烁亮暗

既然,小灯亮灭的关键因素已了熟于心,接下来,我们要让这个小灯作出一些动态效果。比如,0.5秒切换一下,形成一种闪烁的效果,或者能够调节亮暗。代码如下:

代码的关键,在于那个看起来"无意义"的循环。单片机有自己的工作频率,如果让它做循环,就相当于消耗时间。而这个循环次数的计算方式,需要根据工作频率慢慢地调整,也可使用Keil的仿真功能,估算大致时间。

人眼能察觉到的,发生变化的时间,大约是1/60s,凑个整算1/100s吧(这里对时序要求不严格)。如果能在人眼察觉不到的情况下,让小灯"闪烁",那么灯的亮度看起来就会减弱。目前,这种常用的调节LED小灯的方式,称之为PWM脉冲宽度调制。它的原理是,在周期不变的情况下调节高电平占整个周期时常的百分比(占空比),示意图如图所示。请同学们尝试编写相关代码。(由于P35端口第二功能只有时钟输出功能,没有直接的PWM输出功能,可用时钟输出功能稍加设置输出PWM波形,具体请看芯片手册第2章、第7章)

占空比示意图

定时器控制LED小灯

上述控制小灯闪烁亮暗的方式,存在一个巨大的弊端:单片机核心完完全全地把时间花费在循环上了,单片机在空转的时候没有办法做别的事情。因而,我们需要另辟蹊径。单片机上具有一种定时器/计数器的功能,首先将计数变量预设为一个值,输入的信号每来一个上升沿,内部的计数变量就-1,直到计数变量为0,就触发一段特定的程序,这个功能正好为我们所用(详情参见芯片手册第7章)。

若要使用定时器功能,需了解如下几个SFR或其中特殊的位:定时器/计数器控制寄存器TCON、定时器/计数器模式寄存器TMOD、定时器/计数器计数寄存器TH/L*、定时器/计数器中断控制位ET*、总中断控制位EA。代码如下:

按钮切换LED小灯亮灭

接下来,我们来通过外部输入,比如按钮按下,来切换小灯的亮灭。

r0.35

开发板上有两个按钮,一个在屏幕下方,一个在侧面,原理图如图所示。当按钮按下时,按钮导通,P33或P14被拉低至低电平。这里,P14端口具有外部中断功能,我们通过设定一些SFR,使得按下按钮,小灯切换亮灭状态。

代码如下:

串口控制LED小灯

串口是一种常见的通讯端口,原理图如图所示。单片机串口与CH340T芯片连接,CH340T芯片和USB的差分信号线D+D-相连。现在的家用计算机上大多没有直接的串口了,只有常见的USB接口。这里,CH340T芯片的功能,则是将串口通讯的UART协议、单片机的TTL电平转换为USB协议、电平,使得PC机(上位机)可以和单片机通讯。

UART原理图

有了这种芯片,单片机开发串口程序不需要理会USB协议,上位机上开发程序也不需要理会USB协议,它就像一个中间人,搭建了一个虚拟的管道,可以通过这个管道收发所需要的信息。

串口通讯,结构图如图所示。详情查阅芯片开发手册第8章。

单片机UART结构示意图

图中,左上角部分接单片机的定时器,定时器产生串口所需的波特率。右上角为发送部分,向SBUF寄存器中写入数据即可发送,并将TI置1,产生中断;右下角为接收部分,当中断产生,RI置1时,即可向SBUF寄存器读取数据,得到接收的数据。

示例代码如下:

下载软件带有串口调试助手,使用方法如图所示。

串口助手使用方法

注:这里采用的方法非常简陋,不能做到接收字符串。这里,学会如何使用串口,单独地发送数据或者接收数据就可以了。改进方法:当接收到不为0的数据时,先保存下来,直到接收到0为止;当接收完整个字符串后,首先关闭中断,然后作出回应,最后开启中断,等待下一个字符串。

附注

在嵌入式开发(单片机开发等)中,本文这种看着原理图构造代码的思路是有问题的。实际上,需求与设计要相结合,分析芯片具有什么功能,分配引脚。而我们实验中用的别的商家提供的开发板,并不是我们自己设计的开发板,所以得就着开发板原理图来写代码。

转载于:https://www.cnblogs.com/AmnesiaBeing/p/9579090.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值