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 1110
	delay(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 1110
	delay(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 1110
	delay(100);

	while(1){
		temp = _crol_(temp, 1);
		P1 = temp;
		delay(100);	 // 延时 100毫秒	 通过增加延时的时间或减少延时的时间,来控制流水灯的速度			  
	}			
}

keil中Debug的用法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teVzCnNY-1604149519040)(img/Options.png)]

需要修改晶振频率为:11.0592

如果要看LED灯的高低电频的情况,通过菜单栏的Peripherals选项,中的 I/O-Ports → Port 1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5adFF17-1604149519044)(img/Peripherals.png)]

开启Debug的界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kk6Kt5DL-1604149519049)(img/menu.png)]

单片机小精灵的使用

选择 晶振频率为:11.0592 MHz 12T 时钟周期

可以同过该程序定义生成延时函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ZLsKwXq-1604149519054)(img/elf.png)]

注:在使用晶振频率精准的同时也要保证串口波特率和晶振对应,减小串口波特率的误差,所以选择 晶振频率为:11.0592

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值