51入门系列教程| 第一次控制–点灯

阿里云教程3个月前发布
24 0 0

前面两贴,都只是在纸上谈兵,今天直接切入正题

最小系统

什么是最小系统?

实则就是指单片机和使它正常工作所需要的最基本外围器件所构成的电路

直接用楼主手上的最小系统来分析一下,对比封装管脚来看

51入门系列教程| 第一次控制--点灯

51入门系列教程| 第一次控制--点灯

仔细看了看(PCB背面无任何器件)

手绘了一下大致的电路图(目前是严肃的学术讨论,表笑!!!!)

51入门系列教程| 第一次控制--点灯

仔细看了看(PCB背面无任何器件)

手绘了一下大致的电路图(目前是严肃的学一个基本的最小系统就是这样了

最小系统虽然简单,但是却超级考验基本功

一个个电路来看吧

先看第9脚(RST脚)的电解电容和10k电阻

这是一个上电复位电路

看上去稀松平常

实则电容和电阻的取值超级考究

RC所构成的电路有延时作用,或者说充放电作用

有些单片机对上电时复位管脚电平的保持时间会有严格的要求

所以,RC的取值,直接影响到单片机是否能够正常复位

不能正常复位,跑固件也就无从说起

楼主曾经在430单片机上被坑过,只怪没有好好读器件的数据手册

再看看18、19、20三个脚

是一个晶振电路,由12M晶振和2个30p电容所构成

用来产生单片机工作所需要的物理外部时钟

大家搜搜单片机的最小系统

会发现,即使使用一样频率的晶振器件

有些最小系统采用的电容值都不一样

这是为什么呢?(回帖解答,有机会获奖哟)

提示一下,和晶振有关。

当然,有些单片机片内就有振荡电路

可自行产生单片机运行所需要的时钟

还有一个电源指示电路

发光二极管+2K电阻限流,正常上电点亮

实则楼主这个最小系统,有个超级大的问题

不知道大家看出来没有?

提示一下,第31管脚

它是用来干嘛的?应该怎么接?(回帖解答,有机会获奖哟)

HEX文件的下载

准备好USB2Uart串口硬件和单片机的最小系统

将串口的TX与31管脚相连,RX与30管脚相连

记得两块板的GND要连起来哟

然后下载STC-ISP软件:讨论,表笑!!!!)

51入门系列教程| 第一次控制--点灯

1、选择对应的单片机,这里是STC8C52RC

2、选好USB2Uart对应的串口号

3、点击检测MCU

折腾完后,给单片机冷启动,也就是掉电再上电

这个时候:

51入门系列教程| 第一次控制--点灯

Oye,单片机被发现了

和电脑已经能够正常通信

如果需要下载HEX

51入门系列教程| 第一次控制--点灯

1、选择对应的单片机,这里是STC8C52RC

2、选好USB2Uart对应的串口号

3、选择上贴中生成的hex文件

4、下载,go…..

51入门系列教程| 第一次控制--点灯

Yes,Hex文件烧写进去了

到这里,我们应该有这样一个基本的轮廓:

编写代码—-生成Hex—-通过硬件工具烧写下载—单片机运行程序

没错,就是这么简单。

IO口的控制

单片机为什么能够实现那么多功能

不得不提提IO口

IO口是啥?也就是InputOutput端口

这个端口

小了来讲,指单片机完成某一特定功能的一个管脚,像P11,P21,AD口等等,它单独一个完成输入或者输出的功能,可能两者皆有。

大了来讲,指单片机完成某一特定接口的一系列管脚,像SPI接口的MOSI、MISO、SCK,像UART接口的RX、TX、CTS、RTS等等。

IO口的操作,对于单片机来讲,是最最基础也是最最重大的基本功

无论多么流弊的高手,拿到一块全新的单片机

都会从操作IO口开始来熟悉这块单片机

一来可以了解单片机的基本寄存器结构

二来,别忘记了,无论多牛逼的功能,多高深的算法

最终都回归体目前对IO口翻转操作上

So,Let’s go……

看看代码先

#include <reg51.h>

sbit P10 = P1^0; //这个是51比较方便的地方,能够直接位操作

int main()

{

P10 = 0; //直接将输出端口P1.0赋值为0

return 0;

}

上面的代码能产生什么样的效果

试试编译下载运行一下看:

51入门系列教程| 第一次控制--点灯

没错,输出为0电平

这是按单个端口在操作,如果需要直接操作整个port口呢?

如下:

#include <reg51.h>

int main()

{

P1=0xfe; //注意等式左边不再是P10而是P1了,严谨的写法应该是P1 &= 0xfe;

return 0;

}

51内核的单片机,总共有4个IO Port,分别称为P0、P1、P2、P3

(注:在数字的世界里面,第一位不再是用第1位表明了,而是第0位,这个要习惯哟)

值得引起注意的是,P0口是开漏输出,直接赋值是不会影响端口电平的

简单点理解就是悬空管脚,一般情况下会加上拉到电源的电阻

每个Port又单独包含8个IO管脚,Px.0到Px.7

譬如

P0.0,就是指第0个Port的第0个管脚

P2.3,就是指第2个Port的第3个管脚

51单片机是个8位单片机,我们所能操作的寄存器便是8位的

所以,0xfe用二进制表明就是1111 1110

从右往左,依次代表第7位到第0位

如果需要将P1口的第0个管脚输出0(低电平)

只需要将P1口的最低位赋值为0就好了

实则

最严谨的赋值语句应该是P1 &= 0xfe;

按位相与,P1口的其他管脚赋值不变,仅将第0个管脚赋值为0(输出0电平)

而P1 = 0xfe;

则是将第0个管脚赋值为0(输出0电平),其它管脚赋值为1(输出1电平)

再来试试输出1电平

上按位操作代码

#include <reg51.h>

sbit P10 = P1^0;

int main()

{

P10 = 1; //直接将输出端口P1.0赋值为1

return 0;

}

编译下载运行:

51入门系列教程| 第一次控制--点灯

输出4.93V电压

基本接近电源电压,也就是常说的逻辑“1”,高电平。

如果,要直接操作寄存器呢?(回帖解答,有机会获奖哟)

Ok,到这里,基本上IO口的操作就告一段落了

点灯

IO口会操作了

真正用来驱动外设才算入门呢

设计一个发光二极管LED电路吧

点亮这个LED,俗称点灯

设计一个电路:

51入门系列教程| 第一次控制--点灯

简单分析一下

一只普通的发光二极管的压降一般是2v左右

也就是说,阳极电位比阴极电位高出2v,才能够正常发光

如果P10为高电平,LED两端实则是没有压降,或者压降很小

不足以点亮LED

如果P10为低电平,但是能否发光,需要看电阻的阻值

如果过大,LED两端获得的分压很小,难以完全导通

如果过小,电路中电流就会比较大,轻则烧毁LED,重则单片机阵亡

(单片机每个管脚或者Port都是有拉灌电流极限的,不能够无限制输入或者输出电流)

没记错的话,51的每个Port电流大致是几十个mA,每个管脚估计也就几mA吧

如果合适,LED两端便有了足够的压降使其导通,并产生一个大家都能接受的电流

光说不练假把式

把P10口赋值为0,编译下载运行

51入门系列教程| 第一次控制--点灯

Oh Yes,银荡的小绿灯风骚地亮起

对了,我们这里是低电平点亮,如果要高电平点亮呢?(回帖解答,有机会获奖哟)

点灯完毕

进阶

光是点亮而已

来点动的吧

#include <reg51.h>

sbit P10 = P1^0;

void delay()//延时函数

{

unsigned int i;

for(i=0;i<25535;i++){;}

}

int main()

{

while(1)//延时一段时间后,P1.0端口取反,得到闪烁的效果

{

P10 = ~P10;

delay();

}

return 0;

}

看聊效

51入门系列教程| 第一次控制--点灯

这里的闪烁LED主要是2个方面需要注意

一是取反,使P1.0口交替输出高低电平

达到LED交替亮灭的现象

二是延时,人肉眼辨认闪烁的频率

延时小了,肉眼观察不到闪烁

延时大了,闪烁的速度会比较慢

准确的软件延时,还是用示波器去观察IO口翻转的办法比较靠谱

不过话说回来,想用单片机去实现一个准确的延时

这个想法本身就是不靠谱的

定时器?

算了吧,本身就是模糊值

加上中断服务程序消耗的机器周期

想准确,还差得很远

呃,这次先到这。。。。。。。

如有疑问,可把问题发送给“云汉电子社区”微信公众号平台,我们会及时回复,关注公众号可阅读更多51系列教程!我们欢迎您的沟通!

© 版权声明

相关文章

暂无评论

none
暂无评论...