汇编语言C51

MCS_51单片机汇编语言程序设计

数据排序
1,用c实现

#define Size 10

unsigned char Array[Size];

void main ()
{
  bit Change;
  unsigned char index;
  unsigned char Temp;

  do {
    Change = 0;
    for (index = 0; index < (Size-1); index++) {
      if (Array[index] > Array[index+1]) {
        Change = 1;
        Temp = Array[index];
        Array[index] = Array[index+1];
        Array[index+1] = Temp;
      }
    }
  } while (Change);
}
2,汇编实现、
Size   equ   10              ; 数据个数
Array  equ   50h             ; 数据起始地址
Change equ   0               ; 交换标志

Sort:
       mov   r0, #Array
       mov   r7, #Size-1
       clr   Change
Goon:
       mov   a, @r0
       mov   r2, a
       inc   r0

       mov   B, @r0
       cjne  a, B, NotEqual
       sjmp  Next
NotEqual:
       jc    Next            ; 前小后大, 不交换

       setb  Change          ; 前大后小, 置交换标志
       xch   a, @r0          ; 交换
       dec   r0
       xch   a, @r0
       inc   r0
Next:
       djnz  r7, Goon
       jb    Change, Sort
       ljmp  $

       end
2,程序跳转表
  用c实现
void Func0() {}
void Func1() {}
void Func2() {}
void Func3() {}

void FuncEnter(unsigned char FuncID)
{
  switch (FuncID) {
    case 0: Func0();  break;
    case 1: Func1();  break;
    case 2: Func2();  break;
    case 3: Func3();  break;
    default:          break;
  }
}

void main()
{
  FuncEnter(0);
  FuncEnter(1);
  FuncEnter(2);
  FuncEnter(3);
  while(1);
}
汇编实现:

       org   0
       ljmp  Start

Func0: mov   a, #0
       ret

Func1: mov   a, #1
       ret

Func2: mov   a, #2
       ret

Func3: mov   a, #3
       ret

FuncEnter:
       add   a, acc          ; ajmp 为二字节指令, 调用号 X 2
       mov   dptr, #FuncTab
       jmp   @a+dptr
FuncTab:
       ajmp  Func0
       ajmp  Func1
       ajmp  Func2
       ajmp  Func3

Start:
       mov   a, #0
       call  FuncEnter
       mov   a, #1
       call  FuncEnter
       mov   a, #2
       call  FuncEnter
       mov   a, #3
       call  FuncEnter
       ljmp  $

       end
3,内存块移动
    
c语言实现  

    xdata unsigned char Buffer1[256] _at_ 0x3000;
    xdata unsigned char Buffer2[256] _at_ 0x4000;
    
    void main()
    {
        unsigned int index;
        unsigned char xdata * ptr1;
        unsigned char xdata * ptr2;

          ptr1 = &Buffer1;
          ptr2 = &Buffer2;
          for (index=0; index <= 255; index++)  
          {
          *ptr2++ = *ptr1++;
          }
      }

汇编语言实现
    ; 移动 3000H --> 4000H, 256 字节

       mov   r0, #30h
       mov   r1, #00h
       mov   r2, #40h
       mov   r3, #00h

       mov   r7, #0
Loop:
       mov   dph, r0
       mov   dpl, r1
       movx  a, @dptr
       mov   dph, r2
       mov   dpl, r3
       movx  @dptr, a

       cjne  r1, #0ffh, Goon1
       inc   r0
Goon1:
       inc   r1

       cjne  r3, #0ffh, Goon2
       inc   r2
Goon2:
       inc   r3
       djnz  r7, Loop

       ljmp  $

       end   
汇编  
 将 A 拆为二个 ASCII 码, 并存入 Result 开始的二个单元

Result equ   20h

       org   0
       ljmp  Start

ASCIITab:
       db    '0123456789ABCDEF'  ; 定义数字对应的ASCII表

BinToHex:
       mov   dptr, #ASCIITab
       mov   b, a            ; 暂存 A

       swap  a
       anl   a, #0fh         ; 取高四位
       movc  a, @a+dptr      ; 查ASCII表
       mov   Result, a

       mov   a, b            ; 恢复 A
       anl   a, #0fh         ; 取低四位
       movc  a, @a+dptr      ; 查ASCII表
       mov   Result+1, a

       ret

Start:
       mov   sp, #40h
       mov   a, #1ah
       call  BinToHex
       ljmp  $

       end
3存储器请零
/ 软件实验一  存储器块清零

xdata unsigned char Buffer[256] _at_ 0x4000;

void main()
{
  unsigned int index;
  unsigned char xdata * ptr;

  ptr = &Buffer;   // 起始地址

  for (index = 0; index <= 255; index++) {
    *ptr++ = 0;    // 清0, 地址加一
  }
}
汇编 实现





bcd码

 将 Number 拆为三个 BCD 码, 并存入 Result 数组

void main()
{
  unsigned char Result[3];
  unsigned char Number;

  Number = 123;

  Result[0] = Number / 100;          // 除以 100, 得百位数
  Result[1] = (Number % 100) / 10;   // 余数除以 10, 得十位数
  Result[2] = Number % 10;           // 余数为个位数

}
汇编  



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超级51单片机 proteus 仿真 例子集合,代码有网上收集而来, PROTEUS 在 MCS-51 上应用实例 PROTEUS 在 MCS-51 应用例子 绝对经典,绝对通过,仿真正常,可用,亲测 单片机仿真例子源码 单片机汇编源码例子 source code for mcs 51 mcu mcs 51 汇编仿真例子集合 proteus 仿真大全, 100多个基于51单片机的汇编语言汇编c51 proteus 仿真例子 mcu simulate 流水灯 仿真 开关灯 仿真 51驱动74ls系列例子 单片机 74ls245 单片机驱动喇叭例子,单片机驱动喇叭或蜂鸣器音乐 单片机播放警告声 单片机驱动蜂鸣器例子 单片机驱动74hc系列例子 51单片机处理按键例子,,4x4按键,16按键处理,按键检测 代码 源码 单片机驱动电子仿真 和 例子 汇编 组合语言 源码 单片机 led 流水灯 例子,仿真,源码 51 单片机 驱动 8x8点阵 仿真 已经源码 单片机 74ls373 单片机 74ls273 单片机按键例子源码 单片机驱动 8255 例子源码 proteus仿真, 51单片机定时器例子, 51单片机 计数器例子 源码 实例,proteus 仿真 单片机驱动数码管,数码管显示数字,显示移动数字 动态数码管数字例子 源码 代码 仿真 电位器 ad转换例子 电位器调节模拟adc adc0808 单片机 事例 源码 以及proteus 例子仿真 单片机做的数字电压表仿真 单片机rs232串行通信 串口通信 例子 源码 代码 以及 仿真。 51单片机 c51 驱动 74ls165 并口转 串行 例子 事例 以及 proteus 仿真 单片机 驱动 74ls164 窜转并 串行 转 并行 例子 汇编源码 汇编代码 以及proteus 仿真 单片机 做的 数码管显示时钟,数字时钟 电子中,无ds1302. proteus 模拟 单片机 eeprom e2prom 例子 c51 单片机 i2c 例子 以及 汇编 组合语言 代码 源码 仿真 模拟 c51 单片机 DC马达 直流电机 驱动 例子 以及 代码 源码 仿真 模拟 c51 单片机 步进马达 步进电机 例子 以及 代码 源码 仿真 模拟 c51 单片机 电子锁 按键锁 例子 以及 代码 源码 仿真 模拟 c51 单片机 计算器 例子 以及 代码 源码 仿真 模拟 c51 单片机 门铃 例子 以及 代码 源码 proteus 仿真 模拟 c51 单片机 定时器 例子 以及 汇编 组合语言 代码 源码 proteus 仿真 模拟 c51 单片机 外部中断 例子 以及 汇编 组合语言 代码 源码 proteus 仿真 模拟 c51 单片机 pwm 脉宽控制 例子 以及 汇编 组合语言 代码 源码 proteus 仿真 模拟

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值