学习单片机开发——浅尝点灯的快乐

这篇博客是作者学习51单片机的初步体验,从理解基本的点灯原理到使用清翔单片机进行实践。作者通过查看电路原理图,学习如何点亮和控制LED灯,进而探索了如何使用74HC573锁存器进行位选和段选操作以点亮数码管。此外,还介绍了如何通过独立按键和矩阵按键实现交互,强调了按键抖动问题的解决方法。整个过程旨在帮助初学者掌握单片机的基本操作。
摘要由CSDN通过智能技术生成

前言

因为刚开始学习51单片机,经过同学的推荐,我选了是清翔的单片机,芯片是STC89C52RC;

清翔的视频链接如下

https://www.bilibili.com/video/BV1nt411f7To?p=35&spm_id_from=pageDriver&vd_source=352cf5eb0220bc4e9ed73c26dc3d8be1

单片机的重点就是**“点灯”**,其实就是高低电平通过我们的程序(多用C语言)发生变化,拉高/拉低(1/0)。

开始点灯

基本点灯情况

点灯,我得理解就是在电路中通过芯片改变电路元件两端的电平拉高或者是拉低(1/0),是电路产生电压差,是电路导通(一般情况,外设元件有一段连接单片机芯片,另一端的连接情况要查看电路原理图)

原理图的查看

原理图,顾名思义就是表示电路板上各器件之间连接原理的图表。学习单片机和学硬件电路设计都是要通过分析电路原理图,了解各种电子器件的功能和工作原理,才能得心应手开展工作的。

查看原理图最主要的是看懂网络标号

在这里插入图片描述

网络标号的优点就是可以减少复杂的线路分布,可以更加直观的分析原理图,并且我觉得这样更加有利于C语言模块化开发

正常点灯

学习单片机点灯,最开始的就是点亮第一个LED灯,十分简单,(我用的是清翔的原理图),参考原理图

在这里插入图片描述

因为LED灯是连接的是VCC,需要一个低电平(把P1^0 拉低),才能将电路导通。因此

sbit LED1 = P1^0;
void main()	//主函数
{
   
	LED1 = 0;//点亮P1.0上的LED		
}

当然点灯方法不止一种

sbit LED1 = P1^0;
void main()	//主函数
{
   
	LED1 = ~LED1;;//点亮P1.0上的LED		
}

点亮LED灯后,我们可以尝试让LED闪烁。

sbit LED1 = P1^0;
void delay(int n)//延时函数
{
   
	unsigned int x,y;
	for(x = n;x >= 0;x--)
		for(y = 114;y >= 0; y--);
}
void main()	//主函数
{
   
	LED1 = 0;//点亮P1.0上的LED
	delay(50);//软件延时		
	LED1 = 1;//熄灭P1^0上的LED  
)

清翔的单片机上有8个LED灯,我们可以通过运用高低电平尝试流水灯的设计了。

#include<reg52.h>
#include<intrins.h>
void delay(uint z)
{
   
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 	//晶振11.0592us
} 

void main ()
{
   
    LED = 0xFE;//1111 1110  初值LED1亮
    P1 = LED;
	delay(100);//毫秒级延时 100毫秒
    while(1)
    {
   
      LED = _crol_(LED,1);//循环左移,需要预定义intrins
      P1 = LED;//移位完成后赋值给P1 每个一个灯点亮
      delay(100);//毫秒级延时 100毫秒
    }
}

至此最基本的的点灯就是这样,其中注意P1口,因为单片机上用了8个LED灯,8个LED灯分别连接在89c52芯片中P1口的P10~P17;所以我们可以直接通过8位2进制(或者0x_2位16进制)同时让LED灯直接点亮,这既是并行传输

明白了并行传输我们就可以搞一搞花式点灯——点亮数码管

花式点灯

点亮数码管之前,我们需要了解一下数码管锁存器74HC573(我用的是清翔单片机外设锁存器)。在这里插入图片描述

  • OE: Output Enable 输出使能端
  • LE: Latch Enable 锁存器使能端
  • D 0 ~ D 7:数据的输入引脚
  • Q 0~Q 7:数据的输出引脚
  • GND:地线接地端
  • VCC:供电电压
位选锁存器

位选,顾名思义,就是多位数码管的位置选择;通信方式是并行通信,并行通信就是8位一次性传输。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-itUikTcs-1655610173187)(C:/Users/ali126174/AppData/Roaming/Typora/typora-user-images/image-20220617173704194.png)]

而锁存器就是通过一个“开关”,将我们需要的数据传输给数码管,让数码管选择好他应该点亮的位置;这个“开关”就是LE锁存器使能端,在位选中就是P2^7/WELA

sbit WE = P2^7;
void main()
{
   
    WE = 1;	 //打开U8锁存端
    P0 = 0xF4;	 //送入位选信号 0xfe为16进制表示方法,转换					为二进制为1111 0100
   WE = 0;	 //关闭U8锁存端
}

注意:WE位选锁存器打开后,一定要锁存就是给WE赋0,因为如果不锁存WE的话,位选锁存器在段选值赋入的时候就被更改了,这也是锁存器最大的功能——锁存。

段选锁存器

当我们找到我们点亮的位置后,我们开始点亮数码管,但是点亮数码管之前,我们应该先清楚数码管的原理和结构;

img

(左)8段数码管排布图 (右)数码管原理图

我们通过排布图可以看出有七个段和一个点,分别对应的8位2进制(2进制很重要!!),所以我只需要从A到G,dp,从低到高的点灯就可以了。点灯,我们就需要判断怎样让电路导通,

由此我们从原理图中可以看到有两种数码管,分别是共阴极数码管共阳极数码管。共阴极就是把八条二极管线路的阴极共同接地,共阳极就是把八条二极管线路的阳极共同接VCC,所以共阴极拉高(赋1)导通,共阳极拉低(赋0)导通,STC89C52开发板是共阴极的,所以

下面为共阴极数码码表:

16进制表示 显示的数字
0x3F 0
0x06 1
0x5b 2
0x4f 3
0x66 4
0x6d 5
0x7d 6
0x07 7
0x7f 8
0x6f 9
16进制表示 显示的数字
0x77 A
0x7c b
0x39 C
0x5e d
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值