毕业回馈-89C51之GPIO使用(流水灯)
今天分享一个89c51制作的8位流水灯案例。使用Proteus仿真。
同上一遍文章不同。上一篇文章中对于GPIO操作主要是位操作,即sbit led1=P0^0;其中P0^0代表p0.0这个引脚,然后在这样位定义以后就可以对led1这个变量进行赋值操作,控制led灯的亮灭闪烁。今天要分享的是一次性对P1.0-P1.7进行操作。
89c51单片机是以51为内核的8位处理器,可以很方便的实现8位数据的操作。
所使用的电路原理图如下:
使用200Ohm的电阻进行限流,LED灯采用阴极接法,即LED灯的阴极接到单片机的IO口;
本次案例流水灯共有以下几种模式:
1):D1-D2-D3-D4-D5-D6-D7-D6-D5-D4-D3-D2-D1;顺向,逆向间隔流水;
2):从D1-D7按照二进制的形式流水
3):顺向移位流水:D1-D1,D2-D1,D2,D3-D1,D2,D3,D4-D1,D2,D3,D4,D5-D1,D2,D3,D4,D5,D6-D1,D2,D3,D4,D5,D6,D7;
4):逆向移位流水:D7-D7,D6-D7,D6,D5-D7,D6,D5,D4-D7,D6,D5,D4,D3-D7,D6,D5,D4,D3,D2-D7,D6,D5,D4,D3,D2,D1;
源代码如下:
其中
led_Mod:流水模式选择参数可以设置为1-5;
uDelay_ms:每一次切换之间的间隔时间;
void LED_Display(uint16 led_Mod,uint32 uDelay_ms)
{
int i=0;
uint32 cnt=0;
static int Mod;
Mod=led_Mod;
switch(Mod)
{
case 1://第一种模式:正向流水
{
for(;i<=7;i++)
{
if(i>=8)
{
i=0;
break;
}
Led=~led_Moud[i];
delay(uDelay_ms);
}
break;
}
case 2://第二种模式:逆向流水
{
for(;i<=7;i++)
{
if(i>=8)
{
i=0;
break;
}
Led=~led_Moud[7-i];
delay(uDelay_ms);
}
break;
}
case 3://第三种模式:二进制移位
{
for(i=0xff;i>=0x00;i--)
{
if(i==0)
{
i=0;
break;
}
Led=i;
delay(uDelay_ms);
}
break;
}
case 4://第四种模式:移位模式(不寻数组)顺向
{
for(;i<=7;i++)
{
if(i>=8)
{
i=0;
break;
}
Led = (0xfe<< i); //Led 等于 0xfe 左移 i 位,控制 8 个 LED
delay(uDelay_ms);
}
Led=0xff;
break;
}
case 5://第五种模式:移位模式(不寻数组)逆向
{
for(;i<=7;i++)
{
if(i>=8)
{
i=0;
break;
}
Led = (0x7f>>i); //Led 等于 0xfe 左移 i 位,控制 8 个 LED
delay(uDelay_ms);
}
Led=0xff;
break;
}
default:break;
}
}
顺向流水的数组定义如下:
const uchar code led_Moud[]=
{
0X01, 0X02, 0X04, 0X08, 0X10, 0X20, 0X40, 0X80//Module1
};
delay函数的定义:
请查看第一遍博客;http://www.cnblogs.com/Mr-Wangblogs/p/8890788.html
主函数的设计如下:
对于显示函数的声明如下:
51_Include.h内如下:
具体编码方式图解:(本编码方式是基于阳极接法,阴极的读者可以自行编写,遇到问题可以咨询)
接下来简单介绍一下C51数组定义的时候里面涉及到的几个关键字
首先C51数组定义如下:
const uchar code led_Moud[]=
{
0X01, 0X02, 0X04, 0X08, 0X10, 0X20, 0X40, 0X80//Module1
};
const:
作用主要有以下几点:
(1)可以定义const常量,具有不可变性。
(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
(5) 可以节省空间,避免不必要的内存分配。
(6)提高了效率
以上内容来自网络
我们在C51中使用这个关键字一般都是在定义数组是使用。在制作字库,编码时使用,主要目的时为了减少51资源的浪费以及不允许修改他所修饰的数组内容。
code:
C51的关键字,不是C语言的关键字。Code的意思是代码区,也就是说我们这样定义的时候就将这个数组放到了单片机的代码区,可以减少检索时间。
对于以上内容有疑问请及时联系我,我会尽快回复,欢迎一起交流和学习。
毕业回馈-89C51之GPIO使用(流水灯)的更多相关文章
- 毕业回馈—89C51之GPIO使用
STC89C51系列单片机共有如下几类GPIO口: (1)P0.0-P0.7: 对应DIP40封装的39-32号引脚:P0口既可以作为输入/输出GPIO口,也可以作为地址/数据复用总线使用. a)P0 ...
- 毕业回馈-89c51之定时器/计数器(Timer/Count)
今天分享的是89c51系列单片机的内部资源定时器/计数器,在所有的嵌入式系统中都包含这两个内部功能. 首先先了解几个定时器/计数器相关的概念: •时钟周期:时钟周期 T 是时序中最小的时间单位,具体计 ...
- 89C51单片机实现的流水灯
/*******************************************Copyright: 2014.02.09.version1.0File name: led.cDescrip ...
- 毕业回馈-89C51之数码管的使用
7段码的数码管由7个LED等共同组成,根据公共端的不同有共阴和共阳之分.现在很多数码管在7段码的基础上加了一个.即dp,其内部结构如下图所示: 公共端为LED灯的阴极,所以为共阴极接法: 公共端为阳极 ...
- 17.3.15---关于GPIO控制流水灯的信息
添加一个网址: http://rmingwang.com/gpio-control-flow-lamp-code-archive.html 还有一个 http://www.openedv.com/po ...
- (一)GPIO 编程实验 LED 流水灯控制
7个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7. GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P ...
- 89C51单片机定时器控制的流水灯
/***************************************************Copyright: 2014-02-11.version1.0File name: timer ...
- S5PV210_流水灯
1.整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译.链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若 ...
- STM32学习笔记(二) 基于STM32-GPIO的流水灯实现
学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...
随机推荐
- Java基础类库简介
Java基础类库简介 一.常用的基础类库:11个jar(Java Archive,Java归档)包 作为java语言使用者,我们可以感受到java语言带来的优势(平台无关.面向对象.多线程.高效易扩展 ...
- 使用JavaScript实现一个俄罗斯方块
清明假期期间,闲的无聊,就做了一个小游戏玩玩,目前游戏逻辑上暂未发现bug,只不过样子稍微丑了一些-.-项目地址:https://github.com/Jiasm/tetris在线Demo:http: ...
- Python内置函数(33)——any
英文文档: any(iterable) Return True if any element of the iterable is true. If the iterable is empty, re ...
- Netty事件监听和处理(上)
陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app. 今天给大家送了福利:小爱音箱 ...
- mysql 存储过程 实现数据同步
数据库 表 发生变化,需要把2.0的表数据 同步到3.0库中去: -- 同步数据存储过程执行 -- 更新留言旧表数据到新表数据中 /*DEFINER:Vector*/ drop procedure i ...
- Java基础中一些容易被忽视的语法小细节总结
一:语法细节 1. Java中的命名规则: package:统一使用小写字母 class:首字母大写,使用驼峰标识 method:首字母小写,使用驼峰标识 field:首字母小写,使用驼峰标识 sta ...
- python 正则详解
正则表达式概述 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),是计算机科学的 ...
- SpringBoot(一):使用eclipse/idea创建springboot helloword工程
eclipse如何创建spring boot工程: 第一步:首先打开eclipse,找到图中的下图的中“下三角”符号,选中"working sets"(表示将会把eclipse中的 ...
- requests-post请求
post与get方法的区别在于post需要提交一些数据以备处理. 在requests里面非常简单,headers,data都是直接加进去就可以了 # requests.post提交表单# 有些网站使用 ...
- 【转载】Ubuntu 12.04 LTS 中文输入法的安装
原文地址 : http://www.cnblogs.com/zhj5chengfeng/archive/2013/06/23/3150620.html 我装的是英文版的 Ubuntu12.04,如果 ...