STC89C52单片机 流水灯

2024-01-14 12:50
文章标签 单片机 流水 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的用法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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

这篇关于STC89C52单片机 流水灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/605227

相关文章

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

批量生成编号(A~Z+3位流水编号)

/*** 批量生成编号* @param num* @param warehouseId* @return*/public synchronized List<String> generatCodeList(int num,long warehouseId){MesRack rack = this.getCurrentRack(warehouseId);String oldRackCode;Lis

git 学习的流水log

git命令联系 配置以及修改全局user信息 git config --global user.name 'you_name' git config --global user.email 'you_email@qq.com' 现有设备中的所有配置 git config --list 现有设备中的所有配置 git config --list --local/--global/--syste

飞凌单片机开发IDE环境

飞凌单片机 资料下载选择芯片类型:MCU->GPIO选择芯片型号:FM8PE53B IDE工具安装: 资料下载 飞凌官网 选择芯片类型:MCU->GPIO 选择芯片型号:FM8PE53B IDE工具安装: 运行Generic ICE 0.02-250.03 setup,一直点击“下一步”即可。 双击运行:Generic ICE