c51单片机中如何用汇编语言编写流水灯

c51单片机中如何用汇编语言编写流水灯,第1张

! 随着各IC厂商推出各种高性能的单片机,51单片机已经远远不能满足大家对高性能单片机的需求。ATMEL作为一个51系列单片机的大生产厂商,90年代中后期推出一款高性价比的RISC(精简指令集)单片机系列,就是当今很流行也很著名的AVR单片机,在各种高性能单片机的竞争中,脱颖而出,很受各界电子人士热爱。很多想学单片机的人都不敢学习AVR,觉得不好入门,其实不然,如果你使用C语言编程,入门都是一样的,而且当你学好后,不用像学习51的人,还要在学习一个高性能的单片机,这样很浪费时间。目前很多公司和学校已经开始转向AVR单片机了,相信在未来几年,AVR将会非常兴旺,所以学习AVR单片机将会很有前途。先说说AVR单片机的优点,相比经典的51系列来说,突出的优点主要有以下几点: 一、速度快。AVR是精简指令集单片机,其速度可以达到1MIPS/秒,理论上是传统的51的12倍,实际上在10倍左右。 二、片上资源丰富。MEGA系列片上具备JTAG仿真和下载功能。片内含有看门狗电路、片内程序Flash、片内数据RAM、同步串行接口SPI、异步串口UART、内嵌AD转换器、EEPROM、模拟比较器、PWM定时计数器、TWI(IIC)总线接口、硬件乘法器、独立振荡器的实时计数器RTC、片内标定的RC振荡器等片内外设,可以满足各种开发需求。 三、驱动能力强。I/O口可以直接驱动数码管、LED、继电器等器件,节省很多外围电路,即节省开发难度,又降低成本。 四、功耗低。低功耗虽然比不上430单片机,但是在单片机中也是佼佼者。 五、可选择型号种类多。各种不同的型号可以满足不同的需求,让你的项目有很多的选择余地。 六、性价比高。在高性能的前提下,并没有增加芯片的价格,价格可以和51相比,而功能确是51不可以比的。 综合以上的优点和今后的趋势,学习AVR单片机是很必要的。 下面就我个人的体会怎么样才能更快的学好AVR单片机!! 很多想学习AVR的人都问我怎样才能学好?下面我就把我自己是如何学习AVR单片机,如何开始上手,如何开始熟练这个过程给大家讲讲。 任何一款单片机的学习都应该是和实践紧密结合的过程,不能长时间的停留在书本上。但是学习单片机也是学习知识,所以首先还必须得看书,因为从书中你需要大概了解一下,单片机是什么东西?都可以干什么?如何控制它才能达到我们的目的等等?第一次,第二次你可能看不明白,但这不要紧,因为还缺少实际的感观认识。可以把它当做小说来看,只要了解个大概就行。推荐一本书,书名是《AVR系列单片机C语言编程与应用实例》,是清华大学出版社出版的。大概了解一下书上的内容,然后实践,这是非常关键的,因为学单片机你不实践是不可能学会的。关于实践有两种方法你可以选择,一种方法:你自己花钱买一块单片机的学习板,功能少的花钱少,入门过后就没什么用处了。功能多的虽然贵点,但是你可以学习到更多的东西。好的学习板可以当作开发板,很多人以为学习板和开发板这是一个东西,其实不然,学习板只能来简单的学习,开发板呢?上面的东西很专业,程序中的子函数很独立,在你开发的时候,很多东西拿来就可以用直接调用,很方便。所以我个人建议买个好点的可以用做开发板的学习板。流水灯、数码管、独立键盘、矩阵键盘、AD或DA(原理一样)、液晶、蜂鸣器等很基础的实验,如果你能熟练应用,那可以说对于单片机方面的硬件你已经入门了,剩下的就是自己练习设计电路,不断的积累经验。只要过了第一关的入门,后面的路就好走多了。方法二:你身边如果有单片机方面的高手,向他求助,让他帮你搭个简单的最小系统板。对于高手来说,做个单片机的最小系统板只需要几分钟的时间,而对于初学者可就难多了,因为只有对硬件了解了,才能熟练运用,而你还没入门。而如果你身边没有这样的高手,又找不到可以帮助你的人,那我劝你最好是自己买上一块,毕竟自己有一块要方便的多,以后做单片机类的实验时都能用得上,省时省事,为了学习,投入一下还是很值得的,因为以后它为你创造的价值是无法比拟的,少买一件衣服,少下两顿馆子,少上网吧,省点钱学习些有用的东西,这才是年轻人该做的事。 有了单片机学习板之后你要多练习,最好是自己有台电脑,多研究程序,少玩游戏、少看**。首先学会使用开发软件,如何编辑、编译源程序?如何仿真程序?目前使用C语言开发AVR的人占90%,而初学者大都使用ICCAVR(AVR的C语言环境)作为编辑、编译源程序的软件,用AVR Studio来进行仿真。然后从最简单的流水灯实验做起,等你能让那八个流水灯按照你的意愿随意流动时你已经入门了,你会发现单片机是多么有趣的东西啊,太有意思了(当你编写的程序按你的意愿实现时你会感到很惬意,慢慢的你会爱上电子这行的)。然后让数码管亮起来,这两项会了后,你已经陷入其中了。就是要这样练习,在写程序的时候你肯定会遇到很多问题,而这时你再去翻书找,或是请教别人,当得到答案后,你会印象很深的,记得很牢固。这样下去,很快你就熟悉AVR单片机了。程序练习的差不多的时候,你就开始动手做硬件了,查找相关资料,自己动手做电路,几个月下来,你就成为高手了。 再简单说一下C语言和汇编语言。单片机编程用C语言或汇编语言都可以,但是我建议用C语言比较好,如果原来有C语言的基础那学起来会更好,如果没有,也可以边学单片机边学C语言,C语言也挺简单,只是一门工具而已,我劝你最好学会,将来肯定用得着,要不你以后也得学,你一点汇编都不会根本无所谓,但你一点C语言都不会那你将来会吃苦头。汇编写程序代码效率高,在时序要求严格的场合下用的多,但相对开发难度较大,而且很麻烦,尤其是遇到算法稍微复杂点的问题时,用汇编写起代码来很容易把自己搞的一塌糊涂。AVR单片机的主频可以高达20MHz,顶200多MHz的51单片机,这样高频率的时钟,我们采用C语言来编写代码就没问题了。单片机的程序存储器(ROM、FLASH)容量也在不断的提高,足够装得下你用C语言写的任何代码,C语言的资料丰富、移植性非常好,只需要稍微修改就可以移植,所以我劝大家用C语言。 总得来说,只要你有信心,做事能坚持到底,有不成功不罢休的精神,不管你学习没学习过单片机,学好AVR单片机就是件非常容易的事。 下面我再简要介绍一下步骤: 一、找本书大概了解一下AVR单片机结构、功能。大概了解就行,不用看的很细。(五天) 二、找学习板练习编写程序,学单片机主要是练习编写程序,遇到不会的再请教别人或查书。(四十天) 三、如果你学习的是MEGA系列的AVR单片机,你还要学会怎么样设置熔丝位,让它更高效、更方便的为你工作。(一天) 四、自己在网上找些小电路类的资料练习设计外围电路。焊好后自己调试,熟悉过程。(十天) 五、自己独立设计具有个人风格的电路、产品,……你已经是高手了。

#include<reg52h>

#define uchar unsigned char

void delay(z);

uchar code t[]={0x18,0x24,0x42,0x81};//这是编码表

void main()

{

int i=0;

while(1)//死循环

{

for(i=0;i<4;i++)

P1=t[i];//取码,我用的P1口,你要用其他的端口你就把取出来的码送给你要用的端口

delay(5);

}

}

void delay(z)

{

int a,i;

for(a=0;a<z;a++)

for(i=0;i<110;i++);

}

at89s52也是51系列的单片机,程序完全兼容,用51的程序就行了,包括外围电路也一样,直接用就行了。

单灯亮就是在io口输出一个二进制数中只有一位不同的数,比如说“00000001”,就只有最后一位是“1”,其余的都是“0”,要双灯亮就使其中的两位与其他的不同就行了,还是那上面的例子来说,现在改成“00000011”,这样有两位是不用的了,当然不同的两位也可以不挨着,比如“00100001”,这样也是两位同时点亮。(例子的前提是输出高电平时led点亮,如果不是的话就把里面的“0”改成“1”,“1”改成“0”就行了。)

你有源程序吗,有的话发到我邮箱里,我帮你改吧,这方面你一点不懂,这样问下去也不会有什么进展的了,邮箱发到你的"百度hi"上了。

流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:

ORG 0000H ;复位启动

AJMP START ;

ORG 001BH ;T1中断

AJMP T1INT ;

;定义变量========================

YSJS EQU 30H;延时计数器

LED EQU 31H;LED控制缓冲器

;主程序==========================

START: MOV LED,#0FEH ;初始化数据

MOV YSJS,#0 ;

MOV TMOD,#10H ;定时器1工作于方式1,16位定时器

MOV TL1,#0B0H ;设置定时初值

MOV TH1,#3CH ;定时时间=50mS

SETB ET1 ;使能定时器1中断

SETB TR1 ;启动定时器1

SETB EA ;开总中断

MOV P1,LED ;初始化流水灯

LOOP: JMP LOOP ;循环等待中断

T1INT: PUSH PSW ;定时器1中断程序

PUSH ACC ;保护现场

MOV TH1,#3CH ;定时时间=50mS

MOV TL1,#0B0H ;

INC YSJS ;

PUSH ACC ;保护ACC

MOV A,YSJI ;

CJNE A,#2,QT1 ;50mS2=100mS

MOV P1,LED ;

MOV A,LED ;

RL A ;累加器A的值循环左移1位

MOV LED,A ;

MOV YSJS,#0 ;

QT1: POP ACC ;恢复现场

POP PSW ;

RETI ;返回主程序

END ;汇编程序结束

扩展资料:

实现流水灯的三个方法:

第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。

第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P10口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。

第三种,库函数实现流水灯。利用左移函数进行。

原理图没有吗?这方面能力的提升最好有自己的单片机开发板,这样学习不会枯燥,效果也好些,我就是学习吴鉴鹰51单片机开发板的,有视频教程,很方便学起来,你也可以自己动手做些小实验,学习板很多,用的话找像吴鉴鹰单片机开发板这样教程详细,板子功能多的

代码已修改,并仿真通过。

#include<reg51h>     //包含单片机寄存器的头文件

#include "intrinsh"

#define uchar unsigned char

#define uint unsigned int

 sbit CLK=P1^0;

 sbit IN =P1^1;

//uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uint code w[]={0xfffe,0xfffd,0xfffb,0xfff7,0xffef,0xffdf,0xffbf,0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff,0xefff,0xdfff,0xbfff,0x7fff};//新建了一个流水表

void delay(uint i)

{

    uint j;

    uchar k;

    for(j=i;j>0;j--)

        for(k=125;k>0;k--);

}

//发送1字节给74LS164

void send_byte(uchar temp)

{

    uchar i;

    for(i=0;i<8;i++)

    {

        if(temp & 0x80)

        {

            IN =1;

        }

        else

        {

           IN =0;

        }

        CLK = 0;

         _nop_();  //if Keil,require use intrinsh

        CLK = 1;

        

        temp=temp<<1;// temp左移1位

    }

}

//发送2字节给74LS164

void send_word(uint temp)

{

    

    send_byte((uchar)(temp>>8));//先发送高字节

    send_byte((uchar)(temp&0x00FF));//再发送低字节

}

void main(void)

{

    uint i;

    

    while(1)

    {

        for(i=0;i<16;i++)

        {

            //send_byte(a[i]);

            send_word(w[i]);//发送2字节

            delay(4000);

            

           

        }

    }

}

while(1)

{

a = 0xfe;

for(j=0;j<8;j++) //外循环8次

{

//--------------------------------------------

for(i=0;i<8-j;i++) //内循环8、7、60次

{

P1=a; //第一次,只有右边1个发光

delay(200);

a=_crol_(a,1); //左移一位

}

//以上单个LED发光,移位8、7、6次

//----------------------------------------

a = _crol_(a, j); //左移,第一次,移动0位,以后渐多

//前面的内循环,移位次数逐减,这里逐增,合到一起,仍然是移动8位

P1 = 0xff; //关闭显示

a = a << 1; //左移一位,右边添0,这样,就会有两个发光

} //到前边去循环,显示两个发光;

//再循环,有三个发光;

//……

}

以上就是关于c51单片机中如何用汇编语言编写流水灯全部的内容,包括:c51单片机中如何用汇编语言编写流水灯、求一个用c语言编译的流水灯程序,要求灯从中间向两边亮、单片机实验点亮流水灯程序从第三个灯开始循环点亮 一个共有8个灯哦等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9460489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存