说明
本人使用的是清翔的51单片机开发板,如果型号相同最方便,但是如果型号不同也可以参考,因为芯片都是一样的,只是外设不同而已,使用时只需要对照自己的开发板原理图稍微修改下引脚即可。
本次笔记对应清翔视频教程的第12集 LED闪烁(理论+编程)
一、循环语句
while循环和for循环,多数情况下,while循环在不知道循环次数时使用,for在知道循环次数已知的情况下使用
(1)while循环
while (条件表达式) {语句}
只有当括号内的条件表达式危2真,才会重复执行{}内的语句
(2)for 循环
for([初值设定表达式]; [循环条件表达式]; [更新表达式]) {语句}
只有中间的“循环条件表达式”为真,for循环才会继续下去,每运行完一次“语句”,就会执行一次更新表达式,再去判断“循环条件表达式”是否为真
例如
unsigned char i;
for (i = 0; i <= 100; i++)
{
//放要循环的语句
}
二、变量
2.1 变量的定义
变量是在程序执行过程中其值能不断变化的量。在使用一个变量之前必须进行定义,用一个标识符作为变量名,并指出它的数据类型。C语言中每条语句必须用分号结束,并且是英文分号。
格式:数据类型 变量名 ;
例如
unsigned char a; //char类型占1个字节,最大值b1111 1111,也就是255
unsigned char b;
a = 5; //给变量a赋初值5
b = 2; //给变量b赋初值2
b = 5 + a; //b最终为 5 + 5 = 10
2.2 变量的作用域
全局变量:在函数体外定义的变量通常为全局变量,作用范围:从定义开始的整个程序
局部变量:在函数体内定义的变量通常为局部变量,作用范围:函数体内
三、软件延时
常用的延时方法:
软件延时 | 定时器延时 | |
优点 | 使用方便 | 不浪费CPU资源,在延时期间可以进行其他操作 |
缺点 | 浪费CPU资源,实际上是让CPU一直去加减运算 | 需要操作内部寄存器,对初学者来说比较麻烦 |
四、编写点亮和熄灭全部LED的程序
4.1 创建工程
复制一份工程模板并改名为"2.LED闪烁"
工程模板的创建详见清翔零基础教你学51单片机_个人学习笔记(1)_点亮开发板上的LED灯http://t.csdn.cn/JgxjD3.1 工程的创建
4.2 原理图分析
根据原理图,如果我想让所有LED都点亮,只需要设置P1的所有8个引脚都为低电平,在程序中可以直接写
P1 = 0;
来让整个端口8个引脚都为0,这个0其实是十进制的0,也就是十六进制的0x00,二进制的b00000000,这样就让8个引脚全为0。如果想点亮LED1和LED2,也就是把P1端口的8个引脚中P1^0和P1^1置为0,其余置为1,可以这样写
//方案1
P1 = 0x03 //16进制数 也就是二进制的b0000 0011
//方案2
P1 = 3; //注意这个3表示十进制3,等同于二进制b0000 0011
//方案3
LED1 = 0;
LED2 = 0;
LED3 = 1;
...
LED8 = 1;
如果想点亮其他位置的LED,可以先写出对应的二进制,再把二进制转换成十六机制或十进制即可,一般用十六进制,因为十六进制与二进制之间的对应关系更简单
注意:二进从低位到高位对应LED1~LED8,不要把高低位对应搞反了
4.3 代码
4.3.1 点亮全部LED
#include <reg52.h>
void main()
{
P1 = 0;
}
4.3.2 编译下载程序
打开stc-isp软件,点击“打开程序文件”,在弹出的文件浏览窗口中进入“2.LED闪烁”,在Objects文件夹下选中.hex文件,再点击下载即可,详见清翔零基础教你学51单片机_个人学习笔记(1)_点亮开发板上的LED灯
3.3 点击编译 3.4 下载 这两个章节的内容
4.3.3 现象
4.3.4 熄灭全部LED
根据 4.2 原理图分析 中,可以知道,要想熄灭全部LED,需要把P1端口8个引脚全部设置为高电平
#include <reg52.h>
void main()
{
//方案1
P1 = 255; //十进制255,相当于二进制b1111 1111
//方案2
P1 = 0xff; //十六进制0xff,相当于二进制b1111 1111
}
4.3.5 编译下载程序
打开stc-isp软件,点击“打开程序文件”,在弹出的文件浏览窗口中进入“2.LED闪烁”,在Objects文件夹下选中.hex文件,再点击下载即可,详见清翔零基础教你学51单片机_个人学习笔记(1)_点亮开发板上的LED灯
3.3 点击编译 3.4 下载 这两个章节的内容
4.3.6 现象
五、软件延时的LED闪烁程序
5.1 直接在main函数内写延时
#include <reg52.h>
unsigned int i;
void main()
{
//点亮全部LED并延时一会儿
P1 = 0;
i = 65535;
while(i--);
//熄灭全部LED并延时一会儿
P1 = 0xff;
i = 65535;
while(i--);
}
i = 65535;
while (i--);
这两句代码就是让芯片一直去计算65535减到0,在这期间不能去干其他的事。
main函数会自动循环,但是一般写程序还是会写一个while(1)来表示循环
5.2 封装延时函数
延时函数无返回值,用void定义
void delay(unsigned int i)
{
while(i--);
}
最终的山闪烁代码
#include <reg52.h>
void delay(unsigned int i)
{
while(i--);
}
unsigned int i;
void main()
{
//点亮全部LED并延时一会儿
P1 = 0;
delay(65535);
//熄灭全部LED并延时一会儿
P1 = 0xff;
delay(65535);
}
延时代码其实是可以通过keil的debug功能查看到具体的延时时间的,这个以后再说
本次笔记对应清翔视频教程的第12集,到此结束。下一个笔记将对应视频的13集:流水灯(理论+编程)