STC89C52单片机 流水灯

阅读: 评论:0

STC89C52单片机 流水灯

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

本文发布于:2024-01-29 05:29:48,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170647738913032.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:单片机   流水
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23