• 【51单片机】6-点亮第一个LED灯


    1.单片机编程的一般步骤

    1.目标分析

    点亮开发板上的LED灯

    2.原理图【电路图】分析

    1.目标器件(LED)工作原理

    2.相关模块电路连接

    3.控制线路分析:相关IO端口是哪些?

    3.代码编写,编译

    4.下载于调试


    2.原理图与控制方法分析

    74HC573数据手册 - 百度文库 (baidu.com)

    https://datasheet.lcsc.com/lcsc/2004021807_HGSEMI-74HC245N_C507182.pdf

    1.原理图概况浏览

    (1)目的1:把我们相关部分的原理图摘录出来重点看

    (2)目的2:把相关部分的原理图的关键部分(74HC245芯片)重点看

    2.74HC573芯片介绍

    (1)要知道这个芯片怎么工作,就要看数据手册

    (2)第一步:找到他的数据手册

    (3)OE(output enable ),LE(latch enable),VCC(电压电压),GND(地线0V)

    (4)74HC573芯片是一个锁存器,简单来说就是由输入引脚Dx来控制输出引脚Qx(x等于0-7)。OE和LE影响Dx控制Qx的结果。

    (5)当OE为L(低电平),LE为L(低电平)时74HC573工作在锁存模式,此时Qx的输出被锁存(进入锁存状态之前就是高一直高,是低就一直低,这就叫锁存),这就是锁存器的作用。【输入与输出无关】

    (6)当OE为L,LE为H的时候74HC573工作在跟随模式,此时Qx的输出跟随着Dx的输入变化而且变化。此时逻辑上可以认为74HC573是透明的。

    3.硬件原理图分析结论

    (1)原理图和开发板默认跳线帽方式为:OE=L,LE=H,此时74HC573工作在跟随模式下,相当于是透明的。当我们接线(接线方式为P0端口和j12用杜邦线连接起来,当然其实也可以和p1或者其他端口连接)后,其实相当于p0端口和LED的正极直接相连,而LED的负极接地。

    (2)结论:P0端口的8个引脚输出高电平时候则LED亮,输出低电平时LED灭。

    3.第一个实验:点亮LED

    1.创建工程和文件

    2.如何用C语言进行IO端口的控制

    (1)P0 这个符号在c语言代码中的特殊含义

    (2)十六进制

    (3)位,字节,IO端口(p0-p7),IO口(其中一个口,p1)

    (4)硬件连接方式对编程的影响

    3.点亮LED

    (1)点亮8个LED:二进制:1111 1111【0xff】

    (2)点亮4个LED:二进制:0000 1111【0x0f】

    (3)隔一颗亮一颗:二进制:1010 1010【0xAA】

    1. #include //头文件包含
    2. void main(void){ //主函数
    3. //表示输出8个1,表示输出高电平
    4. //二进制应该为:1111 1111
    5. //点亮8个LED
    6. //P0=0xff;//将右边的值赋给p0
    7. //点亮4个LED
    8. //二进制为: 1111 0000
    9. //P0=0x0f;
    10. //隔一颗点亮一颗 二进制应该是:1010(A) 1010(A)
    11. //P0=0xAA;
    12. //全灭
    13. P0=0x00;
    14. }

    4.如何让LED闪烁

    1.闪烁的本质含义

    亮--延时---灭--延时

    (1)由于人眼睛有视觉暂留,所以亮和灭之间是延时时间选择非常重要。

    (2)如果延时时间太短(比如20ms),这时候上一层灭眼睛还没有反应过来就进入下一次亮,此时你会觉得灯一直亮的。和一直亮区别是亮度低一些,但是是看不到闪烁

    (3)延时时间逐渐增大慢慢就可以看到闪烁,大到一定程度就你可以看到明显的一亮一灭

    2.单片机如何实现延时

    (1)单片机执行每一条指令需要一定时间

    (2)单片机开机不能休息

    (3)单片机可以”空转“【无意义的动作】来”浪费时间“

    3.C语言实现延时

    (1)笨方法:放多条指令实现延时

    (2)正确方法:使用C语言循环语句实现延时

    1. #include
    2. void delay(void){
    3. unsigned char i=200;
    4. unsigned char j=100;//定义变量
    5. while(i--){
    6. while(j--);
    7. }
    8. }
    9. int main(){
    10. P0=0xff;//全亮
    11. //延时:调用函数
    12. delay();
    13. P0=0x0; //全灭
    14. //延?
    15. delay();
    16. }

    5.C语言的循环实现

    1.while循环

    (1)格式

    条件初始化

    while(条件){

            //代码段

            //循环体中包含条件增量

    }

    2.for循环

    (1)格式

    for(循环初始化;循环条件;循环增量){

            //循环体

    }

    6.流水灯效果实现

    1.什么是流水灯

    2.流水灯本质分析

    (1)流水灯的本质其实就是不同的亮的状态互相间隔一段时间

    (2)流水灯

    (3)延时时间越长流水灯就流的越慢,越短就流水越快

    (4)8个状态一次执行,完成后从头开始,

    3.编程实现流水灯

    1. #include
    2. void delay(void){
    3. unsigned char i,j;
    4. for(i=0;i<100;i++){
    5. for(j=0;j<100;j++);
    6. }
    7. }
    8. int main(void){
    9. //因为1为真,所以进入死循环
    10. while(1){
    11. //第一个状态
    12. P0=0x80;
    13. delay();
    14. //第2个状态
    15. P0=0x40;
    16. delay();
    17. //第3个状态
    18. P0=0x20;
    19. delay();
    20. //第4个状态
    21. P0=0x10;
    22. delay();
    23. //第5个状态
    24. P0=0x08;
    25. delay();
    26. //第6个状态
    27. P0=0x04;
    28. delay();
    29. //第7个状态
    30. P0=0x02;
    31. delay();
    32. //第8个状态
    33. P0=0x01;
    34. delay();
    35. }
    36. }

    3.上面程序缺陷

    (1)功能是实现了,如果状态变多程序会更长。

    4.改进思路

    (1)使用算术右移

    (2)首先定义变量unsigned char a ,初值等于0x80(1000 0000)

    (3)8个状态,其实就是a依次右移0-7位

    (4)我们这样相当于用c语言让单片机自己去运算得到每一个状态的端口值,不用自己事先去计算好。

    1. #include
    2. void delay(){
    3. unsigned char i,j;
    4. for( i=0;i<200;i++){
    5. for( j=0;j<200;j++);
    6. }
    7. }
    8. /*
    9. int main(){
    10. unsigned int i=0;
    11. unsigned char d=0x80;//第一个
    12. while(1){
    13. for(i=0;i<8;i++){
    14. //d:在整个操作中一直都是0x80,一直没有被改变
    15. P0=(d>>1);//将数值右移
    16. delay();
    17. }
    18. }
    19. }
    20. */
    21. /*
    22. 流水灯:从左向右
    23. int main(){
    24. unsigned int i=0;
    25. while(1){
    26. unsigned char d=0x80;//第一个
    27. for(i=0;i<8;i++){
    28. //将d保存起来,所以此时d会更新,所以d会变化
    29. d=d>>1;
    30. P0=d;
    31. delay();
    32. }
    33. }
    34. }
    35. */
    36. int main(){
    37. unsigned int i=0;
    38. while(1){
    39. unsigned int d=0x01;
    40. for(i=0;i<8;i++){
    41. d=d<<1;
    42. P0=d;
    43. delay();
    44. }
    45. }
    46. }

    5.C语言移位运算介绍

    (1)c语言中有移位运算符,>>可以右移,<<可以左移(无符号数移位:移出去的位丢掉1,空出来的位补0

    7.跑马灯

    1.什么是跑马灯

    (1)跑马灯和流水灯很像,但是不同的是:流水灯是8颗LED其中7灭1亮,亮的在移动,跑马灯是8颗LED亮7灭1,灭的在移动。

    2.实现思路

    3.实现编程

    (1)编程实现跑马灯,必须用到C语言的2种技巧:左移动(右移动),按位取反

    (2)C语言中~这个符号表示对这一个数字按位取反,比如一个数0111 1111按位取反变成1000 0000 .

    1. #include
    2. void delay(){
    3. unsigned char i,j;
    4. for(i=0;i<200;i++){
    5. for(j=0;j<300;j++);
    6. }
    7. }
    8. int main(){
    9. unsigned char i=0;//i控制循环次数
    10. while(1){
    11. unsigned char d=0x80;//端口值
    12. for(i=0;i<8;i++){
    13. P0=~d;//d按位取反后给P0端口
    14. d=d>>1;
    15. delay();
    16. }
    17. }
    18. }
  • 相关阅读:
    C盘扩容好帮手——傲梅分区助手
    Python的安装及其python程序生成exe可执行程序
    加油站[中等]
    Java开发 - 探寻Spring的秘密
    Synchronized锁
    数据清洗:数据挖掘的前期准备工作
    Python结构与列表
    Oracle(14) Managing Password Security and Resources
    Jmeter系列-阶梯加压线程组Stepping Thread Group详解(6)
    多媒体应用设计师 第1章 多媒体基础基础
  • 原文地址:https://blog.csdn.net/m0_63077733/article/details/133159083