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

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

流水灯就是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口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。

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

#include<reg51h>

sbit led=P1^0; //单片机管脚位声明

void main()

{

TMOD=0x01; //定时器TO工作在方式1

TH0=(65536-5000)/256; //装初值,12M晶振 1为1us; 5000为5000us=5ms;

TL0=(65536-5000)%256;

EA =1; //开总中断

ET0=1; //开定时器TO中断

TR0=1; //启动定时器

P1=0; //初始化P1口

while(1) ; //程序在这里等待中断发生

}

void T0_time() interrupt 1

{

unsigned char num;

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

num++;

if(num==100) //05S (1s闪烁1次==05S亮05S灭)

{

num=0;

led=~led; //led状态取反

}

}

先简单给你个思路吧,可以考虑用状态机的方式来写程序,就拿一档换二档为例一档是一个状态,空档是一个状态,二档是一个状态,熄火是一个状态初始状态在一档,当你检测到档位变成空档的时候,程序进入空档状态,在这个状态里面,定时器打开,一直检测是否超时,如果在超时前发现输入变到了二档,那么程序进入二档状态,同时输出二档的代码,如果时间到了还没有检测到档位变换,那么就进入熄火状态,就是这样,本来想给你画个图,但是我电脑有点问题,上传不了

然后说计时的问题,有一种简单的方法就是用定时器的终端累加来计时,比如说你把定时器设置为1ms,并且打开溢出中断,那么定时器在计时1ms的时候就会产生一次中断,你设置一个变量,定时器每进行一次中断,变量就加1,这样等变量加到1000的时候你就知道1s到了

代码如下:

#include <reg52h>

#define uchar unsigned char

#define uint  unsigned int

#define data  P0     //P0口宏定义

/ /

// 数码管位选数组定义

/ /

uchar code  leddata[] =

{               0x3F,  //"0"

              0x06,  //"1"

              0x5B,  //"2"

              0x4F,  //"3"

              0x66,  //"4"

              0x6D,  //"5"

              0x7D,  //"6"

              0x07,  //"7"

              0x7F,  //"8"

              0x6F,  //"9"

              0x77,  //"A"

              0x7C,  //"B"

              0x39,  //"C"

              0x5E,  //"D"

              0x79,  //"E"

              0x71,  //"F"

              0x76,  //"H"

              0x38,  //"L"

              0x37,  //"n"

              0x3E,  //"u"

              0x73,  //"P"

              0x5C,  //"o"

              0x40,  //"-"

              0x00,  //熄灭

              0x00  //自定义};

};

/ /

// 位定义

/ /

sbit du = P1^7;   //段选定义

sbit we = P1^6;   //位选定义

/ /

// 函数名称:DelayMS()

// 函数功能:毫秒延时

// 入口参数:延时毫秒数(ValMS)

// 出口参数:无

/ /

void delay(uint z)

{

uint x,y;

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

for(y = 0; y < 113; y++);

}

/ /

// 函数名称:main()

// 函数功能:数码管静态显示

// 入口参数:无

// 出口参数:无

/ /

void main(void)

{

uchar i;

we = 1; //位选开

data = 0x00; //送入位选数据

we = 0; //位选关

while(1)

{

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

    {

    du = 1;         //段选开

data = leddata[i];        //送入段选数据

du = 0;        //段选关

  delay(500);       //延时

    }

}

}

扩展资料

对于74HC573,形象一点,我们只需要将其理解为一扇大门,只不过这扇大门是单向的,其中11引脚(LE)控制着门的开、关状态,高电平为大门打开,低电平为大门关闭。

D0-D7为输入,Q0-Q7为输出,在LE = 1,即输入高电平时,输入端=输出端,输入是什么,输出也就原封不动的输出;在LE = 0 ,即输入高电平时,大门关闭,实现锁存,不再输出。了解之后,我们按照电路图,来进行编程,代码实现。

在实现数码管的静态显示中,用到了两个锁存器,两个I/O口,P16和P17,分别是位选和段选。

首先定义了个数码管位选数组,也就是十六进制代码,这便是后来数码管显示数字的核心,接着,用 sbit 定义了位选和段选端口,分别是 P16 和 P17 ,定义了一个延时函数,其实这一串代码很有意思,开关开关思想,贯穿始终。

首先把位选打开,送入位选数据后,关闭锁存器,实现锁存,进入循环,随之打开段选锁存器,送入段选数据后,再次关闭段选。

接下来,这个延时 *** 作对于实际看到数码管的显示效果特别重要,因为程序在段选后之后,会马上消隐,显示的时间之后几个微秒,这显然不太合理,需要在关闭段选后加上延时,这样一来,才会让每位数码管亮度保持均匀。

使用51单片机需要达到以下基本条件:

1、至少要搭建一个最小系统;

2、你需要编制一个51的控制程序;

3、你需要将程序编译连接成HEX或BIN格式的代码并下载或烧录到51单片机。

这样你就可以使用这款51单片机了。

1单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。

很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。

你好:

1寄存器方面需要设置两个:

一个是TCON[2]或TCON[0]设置外部中断1或0是什么方式触发。

然后打开总中断开关,再打开外部中断EX1或EX0,外部中断开关。

2程序方面这样写:

void initEX0()                    //外部中断初始化函数

{

IT0=1;EA=1;EX0=1;    //下降沿

}

void INT0() interrupt 0    //外部中断服务函数

{

;

}

有不懂再回复。

希望我的回答能帮助到你。

以上就是关于51单片机中如何用汇编语言编写流水灯全部的内容,包括:51单片机中如何用汇编语言编写流水灯、编写一个完整的单片机C51程序、请问如何用51单片机写换档程序具体要求如下:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存