c51单片机流水灯程序汇编语言,基于51单片机的流水灯程序

c51单片机流水灯程序汇编语言,基于51单片机的流水灯程序LED流水灯的开发在51单片机中再常见不过了,主要是让大家掌握IO的操作是单片机控制最基本的要求。根据开发流程,我们先查看选型的单片机的资源和控制寄存器,然后在软件上实现控制。在这里芯片我们采用STC15W404AS作为开发的硬件平台,在这里我们用该单片机的P1引脚来驱动LED实现流水灯的功能。如图是LED连接的硬件电路,可以看到8颗LED是阳极通过限流电阻共同连接到VCC上的,也就是说当LED…

大家好,又见面了,我是你们的朋友全栈君。

LED流水灯的开发在51单片机中再常见不过了,主要是让大家掌握IO的操作是单片机控制最基本的要求。根据开发流程,我们先查看选型的单片机的资源和控制寄存器,然后在软件上实现控制。

在这里芯片我们采用STC15W404AS作为开发的硬件平台,在这里我们用该单片机的P1引脚来驱动LED实现流水灯的功能。

d443d81cb493db461c757453879765fa.png

如图是LED连接的硬件电路,可以看到8颗LED是阳极通过限流电阻共同连接到VCC上的,也就是说当LED的阴极有高电平的时候LED灯是灭的,相反当 LED的阴极是低电平的时候LED就会亮起来,并且由于限流电阻为510欧姆,电源VCC电压是5V,红光LED的电压在1.9V左右,因此LED在亮起 来的时候大概有6mA的电流。有了上面的参数我们可以有目的的去看单片机的手册了。

cdae3c30c00b0b9c0b467d7943339713.png

从手册中可以看到,P1口可以设置成I/O(输入输出)模式,输入模式以及输出模式,并且每种模式的下能够承受的电流大小也不相同,在这里根据我们的电 路连接方式可以看到我们需要的是输入的模式,并且输入的电流最大在3mA左右,因此根据说手册上的说明,我们将P1口设置成准双向口就可以,当然如果想用 单片机端口来作为LED电流源驱动的话那就设置成推挽输出就可以。因此我们将P1端口的控制寄存器P1M1和P1M0相应的位(对应端口)设置成0即可, 也就是P1M1=0x00;P1M0=0x00;

将P1的控制位设置好后,我们就可以通过P1的直接赋值来控制LED的亮和灭了,其对应关系是:P1=~0x01,第一颗亮;~0x02第二颗亮……由此,我们可以有很多种方法来实现流水的功能。

1.数组的方法

由前面的结果类推我们可以制作一个表{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}这样我们只要选择这个表格中 的一位数然后取反赋值给P1就能控制相应的灯的亮灭,因此我们把这个表格做成一个数组然后进行循环来实现LED的流水功能。其程序如下:

#include

unsigned char code LED[]={0x01,0x02,0x04,0x08,0x10,0x20};

void delay()

{

unsigned int i;

for(i=0;i

}

void IO_Config()

{

P1M0=0x00;//设置P1端口的类型

P1M1=0x00;//可以根据不同的电路来修改

}

void main()

{

unsigned char j;

IO_Config();

while(1)

{

for(j=0;j

{

P1=~LED[j];

delay();

}

}

}

复制代码

由于我们选择的这款芯片P1引脚只有6个(P1.0~P1.5)所以我们只设置了6个值,对于8个的也使用只需要将数组拓展到8位即可,编译后可以通过下载到单片机调试即可

2.移位的方法

在C语言中我们有个>(左移)功能,这也在单片机中常用到,值得注意的是,当数据移动后会用0来填补,这点要非常注意,因此上面的程序可以简化为下面的结构:

#include

//unsigned char code LED[]={0x01,0x02,0x04,0x08,0x10,0x20};

void delay()

{

unsigned int i;

for(i=0;i

}

void IO_Config()

{

P1M0=0x00;//设置P1端口的类型

P1M1=0x00;//可以根据不同的电路来修改

}

void main()

{

unsigned char j,temp;

IO_Config();

while(1)

{

temp=0xfe;

for(j=0;j

{

//P1=~LED[j];

P1=temp;

temp=(temp

delay();

}

}

}

复制代码

同样将改程序编译后生成HEX文件烧写到单片机内然后就可以调试了

3.循环移位法

从 上面可以看到用C语言的移位的方法移动后都自动会用0来填补,这样我们必须在后面通过或的方法来补齐原来的数据,我们知道在汇编语言中有RR和 RL(rotate right和rotateleft)的移位方法,这种以为的好处是从移动过程中数据是圆形的移位,这样不需要填补就可以,但是这个以为的方法只是对ACC 进行移位的。那么我们要实现这个函数怎么办呢,第一种方法就是在C语言中嵌入汇编通过# pragma asm和# pragma endasm来实现嵌入汇编,格式如下:

……

#pragma asm

RL A

……

#pragma end asm

……

当 然在这里这不是我们要讲的重点,我们要说的是第二种方法,那么我们是不是能够编写一个和RL,RR功能一样的函数呢?其实完全没有必要,这些函数都在 intrins头文件中,根据前面几章介绍的知识,我们只需要在文件中加入这个头文件就可以用了,那么这个函数是怎么个形式呢?我们就看看这个函数吧。

externvoid _nop_ (void);

externbit _testbit_ (bit);

externunsigned char _cror_ (unsigned char,unsigned char);

externunsigned int _iror_ (unsigned int, unsigned char);

externunsigned long _lror_ (unsigned long,unsigned char);

externunsigned char _crol_ (unsigned char,unsigned char);

externunsigned int _irol_ (unsigned int, unsigned char);

externunsigned long _lrol_ (unsigned long,unsigned char);

externunsigned char _chkfloat_(float);

externvoid _push_ (unsigned char _sfr);

externvoid _pop_ (unsigned char _sfr);

以上界函数是在intrins头文件中的函数,这些函数的源码keil封装了起来,只能看到函数的接口,其具体用法在我的附件中有说明,在这里我们需要的 就是_crol_字符循环左移的指令,这个函数有两个入口参数分别是要移动的数据和移动的位数着这里我们移动的数据是0xfe,移动的位数为j(和所在的 位有关)位,因此我们可以将上面的程序改写:

#include

#include

//unsigned char code LED[]={0x01,0x02,0x04,0x08,0x10,0x20};

void delay()

{

unsigned int i;

for(i=0;i

}

void IO_Config()

{

P1M0=0x00;//设置P1端口的类型

P1M1=0x00;//可以根据不同的电路来修改

}

void main()

{

unsigned char j;

IO_Config();

while(1)

{

for(j=0;j

{

//P1=~LED[j];//第一种方法

//P1=temp; //第二种方法

//temp=(temp

P1=_crol_(0xfe,j);//第三种方法

delay();

}

}

}

可以看到其时序和前面的都一样。

最后总结一下,在这个小设计的开发过程中我们主要根据前面的开发流程加深了对单片机的开发,首先设计硬件电路根据硬件电路来将参数提取出来,再根据所选单片 机手册来选择相应的功能,最后根据要求来编写程序,再编程过程中善于利用已经编写好的源码来是实现自己的功能,如果现成的源码不能满足自己的要求就根据自 己的需求来编写相应的程序。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139900.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 调用网站第三方接口实现短信发邮件「建议收藏」

    调用网站第三方接口实现短信发邮件「建议收藏」一,电子邮件的使用在项目开发中,经常会用到通过程序发送电子邮件,例如:注册用户邮件激活,通过邮件找回密码,发送报表等。二,通过PHP程序来操作电子邮件几种通过PHP发送电子邮件的方式1)通过mail()函数发送邮件2)使用fsockopen方式连接smtp服务器发送3)使用phpmailer邮件类发送。个人推荐使用phpmailer邮件类发送,phpmailer比较方便而且功能强大…

    2022年6月3日
    74
  • pycharm基本操作_pycharm用法

    pycharm基本操作_pycharm用法0前言1官方快捷键2自定义快捷键0前言1官方快捷键Ctrl+快捷键说明Ctrl+鼠标左键/B点击变量应用处,到达变量定义处点击变量定义处,显示变量应用列表Ctrl+C/X/V复制/剪切/粘贴Ctrl+D现场复制粘贴选中的区域或当前行Ctrl+F/R开启查找/替换功能,开启时自动填写选中的字符Ctrl+H显示当前class的层次结构Ctrl+S全部保存Ctrl+W扩大光标选中范围Ctrl.

    2022年8月28日
    4
  • java运算中的取余

    java运算中的取余java中的取模(取余)在java运算中有时会出现对一个整数取模(取余)操作,首先复习一下小学学过的除法公式:除数÷被除数=商如果没有被整数就会出现余数,例:10÷3=3余数为1在java运算中,取余符号是%1、第一种情况一个大的整数对一个比它小的整数取余publicstaticvoidmain(String[]args){in…

    2022年6月1日
    138
  • ssl证书怎么用_为什么会ssl证书无效

    ssl证书怎么用_为什么会ssl证书无效1.打开网站:https://freessl.cn/按提示操作,验证类型:离线验证;2.会给出一个域名的访问路径和一个文件内容,按照域名解析的主机配置nginx或其它的web服务,返回文件给出的内容;3.确认文件url和内容无误后点验证;4.通过后可以在KeyManager里的证书管理里看到颁发的证书;5.点更多然后选择导出Nginx证书,crt为证书,key为密钥;6.将文件分发到nginx等其它需要证书的服务上去使用;注意:这里最关键的一步就是,你的域…

    2025年8月12日
    3
  • jedis操作redis_redis java使用

    jedis操作redis_redis java使用1、Jedis客户端https://redis.io/clients2、Jedis源码包与使用介绍https://github.com/xetorthio/jedis3、项目中使用通过maven引入Jedis的依赖包<!–https://mvnrepository.com/artifact/redis.clients/jedis–><depen…

    2022年10月10日
    4
  • 十字路口的交通灯控制系统_十字路口红绿灯控制程序设计

    十字路口的交通灯控制系统_十字路口红绿灯控制程序设计十字路口交通信号灯控制系统主要任务开发平台设计思路主要任务设计一个用于十字路口的交通灯控制器,能显示十字路口东西、南北两个方向的红、黄、绿的指示状态;具有倒计时的功能,用两组数码管作为东西和南北方向的倒计时显示,**主干道直行(绿灯)60秒后,左转(绿灯)40秒;支干道直行(绿灯)45秒后,左转(绿灯)30秒,**在每次绿灯变成红灯的转换过程中,要亮黄灯5秒作为过渡。黄灯每秒闪亮一次。只考虑直行和左转车辆控制信号灯,右转车辆不受信号灯控制,南北向车辆与东西向车辆交替方向,同方向等待车辆应先方向直

    2022年9月25日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号