预解决问题:
点亮流水灯 Led1-8,全部点亮
点亮流水灯,按 3 秒依次从低到高循环点亮
准备工作:
- 软件:ckeil5、STC-ISP(推荐:安装博客)
- 硬件:51单片机(本博客选用普中)
- 前置知识:C语言语法,16进制与二进制的关系,位运算(与[&]、或[|]、异或[^]、取反[~]、左移[<<]、右移[>>])
开始上手:
代码编写:
- 新建工程:project -> new uVision Project -> 自己命名工程名(建议全英文) -> 保存
- 新建C文件:
- 根据原理图编写代码
- 原理图(来源:B站江科大,侵权删)
- 目标:点亮流水灯 Led1-8,全部点亮
原理:引脚通电即可亮,单片机中的C代码0表示通电,1表示关闭。导入 <REGX52.H> 头文件(里面有51型号单片机的引脚地址定义等内容)。根据上面的原理图,可知 P2 代表着整个led等模块,而控制具体某个灯可用 P2_x 的形式。
#include <REGX52.H>
void main(){
P2 = 0x00; //0000 0000=》全部引脚通电(也可以一个个写)
while(1){};// 单片机会循环执行main方法,这里断开后,P2不会连续执行通电操作
}
单片机烧录:
- 生成hex文件:
2. 编译:
3. 数据线连接电脑与单片机,打开STC-ISP软件:
烧录成功后STC-ISP界面右下角会有显示。
4. 结果展示:
- 目标:点亮流水灯,按 0.5 秒依次从低到高循环点亮
步骤与上方一致,下面是相关的C语言代码,仅供参考:
#include <REGX52.H>
#include <intrins.h>//定义了包括 _nop_() 在内的函数
void DelaMs(unsigned int num) //@11.0592MHz
{
unsigned char i, j;
if(num<0){//小于0,默认1ms
num=1;
}
while(num--){
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main(){
unsigned int loop = 0xFF;
while(1){
P2 = loop; // 点亮LED
loop = loop << 1; // 左移一位,左右移位自动补零
if (loop == 0) {
loop = 0xFF; // 重新开始
}else{
DelaMs(3*1000); // 延时3s
}
}
}
上方延时函数的获取途径:STC-ISP->软件延时计算器