持续更新,所使用的51板子如图。
大家也可以参考[1-1] 课程简介_哔哩哔哩_bilibili
1.1点亮一个LED
(1)首先在D盘中创建一个新的文件夹,之后要将我们的工程放入其中
(2)创建工程,选择第一个,然后找到我们创建的文件夹,命名为project,我已经创建过了
(3)输入AT89C52,因为没有STC89C52,选择AT89C52即可,然后点击ok即可
(4)点击否
(5)右键选择第二个,选择我们的.c文件
(6)开始编写代码,结合原理图,具体代码的解释如图
#include <REG51.H>
void main()
{
P2=0xFE;//高位到低位D7-D0,P2口为低电平才能点亮LED
//因此为 1111 1110,
//同时转换为十六进制为FE,0x表示为十六进制
}
(7)点击第一个,将我们的hex文件勾选上,即创建hex file
(8)点击第二个编译,看有没有错误
(9)打开烧录软件stc,将单片机通过usb1接口插入电脑中,一般软件会自动识别单片机型号与串口号,如果没有,手动选择,或者看看有没有插好。
(10)点击打开程序文件,找到hex文件,点击打开,点击下载与编程
(11)此时打开单片机的开关,即蓝色的小开关,若本来单片机就开着的,那就重新打开一次,显示操作成功即可
(12)此时单片机的D1会亮起
1.2LED闪烁
我们的思路就是让一个灯亮,然后延时,然后在灭,不断循环
我们的延时函数如何得到,打开stc,找到软件延时计算器,选择我们的频率,频率在我们单片机的晶振上标着,选择我们要的定时时长,1s=1000ms=1000000us,指令集选择STC-Y1,因为它包含我们的型号。具体如下图:
点击生成我们的c代码,将其复制到我们的代码当中
#include <REG51.H>
#include <INTRINS.H>//包含nop
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();//空语句
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;//1111 1110,D1亮
Delay500ms();//延时
P2=0xFF;//1111 1111,D1灭
Delay500ms();//延时
}
}
再将其烧录到单片机中,会发现D1会亮灭,0.5S间隔
led
1.3LED流水灯
第一种 延时固定
简单的想法就是1111 1110然后延时,然后1111 1101,延时,如此循环往复
第二种 可以修改延时时间
我们将1ms的延时程序进行修改
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
修改之后的代码
void Delay(unsigned int xms) //@11.0592MHz
{
while(xms)
{
unsigned char i, j;
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
完整代码如下
#include <REG51.H>
void Delay(unsigned int xms) //@11.0592MHz
{
while(xms)
{
unsigned char i, j;
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
P2=0xFE;//1111 1110
Delay(1000);
P2=0xFD;//1111 1101
Delay(1000);
P2=0xFB;//1111 1011
Delay(1000);
P2=0xF7;//1111 0111
Delay(1000);
P2=0xEF;//1110 1111
Delay(1000);
P2=0xDF;//1101 1111
Delay(1000);
P2=0xBF;//1011 1111
Delay(1000);
P2=0x7F;//0111 1111
Delay(1000);
}
}
此时可以通过修改函数中xms的值来进行对应的延时,unsigned int表示无符号的整数,即不为负数。
效果如下:
led流水灯