前言
因为刚开始学习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的话,位选锁存器在段选值赋入的时候就被更改了,这也是锁存器最大的功能——锁存。
段选锁存器
当我们找到我们点亮的位置后,我们开始点亮数码管,但是点亮数码管之前,我们应该先清楚数码管的原理和结构;
(左)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 |