一般路过棕背伯劳

一般路过棕背伯劳

【51单片机】学习笔记4·建立工程点亮第一颗LED

2023-12-25

点亮LED的原理:输出电压=VCC就是高电平,输出电压=GND(一般是0V)就是低电平,分别用1和0来表示,这个是理想值。GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来读取其输入电平,或者控制他输出高低电平。

如何点亮LED4?

  • P4.0输出低电平

  • P6.0输出低电平

具体工程

  • 打开keli,选择project新建,桌面新建文件夹保存工程。

  • 选择stc mcu,选择stc32g12k128,关闭提示窗。

  • 新建里面插入源代码。选择file→save,保存文件名.c(.c建议小写)

  • 右键,add existing…,可以看到代码在目录里面。

代码部分

根据文档写出了第一段代码,但是发现无法点亮

//这一段代码无法点亮
sfr P0 = 0x80;
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
void main()
{
        P0M0=0X00;
        P0M1=0X00;
        while(1)
        {
                P0++;
        }
}  

修改代码:

sfr P0 = 0x80;//目标:改成P4
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;//P0端口操作完成

//选择寄存器
sfr P4 = 0XC0;//P4端口操作完成
sfr P4M1 = 0XB3;
sfr P4M0 = 0XB4;

sfr P6 = 0XE8;//P6端口操作完成
sfr P6M1 = 0XCB;//这里教程一开始打错了(打成了C8
sfr P6M0 = 0XCC;

sbit P40 = P4^0; //三极管控制引脚
sbit P60 = P6^0;//led控制引脚

void main()
{
        P0M0=0X00;
        P0M1=0X00;//配置P0为准双向口
        P4M0=0X00;
        P4M1=0X00;//配置P4为准双向口
        P6M0=0X00;
        P6M1=0X00;//配置P6为准双向口

        while(1)      //死循环
       {
                //P0++;
                P40 = 0;//三极管基极引脚输出低电平 
                P60 = 0;//LED4引脚输出低电平
       }
}

成功点亮!

案例思考

  • 思考LED为什么不会亮?

    • 引脚不对。

  • 怎么控制单独的一个引脚?

    • sbit P00 = P0^0; //选择P0.0引脚

  • 怎么控制这个引脚输出电平?

    • P00 = 0; //输出低电平

    • P00 = 1; //输出高电平

  • 书写规范:一行一句,大括号缩进(需要设置),缩进四格,注释完整

  • 注释符号 // 单行注释

    • /* */ 多行注释

  • 学会搜索: CTRL+F

  • #include定义在文件夹里写法:

    • #include"COMM/stc.h"

    • #include"COMM/usb.h"

  • 抄代码注意大小写中英文符号!!!

  • 总结内容:

    • 了解新工程的一个基本流程

    • 了解IO口的高低电平的含义

    • 务必牢记端口的几个寄存器 PxM0,PxM1,Px

    • 务必牢记 sbit 的 作用,牢记#include的作用

    • 了解USB_CDC不停电下载的用

    • USB_HID不停电下载

硬件分析点亮的原理

首先分析电路:

SYS-VCC代表着是电源的正极,下方是一个PNP三极管

在这个电路中,要想LED点亮,就需要三极管导通、P6.X低电平。

PNP三极管的基极连接在P4.0上,因此,当P4.0低电平时,电路导通

所以实验箱点亮LED,需要P40和P60低电平。

不断电刷固件的方法(STC32实验箱)

首先是头文件之类的

#include "stc.h"
#include "usb.h"

void sys_init();

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;

char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令

主函数

void main()
{
    sys_init();
    usb_init();
    EA = 1;
    while(1){}
}

sys_init函数

void sys_init()
{
    P3M0 = 0x00;
    P3M1 = 0x00;

    WTST = 0x00;
    EAXFR = 1;
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    IRC48MCR = 0x80;
    while (!(IRC48MCR & 0x01));
}

然后修改一下STC-ISP设置,就可以快乐的不断电下载了!