本文主要是介绍STC89C52单片机 流水灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
流水灯
宏定义
用define 进行宏定义的典型用法
#define uchar unsigned char
注意宏定义后面不能加分号,它是预处理指令不是语句。
其中用“uchar”
直接替换了unsigned char
此时我们可以用uchar去定义变量类型如:uchar i ;
等价于 unsigned char i ;
对于上面的宏定义我们是用来给已有数据类型取别名。
对已有数据类型取别名一般还有使用关键字typedef
,
定义方法如下:
typedef 已有数据类型 新的数据类型;(要加分号)
函数的定义
函数就是将多条语句集合在一起,来完成一种特定功能。
函数分为标准函数库,和用户自定义函数。
标准函数库:keil 编译器提供的,不需要用户进行定义。
自定义函数:用户根据自己需要编写的函数,它必须在使用前定义。
自定义函数一般格式为:
函数类型 函数名(形式参数表)
{ 局部变量定义 函数体语句
}
延时函数
自定义函数: 延时函数 delay
(毫秒级)
void delay(unsigned int z){ unsigned int x, y; for (x = z; x > 0; x--){ for (y = 114; y > 0; y--); }
}
给形参z赋值,如延时100 毫秒:delay(100);
标准库函数中的循环移位函数
标准库函数:intrins.h
内部函数:
- 字符型循环左移:
_crol_(unsigned char, unsigned char)
- 字符型循环右移:
_cror_(unsigned char, unsigned char)
#include <intrins.h>
void test_crol (void){ unsigned char a; unsigned char b; a = 0xFE; // 1111 1110 b = _crol_(a, 1); // b now is 0xFD 二进制为 1111 1101
}
_crol_(unsigned char, unsigned char)
:第一个参数 参与运算的数值,第二个参数,如果是1循环左移一位,如果是2循环左移2位…
_cror_(unsigned char, unsigned char)
:第一个参数 参与运算的数值,第二个参数,如果是1循环右移一位,如果是2循环右移2位…
循环移位函数与左移和右移运算符的区别
使用字符型循环左移:
#include <intrins.h>
void test_crol (void) { unsigned char a; unsigned char b; a = 0xFE; // 1111 1110 b = _crol_(a, 1); // b now is 0xFD 二进制为 1111 1101
}
使用左移运算符
a = 0xFE; //1111 1110 b = a<<1; // b now is 0xFC 二进制为 1111 1100
区别:循环左移是把最高位移到最低位上,左移运算符是把最高位移除最低位补0
1. 流水灯实现左移
#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned char uchar temp; // LED灯相关变量void delay(unsigned int z){ // 毫秒级延时函数定义unsigned int x, y;for (x = z; x > 0; x--){for (y = 114; y > 0; y--){}}
}// 实现左移
void main(){ // main函数自身会循环temp = 0xfe;P1 = temp; // 1111 1110delay(100);while(1){temp = _crol_(temp, 1);P1 = temp;delay(100); // 延时 100毫秒 通过增加延时的时间或减少延时的时间,来控制流水灯的速度 }
}
2.流水灯实现右移
#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned char uchar temp; // LED灯相关变量void delay(unsigned int z){ // 毫秒级延时函数定义unsigned int x, y;for (x = z; x > 0; x--){for (y = 114; y > 0; y--){}}
}// 实现右移
void main(){ // main函数自身会循环temp = 0xfe;P1 = temp; // 1111 1110delay(100);while(1){temp = _cror_(temp, 1);P1 = temp;delay(500); // 延时 100毫秒 }
}
3.每四个流水灯实现左移:
#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned char uchar temp; // LED灯相关变量/*====================================
函数 : delay(uint z)
参数 :z 延时毫秒设定,取值范围0-65535
返回值 :无
描述 :12T/Fosc11.0592M毫秒级延时
====================================*/void delay(unsigned int z){ // 毫秒级延时函数定义unsigned int x, y;for (x = z; x > 0; x--){for (y = 114; y > 0; y--){}}
}// 实现左移
void main(){ // main函数自身会循环temp = 0xf0; // 每4个灯进行流水闪烁P1 = temp; // 1111 1110delay(100);while(1){temp = _crol_(temp, 1);P1 = temp;delay(100); // 延时 100毫秒 通过增加延时的时间或减少延时的时间,来控制流水灯的速度 }
}
keil中Debug的用法
需要修改晶振频率为:11.0592
如果要看LED灯的高低电频的情况,通过菜单栏的Peripherals选项,中的 I/O-Ports → Port 1
开启Debug的界面
单片机小精灵的使用
选择 晶振频率为:11.0592 MHz 12T 时钟周期
可以同过该程序定义生成延时函数
注:在使用晶振频率精准的同时也要保证串口波特率和晶振对应,减小串口波特率的误差,所以选择 晶振频率为:11.0592
这篇关于STC89C52单片机 流水灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!