当前位置:广东训练网 > 口才训练 > 正文

51单片机汇编程序

发布:2024-07-11 13:08:00     编辑:小露     来源:广东训练网
51单片机中如何用汇编语言编写流水灯
51单片机中如何用汇编语言编写流水灯
提示:

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

流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下: ORG 0000H;复位启动AJMP START;ORG 001BH;T1中断AJMP T1INT; ;定义变量========================YSJSEQU 30H;延时计数器LEDEQU 31H;LED控制缓冲器 ;主程序==========================START:MOV LED,#0FEH;初始化数据MOV YSJS,#0;MOV TMOD,#10H;定时器1工作于方式1,16位定时器MOV TL1,#0B0H;设置定时初值MOV TH1,#3CH;定时时间=50mSSETB ET1;使能定时器1中断SETB TR1;启动定时器1SETB EA;开总中断 MOV P1,LED;初始化流水灯LOOP:JMP LOOP;循环等待中断T1INT:PUSH PSW;定时器1中断程序PUSH ACC;保护现场MOV TH1,#3CH;定时时间=50mSMOV TL1,#0B0H;INC YSJS; PUSH ACC;保护ACCMOV A,YSJI;CJNE A,#2,QT1;50mS*2=100mSMOV P1,LED;MOV A,LED;RL A;累加器A的值循环左移1位MOV LED,A;MOV YSJS,#0;QT1:POP ACC;恢复现场POP PSW;RETI;返回主程序END;汇编程序结束 扩展资料: 实现流水灯的三个方法: 第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。 第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。 第三种,库函数实现流水灯。利用左移函数进行。

51单片机的编程问题?
提示:

51单片机的编程问题?

1:C51编译器如何区分位地址和字节地址 是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P0.0位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如: C51语句: P0 = 1; P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P0.0脚将输出高电平(其实是呈现高阻态,P0口独有的),其他.1-.7脚输出低电平。 C51语句: P0_0 = 1; P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P0.0将输出高阻态。而P0.1-.7不会变化。 2:C51为什么要嵌套汇编 51单片机一个显著优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例: 汇编程序单独保存一个文件,加入到工程中,函数如下: _proc_a: mov a, r7 inc a mov r7, a ret 用c语言在.h文件中声明: extern unsigned char proc_a(unsigned char val); 调用时形如: retvalue = proc_a(0x11); 说明: a:汇编程序如果带参数,则需要在汇编程序前多加一个下划线。而声明它的地方不用加(伟福编译器这么要求的)。 b:函数的形参中第一参数用R7传递,函数返回值用R7返回,这是C51的通用规范。其他参数都有相应规定。函数可以返回一个位,用psw的c位返回。c:上面的语句,执行顺序是把0x11给R7,然后跳转子程序,子程序将它加1后送回。 d:函数跳转到汇编程序时,本区的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考虑调用后是否要恢复这些常规资源。上例中,A的值被函数使用了,编程者不必恢复调用前的值。

51单片机 将一组数按从大到小的顺序排列起来
提示:

51单片机 将一组数按从大到小的顺序排列起来

#include #include #define arrSize 1000 void RecurSelectSort(int a[], int n, int i); main() { int a[arrSize], i, n; printf("Please input the number of integers:"); /* 打印提示信息 */ scanf("%d", &n); /* 读取字符串长度 */ printf("Please input the integers:"); /* 打印提示信息 */ /* 读取数组元素 */ for(i=0;i<n;i=i+1){ scanf("%d", &a[i]); } /* 进行升序函数调用 */ for(i=0;i<n;i=i+1){ RecurSelectSort(a, n, i); } /* 打印数组元素 */ for(i=0;i<n;i=i+1){ printf("%d ", a[i]); } printf("\n"); /* 换行 */ system("pause"); } void RecurSelectSort(int a[], int n, int i) { int b, max; if(n==1){ if(a[n-1]>a[n]){ max=a[n-1]; a[n-1]=a[n]; a[n]=max; } } else{ if(a[n-2]>a[n-1] && n>2){ b=a[n-1]; a[n-1]=a[n-2]; a[n-2]=b; } RecurSelectSort(a, n-1, i); i=0; } }