更多单片机学习笔记:
单片机学习笔记 1. 点亮一个LED灯
单片机学习笔记 2. LED灯闪烁
目录
[1-1 宏定义](#1-1 宏定义)
[1-2 延时函数](#1-2 延时函数)
[1-3 标准库函数中的循环移位函数](#1-3 标准库函数中的循环移位函数)
[1-4 Keil中Debug用法](#1-4 Keil中Debug用法)
0、实现的功能
实现LED灯依次闪烁,形成流水灯效果
1、Keil工程
1-1 宏定义
c语言中的宏定义简单来说就是化繁为简,也可对数据类型命为新的名字
1-2 延时函数
Keil中的函数分为标准库函数和自定义函数
下面给出一种延时函数,该板子的晶振频率为11.0592MHz,这个频率虽然机器周期不是整数,12MHz的机器周期是1us,但是它的波特率不好算,会导致传输数据的时候可能出错:
cpp
//自定义函数:延时函数Delay(毫秒级)
void Delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > 0; x--)
for(y = 114; y > 0; y--);
}
//直接给形参z赋值,如延时100ms的话,直接调用函数Delay(100)
//函数自己循环了100*114 = 11400次,根据晶振频率对应的时钟周期,算出为100毫秒
或者使用烧录软件的附带功能,输入晶振频率11.0592MHz和延时时间100ms
1-3 标准库函数中的循环移位函数
Keil中对应的标准库函数为:intrins.h,是一个内部函数
字符型循环左移:crol
字符型循环右移:cror
【注意:】该函数只适合于char型,int不可以
cpp
#include<intrins.h>
void test_crol(void)
{
unsigned char a;
unsigned char b;
a = 0xFE; // 1111 1110
b = _crol_(a,1); //循环左移一位,b现在是0xFD 1111 1101
}
//循环左移是把最高位移到了最低位上
而左移运算符也可以实现移位操作,但是是把高位移除,最低位补0
cpp
a = 0xFE; //1111 1110
b = a<<1; //b现在是1111 1100
//左移运算符是把高位移除,最低位补上0
1-4 Keil中Debug用法
界面最右边点击Debug图标,或者快捷键ctrl+F5,进入Debug模式
点击P1口,实时观察P1口的接口导通情况;单步进行调试,观察状态,左下角的sec还可以显示用时时间,可以验证延时函数的准确性
2、代码实现
cpp
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp; //LED灯闪烁过程变量
void delay(uint z)
{
uint x;
uint y;
for(x = z; x > 0; x--)
for(y = 114; y > 0; y--);
}
void main()
{
temp = 0xfe;
P1 = temp; //初始时只亮第一个灯
delay(100);
while(1)
{
temp = _crol_(temp, 1);
P1 = temp;
delay(100); //亮一次就延时100ms,再左移一位,亮下一盏灯
}
}
效果展示: