AVR起步教程3:从51到AVR编程篇

发布者:紫菜包饭最新更新时间:2016-04-11 来源: eefocus关键字:AVR  编程 手机看文章 扫描二维码
随时随地手机看文章
本文介绍了51和AVR在汇编编程上的移植

一、DPTR的处理
在51系统中,DPTR是十分重要的,51可以通过DPTR寻址,临时储存16位数据等等,下面仅仅先介绍2种51到AVR程序移植中DPTR的处理:
(1)DPTR直接寻址
    例子: 51程序如下:
         MOV DPTR,#8000H;
         MOVX A,@DPTR;

       这个移植起来就比较简单了,我们现在选用Z寄存器(R30,R31)作为DPTR,这个里不考虑实际地址的偏移,地址设为0x1100对应0x8000
         ldi r30,0x00
         ldi r31,0x11
         ld r24,z
(2)DPTR变址寻址
 类似的,51的变址寻址也是一样的
         MOV DPTR,#8000H
         MOV A,#05H
         MOVX A,@A+DPTR
 AVR中可以移植成:
         ldi r30,0x00
         ldi r31,0x11
         adiw r30,0x05
         ld r24,z
  
(3)DPTR与P2结合
 这种寻址方式在51中也较为常用
         MOV DPTR,#8100H
         MOV P2,#81H
         MOV R0,#10H
         MOVX A,@R0
         INC R0
         MOVX A,@R0
 这种寻址方式的时候,寻址的范围限制在了0x8100到0x81FF之间

    AVR中可以移植如下:
         ldi r31,0x11
         ldi r30,0X10
         lz r24,z
         inc r30
         lz r24,z

二、DA的处理
DA是十进制调整指令,具体的功能是对BCD码加法运算的结果进行有条件的修正,操作依据为:
 若(A)3~0>9∨(AC)=1,则A3~0←(A)3~0+6
 若(A)7~4>9∨(C)=1,则A7~4←(A)7~4+6
 若(A)7~4=9∧(A)3~0>9,则A7~4←(A)7~4+6
举例子来说,如果DA的数字是0A,那么就给这个数字加上0x06,使之成为0x10,现在的0x10就代表了十进制的10了,
 
         #define u08 unsigned char
         u08 A,C
         void DA(void)
         {
                  u08 tmp;
                  tmp = A & 0x0F;
                  if( tmp > 0x09 C & 0x20)
                  A += 0x06;
                  tmp = A & 0xF0;
                  if( tmp > 0x90 C & 0x01)
                  {
                           A += 0x60;
                           asm("sec");
                           C = SREG;
                  }
                   tmp = A & 0xF0;
                  if( tmp == 0x90)
                  {
                           tmp = A & 0x0F;
                           if(tmp>0x09)
                           {
                                    A += 0x60;
                                    asm("sec");
                                    C = SREG;
                           }
                  }
         }
 
 代码中的C就是SREG寄存器中的内容

三、PSW中P的处理
51中,如果A中1的个数为奇数,则P置位,反之则置0。在一些老的程序中,特别是有使用一种模拟老式纸带传输的程序,P就用来检测数据传输的正确于否!
在AVR中,我们可以用3中方式来做:
(1)、查表:
 我们可以把0到255中的数字的做个表,然后去查表确定A中的数字1的P值,显然,不管做偶数表或者奇数的表,内存的消耗和时钟的消耗是难以让人忍受的
(2)、数数:
 既然查表在大多时候不可取,那么让我们来数数,我们把A拆分开来,一位一位去数
 我们还是嵌入汇编去解决

          #define u08 unsigned char
         u08 A,B;

         u08 CalcP(void)
         {
                   asm volatile 
                  (
                           "mov %0,%2" "nt" //保存A
                           "clc" "nt"  //清C标志
                           "eor r1,r1" "nt"
                           "mov %1,r1" "nt"
  
                           "lsr %0" "nt" 
                            "adc %1,r1" "nt" //算了第一位

                            "lsr %0" "nt"
                           "adc %1,r1" "nt" //算了第二位

                           "lsr %0" "nt"
                            "adc %1,r1" "nt" //算了第三位

                            "lsr %0" "nt"
                            "adc %1,r1" "nt" //算了第四位 

                            "lsr %0" "nt"
                           "adc %1,r1" "nt" //算了第五位

                            "lsr %0" "nt" 
                           "adc %1,r1" "nt" //算了第六位

                           "lsr %0" "nt"
                            "adc %1,r1" "nt" //算了第七位

                           "lsr %0" "nt" 
                           "adc %1,r1" "nt" //算了第八位

                           "andi %1,0x01" "nt" //tmp &= 0x01
                            : "=d" (B),"=d" (tmp),"=d" (A)
                           : "0" (B),"1" (tmp),"2" (A)
                  );
                  return tmp;
         }
 
 这个方法中,我们加上return共花了22条指令,比起查表而言,已经是省了很多时钟和内存单元了。

(3)、算法:
 还有比数数还精简的代码吗?当然有,虽然精简的不多:)
我们知道,异或的法则是11为0,00为,10和01为1,这个方法的算法就是使用了异或来做的的,我们以0xA1这个数来做例子

          #define u08 unsigned char

         u08 AvrCalcP(u08 Data)
          {
                  u08 tmp1,tmp2;
 
                  asm volatile 
                  (
                           "mov %1,%0""nt"         //tmp1 = 0xA1  1010 0001
                           "swap %1""nt"             //tmp1 = 0x1A  0001 1010
                          "eor %1,%0""nt"           //tmp1 = 0xBB  1011 1011 
                          "andi %1,0x0f""nt"        //tmp1 = 0x0B  0000 1011
                          "mov %2,%1""nt"         //tmp2 = 0x0B
                           "andi %2,0x03""nt"     //tmp2 = 0x03  0000 0011
                          "lsl %1""nt"  
                           "lsl %1""nt"                  //tmp1 = 0x02  0000 0010
                          "eor %1,%2""nt"           //tmp1 = 0x01  0000 0001
                          "mov %2,%1""nt"         //tmp2 = 0x01
                          "andi %2,0x01 ""nt"     //tmp2 = 0x01  0000 0001
                          "lsl %1""nt"                   //tmp1 = 0x00  0000 0000
                          "eor %1,%2 ""nt"          //tmp1 = 0x00  0000 0001
                          "andi %1,0x0f""nt"       //tmp1 = 0x01 
                          : "=d" (Data),"=d" (tmp1),"=d" (tmp2)
                          : "0" (Data),"1" (tmp1),"2" (tmp2)
                  );
                    return tmp1;
           

 这个方法中,我们加上return共花了15条指令,比方法2来讲,又省了7条指令。


关键字:AVR  编程 引用地址:AVR起步教程3:从51到AVR编程篇

上一篇:基于ATmegal28的电机控制系统设计
下一篇:AVR驱动3.2英寸tft LCD(ssd1289)

推荐阅读最新更新时间:2024-03-16 14:49

51单片机的一些有趣的实验程序
/************************************************************************************** * LED闪烁实验 * 实现现象:下载程序后D1指示灯闪烁 注意事项:无 ***************************************************************************************/ #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定
[单片机]
电力线MAC/PHY集成收发器INT51X1及其应用
摘要:介绍了美国Inellon公司的电力线MAC/PHY集成收发器INT51X1的功能结构和主要特点,介绍了它的引脚功能,同时以中压配电网PFDM通信系统的研究开发为例,给出了INT51XI的应用实例。 关键词:电力线通信;集成收发器;INT51X1;正交频分复用 电力线通信PLC(Power Line Communication)技术是利用配电网中/低压线路传输高速数据、话音、图象等多媒体业务信号的一种通信技术,目的是通过低压线路来为用户提供一种“无新线(No new wire)”的宽带接入方案;而用中压线路来为配电网自动化提供一个可靠的数据传输平台。由于该技术的发展前景十分看好,因此,早在20世纪90年代初,一些国家即开
[应用]
关于51单片机使用printf串口调试
在51系列单片机上面使用串口的时候,有时候为了方便调试看一下输出结果,会用到printf函数输出到电脑终端,再用串口助手显示。但是单片机使用printf的时候有一点需要注意的地方。 1、首先添加头文件#include stdio.h ,因为printf在这个里面 2、然后配置串口,但是在串口初始化的时候需要吧 TI = 1;否则无法发送。因为printf函数会调用putchar函数,而putchar函数会判断 TI ,不为 1 则等待,相当于死机,为 1 则清零。 3、也可以使用接受中断,但是中断里面不要再有 TI = 1;这句,否则无法发送。 就这三点,然后就可以很方便的使用printf输出了。 但是方便归方便,这个只
[单片机]
关于<font color='red'>51</font>单片机使用printf串口调试
35-基于51单片机的商用电子计价秤设计
具体实现功能 具体功能: (1)通电源时,数字电子秤进入欢迎界面“欢迎使用电子秤 设计••••••”; (2)当载物台上放有物体时,ADC0832立即将数据转换发送给单片机处理,并由LCD液晶显示屏显示; (3)当用按键输入对应商品的代码编号,在LCD上可以看到相应商品的名称,单价,总重,总价格等信息; (4)在称量的过程中,一旦物体自身的重量超出电子秤的称量范围,蜂鸣器立即会发出“滴滴••••”警报声告诉工作人员,所称量物品超重(测量范围0—9.99KG)。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可
[单片机]
35-基于<font color='red'>51</font>单片机的商用电子计价秤设计
三星量产512GB闪存,Galaxy S9容量有望翻倍
   三星 宣布512GB 闪存 已进入量产,意谓着明年Galaxy S9与Galaxy Note 9等新旗舰机储存容量有望从当前最大256GB翻倍成长。下面就随网络通信小编一起来了解一下相关内容吧。   512GB 闪存 主要因应4K超高分辨率影片的录制需求增加,据 三星 表示,新内存芯片可容纳130个10分钟4K短片。 (日经新闻)    三星 从2015年开发出128GB内存以来,已连续三年将内存逐年倍增,成功将3D 64层 闪存 商业化。 展望未来,三星将再推出96层3D堆栈闪存。   目前iPad Pro、微软Surface平板均有提供512GB机种,不过三星同容量的新芯片体积缩小至与256GB同大小,且访问速度更快。
[网络通信]
P系列14um,单输出,512,1024,2048单元行扫描光电二极管阵列图像传感器(RL0512P、RL1024P、RL2048P)
光电二极管(Photo-Diode)和普通二极管一样,也是由一个PN结组成的半导体器件,也具有单方向导电特性。但在电路中它不是作整流元件,而是把光信号转换成电信号的光电传感器件。
[模拟电子]
编程序控制器系统的抗干扰及措施
可编程控制器(以下称PLC)是一种用于工业生产自动化控制的设备。尽管其制造厂采取了一些措施,使得它的可靠性较高,但还有许多外部因素也会使它产生干扰,造成程序误变或运算错误,从而产生误输入井引起误输出,这将会造成设备的失控和误动作。要提高PLC控制系统可靠性,一方面要求PLC生产厂家用提高设备的抗干扰能力;另一方面,要求工程设计、安装施工和使用维护中引起高度重视,多方配合才能完善解决问题,有效地增强系统的抗干扰性能。随着PLC应用的日渐广泛,其抗干扰问题也显得日益重要。本文就此问题提出一些抗干扰的措施。 一、控制系统中干扰及其来源 1、干扰源及一般分类 影响PLC控制系统的干扰源与一般影响工业控制设备的干扰源一样,大都产生在电流或电压
[嵌入式]
基于C8051单片机和FPGA实现导纳测量仪的系统设计
虚拟仪器的广泛应用,使得用户可以根据需求,设计自己的仪器系统。无源网络导纳测量仪即是虚拟仪器设计思想的一种具体运用,旨在实现对端口网络的导纳进行自动测量。测量仪是以C8051单片机为控制和处理核心,采用可编程逻辑器件EPF10K10,根据DDS原理产生信号源,将信号源连接到待测的网络上,对网络两端的电压和电流进行差分放大,使其输出电压尽可能达到ADC的最大输入电压,然后进行A/D采样,采样时,频率随信号频率而改变,一个周期内固定采32个点,用单片机的P1、P2直接接收数据,边采样边接收。对采样所得的电流、电压数据进行快速傅立叶变换(FFT),并分别求出其模值和相位,则导纳的模值为电流模值与电压模值之比,相位为电流与电压的相位之差。
[单片机]
基于C80<font color='red'>51</font>单片机和FPGA实现导纳测量仪的系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved