C51-入门第一个点灯程序
1 项目需求
基于STC89C52单片机,使用多种方式点亮一个led灯,以led0为例。
2 工程创建
步骤1:新建一个工程,包括新建工程目录和工程文件名。
步骤2:选择开发所用芯片。没有 STC89C52,选择AT89C51或者AT89C52都可以,不影响开发。
步骤3:如果出现如下提示框,选择否即可,暂时不需要加载该文件。
步骤4:按下图所示更改输出的目标文件名,即.hex
文件的名字;修改源码组,一般用src来存放*.c
文件。后续用到多模块了,会为每一个模块添加一个组,然后每个模块组中添加一个文件夹src放*.c
文件,添加一个文件夹include放*.h
文件。
步骤5:设置好芯片时钟频率(和所选的芯片设备一致);打开输出文件.hex
。
到此,工程就算是创建完成了。
3 LED硬件原理图分析
开发板的LED0(即发光二极管D1)的负极连接在与单片机的P1.0口;正极通过串联电阻与VCC相连接;所以,当单片机的P1.0口输出低电平时,二极管D1就会导通,点亮LED0,当P1.0口输出高电平,LED0熄灭。
查看芯片手册,获得信息,单片机P1寄存器的地址为0x90H;默认值8个bit均为1,灯不亮。
4 项目实施
步骤1:按照下图所示像src组中添加main.c
文件,用于代码编写。
4.1 代码编写
推荐方式2写法,或者方式1写法;方式3是51单片机特有的按位寻址赋值方式。
/************************************
功能:多种方法实现点亮LED0灯
作者:eCoderY 时间:2024.01.14
************************************/
#define SWITCH_CODER (2) /* 控制点亮LED0的方法 */
/*
* 如果包含了头文件reg52.h;这一段就可以省略了;
* 因为reg52.h中定义了P1寄存器
*/
sfr P1 = 0x90; /* 定义P1寄存器的地址为0x90H */
#if(SWITCH_CODER == 3)
sbit LED0 = P1^0; /*将P1的bit0定义为LED0 */
#endif
void main(void)
{
while(1)
{
/* 方式1、直接操作寄存器 */
#if(SWITCH_CODER == 1)
P1 = 0xfe;
#endif
/* 方式2、通过&=~操作对寄存器的某位置0 */
#if(SWITCH_CODER == 2)
P1 &= ~(1 << 0); /* 通过位操作对寄存器P1的bit0写0 */
#endif
/* 方式3、C51还可以直接操作P1.0 */
#if(SWITCH_CODER == 3)
LED0 = 0; /* 直接对P1的bit0写0 */
#endif
}
}
4.2 编译代码
4.3 烧录代码
打开代码ISP烧录软件,按照如下图所示步骤烧录.hex
文件到单片机中;注意,通常点击下载后需要重启一下单片机。
4.4 实验现象
通过更改SWITCH_CODER
的值分别为1、2、3,选择3种方式,然后编译烧录,均能达到如下所示效果,点亮LED0。
5 问题
存在一个问题,为什么按照stm32的方式,以*((TYPE *)0X90) = 0Xfe;
的方式来点亮LED0灯呢?
欢迎各位大佬讨论… …