单片机的查表程序
单片机实验指导书

μVision2 支持所有的Keil 80C51 的工具软件,包括C51 编译器、宏汇编器、链接器/定位器、软硬件调试器和目标文件到HEX 格式文件转换器等,μVision2 可以自动完成编译、汇编、链接程序等操作。
μVision2 具有强大的软件环境、友好的操作界面和简单快捷的操作方法。
双击桌面上的Keil μVision2 快捷图标,可以进入如图1-1 所示的集成开发调试环境,各种调试工具、命令菜单都集成在此开发环境中。
菜单栏提供了各种操作菜单,如编辑器操作、工程维护、程序调试、窗体选择以及操作帮助等。
工具栏按钮和快捷键可以快速执行μVision2命令。
常用的菜单栏及相对应的工具栏按钮与快捷键介绍如表1-1~表1-6所列。
图1-1μVision2 集成环境界面表1-1 文件菜单和文件命令(File)表1-2 编辑菜单和编辑器命令(Edit)表1-3视图菜单(View)表1-4工程菜单和工程命令(Project)表1-5 调试菜单和调试命令(Debug)表1-6外围器件菜单(Peripheral)第2章单片机原理实验通过本章的实验,旨在使学生掌握Keil C51 的操作方法,学习80C51 的指令系统及汇编语言的程序设计方法。
2.1系统认识实验2.1.1实验目的1. 学习Keil C51 集成开发环境的操作;2. 熟悉TD-51 系统板的结构及使用。
2.1.2实验设备PC机一台2.1.3实验内容编写实验程序,将00H~0FH共16个数写入单片机内部RAM的30H~3FH空间。
通过本实验,学生需要掌握Keil C51软件的基本操作,便于后面的学习。
2.1.4实验步骤1. 创建Keil C51 应用程序在Keil C51 集成开发环境下使用工程的方法来管理文件,所有的源文件、头文件甚至说明性文档都可以放在工程项目文件里统一管理。
下面创建一个新的工程文件C51.Uv2,以此详细介绍如何创建一个Keil C51 应用程序。
MCS51单片机指令系统

第一条指令为远查表指令,可以在64K的程序存储器空间寻 址。基地址寄存器为DPTR,其意思为,DPTR里面存放的是 程序存储器中数据表格的首地址,A为数据地址的偏移量。
这条指令执行以后,以 (A)+(DPTR)的数值为地址数 据就送进A里面来了,也就是从表格首地址开始以后的第(A) 个数据被送进A了。(举例子说明)
编写好的程序都放在程序存储器中,由于一个存储地址所 指示的存储单元只能存放一字节的数据。所以,在存放指令时, 必须将指令拆分成一个一个字节进行连续存放。
比如: 实现“累加器加10H”这条指令,其机器语言为 0111010000010000, 占用了两个字节,就必须拆成两个字节 进行连续存储。
但是,用二进制来表示比较麻烦,因此,也常用十六进制来 表示如:74H 10H来表示以上这条机器语言。可见,用十六进 制表示指令比较简单,但是,指令系统有上百条指令,不易记 住。所以,一般采用容易记住的一些缩写符号来表示机器语言,
2. 在指令中直接给出操作数的地址, 这种寻址方式就属
于直接寻址方式。在这种方式中, 指令的操作数部分直接 是操作数的地址。
比如:MOV A,30H;将30H里面的数送到A里面 MOV 21H,30H;将30H里面的数存放到21H里面 在MCS -51 单片机指令系统中, 直接寻址方式中可
以访问 3 种存储器空间: (1) 内部数据存储器的低 128 个字节单元(00H~
7. 位寻址 指按照位进行的寻址操作,(前面讲的都是按字节进
行的寻址操作)。该种寻址方式中, 操作数是内部RAM单元 中20H到2FH的128个位地址以及SFR中的11个可进行 位寻址的寄存器中的位地址寻址。
比如:MOV C,20H;就是将RAM中位寻址区中20H位地 址中的内容送给C。区别与MOV A,20H;这个是将内部 RAM中20H单元的内容送给A。
Holtek(合泰)单片机指令介绍

影响标志:Z
INCA [m]
指令说明:
RAM
[m]+1
ALU Shifter
ACC
影响标志:Z
减1指令
DEC [m]
指令说明:
RAM
[m]-1
ALU Shifter
影响标志:Z
DECA [m]
指令说明:
RAM
[m]-1
ALU Shifter
ACC
影响标志:Z
…
……
〈例〉
RAM
辑单元) – STATUS (Status register 状态寄存器) – STACK (Stack register 堆栈寄存器)
MCU概述 指令系统概述 HOLTEK指令系统
指令系统概述
分类 寻址方式 指令周期 状态寄存器 指令中的常用符号
分类
HOLTEK8位系列单片机共有63条功能强大的 汇编指令。这些指令按功能可分为以下七类。
RRC [m]
指令说明:
RAM
STATUS
ALU Shifter
MSB
LSB
76543210 C
D7 D6 D5 D4 D3 D2 D1 D0 C
76543210 C C D7 D6 D5 D4 D3 D2 D1 D0
影响标志:C
RRCA [m]
指令说明:
RAM
STATUS
ALU Shifter
影响标志:Z
ORM A,[m]
指令说明:
RAM
ALU ACC“OR”[m] Shifter
ACC
影响标志:Z
OR A,X
指令说明:
ROM
ALU Shifter
ACC“OR”X
FFT算法(查表法)

ARM或单片机用的FFT算法,用于信号处理。
经过愚昧的本人优化,提高了计算效率(在aduc7026 @41MHz FFT256点环境下运算时间为0.06s左右)PS:以下有两部分(fft.h和fft.c)【复制以下内容改名为fft.h】#ifndef __FFT_H__#define __FFT_H__#include<math.h>#ifdef FFT_GLOBALS#define FFT_EXT#else#define FFT_EXT extern#endif#define PI 3.1415926#define FFT_POINT 8 //设置点数(此值变,下面的也要变)(0~11)#define SAMPLE_NUM 256 //可设256或512两种数//count[n]//count[]={1,2,4,8,16,32,64,128,256,512,1024,2048}FFT_EXT float dataR[SAMPLE_NUM];FFT_EXT float dataI[SAMPLE_NUM];FFT_EXT void SetData(float data,unsigned int i); //采集数据到第i个点(0~SAMPLE_NUM)FFT_EXT void FFT(void);//采样来的数据放在dataR[ ]数组中//***************FFT结果数值处理*******************************************************//计算和返回峰(模)值,k表示第几个值(0~SAMPLE_NUM-1),type为0返回峰值,1返回模值,2返回有效值FFT_EXT float GetPeak(unsigned int k,unsigned int type);//FFT_EXT float GetPhase(unsigned int k,unsigned int type); //计算和返回相位,k同上//type为0返回角度,1返回弧度//speed为采样速率,返回第k(0~SAMPLE_NUM)个点代表的频率FFT_EXT float GetStepF(float speed,unsigned int k);FFT_EXT float GetPower1(unsigned int k); //返回功率谱的第k点FFT_EXT float GetPower2(unsigned int k,float total); // 返回k点所占的功率百分比(单位是%) total为总功率FFT_EXT float GetTotalPower(void); //计算功率谱总和FFT_EXT float GetTHD(void); //计算失真度#endif///////////////////////////////////////////////////////////////////////////////【复制以下内容改名为fft.c】//查表式FFT算法#define FFT_GLOBALS#include "fft.h"#if SAMPLE_NUM==256const float sin_tab[256]={0.000000,0.024541,0.049068,0.073565,0.098017,0.122411,0.146730,0.170962,0.1 95090,0.219101,0.242980,0.266713,0.290285,0.313682,0.336890,0.359895,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998,0.555570,0.575808,0.5 95699,0.615232,0.634393,0.653173,0.671559,0.689541,0.707107,0.724247,0.740951,0.757209,0.773010,0.788346,0.803208,0.817585,0.831470,0.844854,0.8 57729,0.870087,0.881921,0.893224,0.903989,0.914210,0.923880,0.932993,0.941544,0.949528,0.956940,0.963776,0.970031,0.975702,0.980785,0.985278,0.9 89177,0.992480,0.995185,0.997290,0.998795,0.999699,1.000000,0.999699,0.998795,0.997290,0.995185,0.992480,0.989177,0.985278,0.980785,0.975702,0.9 70031,0.963776,0.956940,0.949528,0.941544,0.932993,0.923880,0.914210,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854,0.831470,0.817585,0. 803208,0.788346,0.773010,0.757209,0.740951,0.724247,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808,0.555570,0.534998,0. 514103,0.492898,0.471397,0.449611,0.427555,0.405241,0.382683,0.359895,0.336890,0.313682,0.290285,0.266713,0.242980,0.219101,0.195090,0.170962,0. 146730,0.122411,0.098017,0.073565,0.049068,0.024541,0.000000,-0.024541,-0.049068,-0.073565,-0.098017,-0.122411,-0.146730,-0.170962,-0.195090,-0.219 101,-0.242980,-0.266713,-0.290285,-0.313682,-0.336890,-0.359895,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998,-0.555570,-0.575 808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541,-0.707107,-0.724247,-0.740951,-0.757209,-0.773010,-0.788346,-0.803208,-0.817585,-0.831470,-0.844 854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.914210,-0.923880,-0.932993,-0.941544,-0.949528,-0.956940,-0.963776,-0.970031,-0.975702,-0.980785,-0.985 278,-0.989177,-0.992480,-0.995185,-0.997290,-0.998795,-0.999699,-1.000000,-0.999699,-0.998795,-0.997290,-0.995185,-0.992480,-0.989177,-0.985278,-0.980785,-0.975 702,-0.970031,-0.963776,-0.956940,-0.949528,-0.941544,-0.932993,-0.923880,-0.914210,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854,-0.831470,-0.817 585,-0.803208,-0.788346,-0.773010,-0.757209,-0.740951,-0.724247,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808,-0.555570,-0.534 998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241,-0.382683,-0.359895,-0.336890,-0.313682,-0.290285,-0.266713,-0.242980,-0.219101,-0.195090,-0.170 962,-0.146730,-0.122411,-0.098017,-0.073565,-0.049068,-0.024541};#endif#if SAMPLE_NUM==512const float sin_tab[512]={0.000000,0.012272,0.024541,0.036807,0.049068,0.061321,0.073565,0.085797,0.0 98017,0.110222,0.122411,0.134581,0.146730,0.158858,0.170962,0.183040,0.195090,0.207111, 0.219101,0.231058,0.242980,0.254866,0.266713,0.278520,0.290285,0.302006,0.313682,0.3253 10,0.336890,0.348419,0.359895,0.371317,0.382683,0.393992,0.405241,0.416430,0.427555,0.438616,0.449611,0.460539,0.471397,0.482184,0. 492898,0.503538,0.514103,0.524590,0.534998,0.545325,0.555570,0.565732,0.575808,0.585798 ,0.595699,0.605511,0.615232,0.624859,0.634393,0.643832,0.653173,0.662416,0.671559,0.6806 01,0.689541,0.698376,0.707107,0.715731,0.724247,0.732654,0.740951,0.749136,0.757209,0.765167,0.773010,0.780737,0.7 88346,0.795837,0.803208,0.810457,0.817585,0.824589,0.831470,0.838225,0.844854,0.851355, 0.857729,0.863973,0.870087,0.876070,0.881921,0.887640,0.893224,0.898674,0.903989,0.90916 8,0.914210,0.919114,0.923880,0.928506,0.932993,0.937339,0.941544,0.945607,0.949528,0.953306,0.956940,0.960431,0. 963776,0.966976,0.970031,0.972940,0.975702,0.978317,0.980785,0.983105,0.985278,0.987301, 0.989177,0.990903,0.992480,0.993907,0.995185,0.996313,0.997290,0.998118,0.998795,0.9993 22,0.999699,0.999925,1.000000,0.999925,0.999699,0.999322,0.998795,0.998118,0.997290,0.996313,0.995185,0.993907,0. 992480,0.990903,0.989177,0.987301,0.985278,0.983105,0.980785,0.978317,0.975702,0.972940, 0.970031,0.966976,0.963776,0.960431,0.956940,0.953306,0.949528,0.945607,0.941544,0.9373 39,0.932993,0.928506,0.923880,0.919114,0.914210,0.909168,0.903989,0.898674,0.893224,0.887640,0.881921,0.876070,0.8 70087,0.863973,0.857729,0.851355,0.844854,0.838225,0.831470,0.824589,0.817585,0.810457, 0.803208,0.795837,0.788346,0.780737,0.773010,0.765167,0.757209,0.749136,0.740951,0.732654,0.724247,0.715731,0.707107,0.698376,0.689541,0.680601,0.671559,0.662416,0.653173,0.643832,0.634393,0.624859,0. 615232,0.605511,0.595699,0.585798,0.575808,0.565732,0.555570,0.545325,0.534998,0.524590 ,0.514103,0.503538,0.492898,0.482184,0.471397,0.460539,0.449611,0.438616,0.427555,0.4164 30,0.405241,0.393992,0.382683,0.371317,0.359895,0.348419,0.336890,0.325310,0.313682,0.302006,0.290285,0.278520,0. 266713,0.254866,0.242980,0.231058,0.219101,0.207111,0.195090,0.183040,0.170962,0.158858 ,0.146730,0.134581,0.122411,0.110222,0.098017,0.085797,0.073565,0.061321,0.049068,0.0368 07,0.024541,0.012272,0.000000,-0.012272,-0.024541,-0.036807,-0.049068,-0.061321,-0.073565,-0.085797,-0.098017,-0.110 222,-0.122411,-0.134581,-0.146730,-0.158858,-0.170962,-0.183040,-0.195090,-0.207111,-0.219 101,-0.231058,-0.242980,-0.254866,-0.266713,-0.278520,-0.290285,-0.302006,-0.313682,-0.325 310,-0.336890,-0.348419,-0.359895,-0.371317,-0.382683,-0.393992,-0.405241,-0.416430,-0.427555,-0.438616,-0.449611,-0.460539,-0.471397,-0.482 184,-0.492898,-0.503538,-0.514103,-0.524590,-0.534998,-0.545325,-0.555570,-0.565732,-0.575 808,-0.585798,-0.595699,-0.605511,-0.615232,-0.624859,-0.634393,-0.643832,-0.653173,-0.662 416,-0.671559,-0.680601,-0.689541,-0.698376,-0.707107,-0.715731,-0.724247,-0.732654,-0.740951,-0.749136,-0.757209,-0.765167,-0.773010,-0.780 737,-0.788346,-0.795837,-0.803208,-0.810457,-0.817585,-0.824589,-0.831470,-0.838225,-0.844 854,-0.851355,-0.857729,-0.863973,-0.870087,-0.876070,-0.881921,-0.887640,-0.893224,-0.8986 74,-0.903989,-0.909168,-0.914210,-0.919114,-0.923880,-0.928506,-0.932993,-0.937339,-0.941544,-0.945607,-0.949528,-0.953306,-0.956940,-0.960 431,-0.963776,-0.966976,-0.970031,-0.972940,-0.975702,-0.978317,-0.980785,-0.983105,-0.9852 78,-0.987301,-0.989177,-0.990903,-0.992480,-0.993907,-0.995185,-0.996313,-0.997290,-0.9981 18,-0.998795,-0.999322,-0.999699,-0.999925,-1.000000,-0.999925,-0.999699,-0.999322,-0.998795,-0.998118,-0.997290,-0.996313,-0.995185,-0.993 907,-0.992480,-0.990903,-0.989177,-0.987301,-0.985278,-0.983105,-0.980785,-0.978317,-0.9757 02,-0.972940,-0.970031,-0.966976,-0.963776,-0.960431,-0.956940,-0.953306,-0.949528,-0.94560 7,-0.941544,-0.937339,-0.932993,-0.928506,-0.923880,-0.919114,-0.914210,-0.909168,-0.903989,-0.898674,-0.893224,-0.887640,-0.881921,-0.876 070,-0.870087,-0.863973,-0.857729,-0.851355,-0.844854,-0.838225,-0.831470,-0.824589,-0.8175 85,-0.810457,-0.803208,-0.795837,-0.788346,-0.780737,-0.773010,-0.765167,-0.757209,-0.74913 6,-0.740951,-0.732654,-0.724247,-0.715731,-0.707107,-0.698376,-0.689541,-0.680601,-0.671559,-0.662416,-0.653173,-0.643832,-0.634393,-0.624 859,-0.615232,-0.605511,-0.595699,-0.585798,-0.575808,-0.565732,-0.555570,-0.545325,-0.534998,-0.524590,-0.514103,-0.503538,-0.492898,-0.482184,-0.471397,-0.460539,-0.449611,-0.4386 16,-0.427555,-0.416430,-0.405241,-0.393992,-0.382683,-0.371317,-0.359895,-0.348419,-0.336890,-0.325310,-0.313682,-0.302006,-0.290285,-0.278 520,-0.266713,-0.254866,-0.242980,-0.231058,-0.219101,-0.207111,-0.195090,-0.183040,-0.170 962,-0.158858,-0.146730,-0.134581,-0.122411,-0.110222,-0.098017,-0.085797,-0.073565,-0.061 321,-0.049068,-0.036807,-0.024541,-0.012272};#endifvoid SetData(float data,unsigned int i){dataR[i]=data;}/* 采样来的数据放在dataR[ ]数组中,运算前dataI[ ]数组初始化为0 */void FFT(void){const int count[]={1,2,4,8,16,32,64,128,256,512,1024,2048};int i,xx,n;int L,j,k,b;float TR,TI,temp,Tsin,Tcos;//,p;long m;int x[11]={0};n=FFT_POINT;/********** following code invert sequence ************/for(i=0;i<count[n];i++){xx=0;for(j=0;j<n;j++) {x[j]=0;}for(j=0;j<n;j++) {x[j]=(i/count[j])&0x01;}for(j=0;j<n;j++) {xx=xx+x[j]*count[n-j-1];}dataI[xx]=dataR[i];}for(i=0;i<count[n];i++){dataR[i]=dataI[i];dataI[i]=0;}/************** following code FFT *******************/for(L=1;L<=n;L++) /* for(1) */{b=1; // i=L-1;b<<=(L-1); //整型2的n次方简化运算(加快计算速度)m=SAMPLE_NUM/count[L];for(j=0;j<=b-1;j++) /* for (2) */{Tsin=sin_tab[(m*j)%SAMPLE_NUM];Tcos=sin_tab[(m*j+SAMPLE_NUM/4)%SAMPLE_NUM];for(k=j;k<count[n];k=k+2*b) /* for (3) */{TR=dataR[k];TI=dataI[k];temp=dataR[k+b];dataR[k] = dataR[k]+dataR[k+b]*Tcos+dataI[k+b]*Tsin;dataI[k] = dataI[k]-dataR[k+b]*Tsin+dataI[k+b]*Tcos;dataR[k+b] = TR-dataR[k+b]*Tcos-dataI[k+b]*Tsin;dataI[k+b] = TI+temp*Tsin-dataI[k+b]*Tcos;} /* END for (3) */} /* END for (2) */} /* END for (1) */}/**********************FFT数值计算处理(可自行增删)**********************/float GetPeak(unsigned int k,unsigned int type) //计算峰(模,有效)值{float result;result=sqrt(dataR[k]*dataR[k]+dataI[k]*dataI[k]);switch(type){case 1:return result;case 0:case 2:if(k==0) result=result/SAMPLE_NUM;else result=result/(SAMPLE_NUM/2);if(type==2) result=result/1.41421356; //峰值除以根号2return result;default:return result;}}float GetPower1(unsigned int k) //返回功率谱的一点{float temp;temp=GetPeak(k,2);temp*=temp;return temp;}float GetPower2(unsigned int k,float total) //返回比例{float temp;temp=GetPeak(k,2);temp*=temp;return 100.0*temp/total;}float GetTotalPower(void){unsigned int i;float total=0;for(i=0;i<SAMPLE_NUM/2;i++){total+=GetPower1(i);}return total;}/*float GetPhase(unsigned int k,unsigned int type) //计算相位{if(type) return atan2(dataI[k],dataR[k]);else return(180.0*atan2(dataI[k],dataR[k])/PI);}*/float GetStepF(float speed,unsigned int k){return k*speed/(SAMPLE_NUM*1.0);}float GetTHD(void) //计算失真度{float total,temp1=0,temp2=0;unsigned int i,n=0;total=GetTotalPower();for(i=0;i<(SAMPLE_NUM/2);i++){temp2=GetPeak(i,2);if(temp2>temp1) {temp1=temp2;n=i;}}temp1=GetPower1(n);temp2=sqrt((total-temp1)/temp1);return temp2;}。
单片机汇编语言指令查表

目录表1 寻址方式与相应的寻址空间 (2)1.1数据传送指令MOV (2)1.2程序存储器取数据指令MOVX,MOVC (3)1.3 数据交换指令XCH,XCHD,SWAP (3)1.4 逻辑运算指令ANL,ORL(按位进行) (4)续表1.4 逻辑运算指令XRL CLR CPL RL RLC RR RRC(按位进行) (5)1.5 控制转移指令LJMP AJMP SJMP JMP JZ JNZ CJNE (6)续表1.5 控制转移指令DJNZ LCALL ACALL RET RETI NOP (7)1.6 布尔处理(位操作)指令CLR SETB CPL ANL ORL (8)续表1.6 布尔处理(位操作)指令JC JNC JB JNB JBC (9)1.7堆栈操作指令PUSH POP (10)2.MCS-51系列单片机算术运算指令表ADD ADDC SUBB INC DEC MUL DIV DA (10)表1 寻址方式与相应的寻址空间1.1数据传送指令MOV方式 利用的变量 使用的空间寄存器 R0∽R7,A ,B ,CY ,DPTR直接寻址 direct片内RAM 低128字节特殊功能寄存器SFR寄存器间址 @Ro ,@R1 SP @R0,@R1,@DPTR片内RAM 片外RAM立即数 #data程序存储器 基址加变址 @A+PC @A+DPTR程序存储器 相对寻址 PC+rel程序存储器位寻址bit片内RAM 的20H ∽2FH 部分SFR目的操作数汇编指令机器码功能字节数 机器周期A 累加器 立即数送AMOV A ,#data 74H data data 传至A 2 1 内部RAM 或SFR 内容送AMOV A ,direct E5H direct(direct)传至A2 1 寄存器内容送AMOV A ,Rn (n=0∽7) E8H ∽EFH 11101rrr (Rn)传至A 1 1 内部RAM 内容送A MOV A ,@Ri (i=0,1) 1110011i((Ri))传至A 1 1 Direct内部RAM 或SFR立即数送内部RAM 或SFR MOV direct ,#data 75H direct data data 传至direct 3 2 内部RAM 和SFR 直接直接传送 MOV direct ,direct 85H direct direct (direct)传至direct 3 2 累加器内容送内部RAM 或SFR MOV direct ,AF5H direct(A)传至direct 2 1 寄存器内容送内部RAM 或SFR MOV direct ,Rn (n=0∽7) 10001rrr direct (Rn)传至direct 2 2 内部RAM 内容送内部RAM 或SFRMOV direct ,@Ri (i=0,1) 1000011i direct ((Ri))传至direct 2 2 Rn 寄存器立即数送寄存器 MOV Rn,#data (n=0∽7) 01111rrr data data 传至Rn 2 1 内部RAM 或SFR 内容送寄存器MOV Rn,direct (n=0∽7) 10101rrr direct (direct)传至Rn 2 2 累加器内容送寄存器MOV Rn,A (n=0∽7) 11111rrr (A)传至Rn 1 2 @Ri 内部RAM立即数送内部RAMMOV @Ri,#data (i=0,1) 0111011i data data 传至(Ri) 2 1 内部RAM 或SFR 内容送内部RAMMOV @Ri,direct (i=0,1) 1010011i direct (direct)传至(Ri) 2 2 累加器内容送内部RAM MOV @Ri,A (i=0,1) 1111011i(A)传至(Ri) 1 1 DPTR 16位立即数传送指令MOV DPTR,#data1690H dataH dataLdata16传至DPTR321.2程序存储器取数据指令MOVX ,MOVC1.3 数据交换指令XCH ,XCHD ,SWAP目的操作数汇编指令机器码功能字节数 机器周期A 外部数据存储器内容送A MOVX A ,@Ri (i=0,1) E2H E3H ((Ri))传至A 1 2 A 外部数据存储器内容送A MOVX A ,@DPTR E0H ((DPTR))传至A 1 2 @Ri 累加器内容送外部数据存储器 MOVX @Ri,A (i=0,1) F2H ,F3H A 传至(Ri) 1 2 DPTR 累加器内容送外部数据存储器 MOVX @DPTR,A F0H A 传至(DPTR) 1 2 A 以PC 为基址寄存器加变址寻址 MOVC A,@A+PC 83H ((A)+(PC))传至A 1 2 A以DPTR 为基址寄存器加变址寻址MOVC A,@A+DPTR93H((A)+(DPTR))传至A12目的操作数指令机器码 功能字节数 机器周期 A 内部RAM 或SFR 内容与累加器内容互换 XCH A,directC5H direct (A)←(direct) 2 1 A 寄存器内容与累加器内容互换 XCH A,Rn (n=1-7) 11001rrr (A)←(Rn) 1 1 A 内部RAM 内容与累加器内容互换XCH A,@Ri (i=0,1) 1100011i (A)←((Ri))1 1 A 内部RAM 低4位内容与累加器低4位内容互换XCHD A,@Ri (i=0,1) 1101011i (A)0∽3←((Ri))0∽3 1 1 A累加器高4位与低4位交换SWAP AC4H(A)0∽3←(A)4∽7111.4 逻辑运算指令ANL,ORL(按位进行)目的操作数指令机器码功能字节数机器周期逻辑与ANLA内容∧立即数ANL A ,#data54H A←(A)∧#data 2 1 A内容∧内部RAM或SFR当direct为端口地址P0∽P3时,操作数由端口锁存器读入。
第4章 单片机汇编语言程序设计

RO 20HBCMDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21 0011
;完成转换 @R0 ;存数
H22HB0C001D0HBCD 01000L
END
回目录 上页 下页
方法1小结:
以上程序用了8条指令,15个内存字节,执行时间为9个 机器周期。
21 0011BCDH H22H0011BCDL
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B00C01D01H0BB0CC0D0DHL
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
例4-7:设30H单元存放的是一元二次方程ax2+bx+c = 0
根的判别式△= b2 – 4ac的值。
试根据30H单元的值,编写程序,
判断方程根的三种情况。
在31H中存放“0”代表无实根,
存放“1”代表有相同的实根,
存放“2”代表两个不同的实根。
解:△为有符号数,有三种情况,这是一多重分支程序
即小于零,等于零、大于零。
R3
R2
回目录 上页 下页
程序:
ORG 1000H CLR C CLR A SUBB A, R0 MOV R2, A CLR A
SUBB A, R1 MOV R3 , A SJMP $ END
;CY 0
;A 0
;低字节求补
;送R2
;A清零 R3 0000
;高字节求补 0000
单片机程序

1、编程将片内 RAM30H 单元开始的15 B 的数据传递到片外 RAM3000H 开始的单元中去。
解: STRAT: MOV R0,#30HMOV R7,#0FHMOV DPTR,#3000HLOOP: MOV A,@R0MOVX@DPTR,AINC R0INC DPTRDJNZ R7,LOOP3、将内部 RAM 40H 开始的 10 个字节的数搬到外面RAM 2000H 处MOV DPTR,#2000HMOV R0,#40HMOV R2,#0AHLOOP:MOV A,@R0MOVX @DPTR,AINC R0INC DPTRDJNZ R2,LOOPSJMP$ENDRET2 、编程将片内 RAM 40H 单元中的内容送到片外RAM2000H 单元中。
解:ORG0100HMOV A, 40HMOV DPTR, #2000HMOVX @DPTR, AEND4、将存于外面 RAM 8000H 开始的 50H 数据传递 0010H 的地区,请编程实现。
MOV DPTR, #8000HMOV R0,#10HMOV R2,#50HLOOP: MOVX A, @DPTR;取数MOVX @R0,A;存数1NC DPTR1NC R0DJNZ R2, LOOPRET5.片内 RAM40H 开始的单元内有10B 二进制数,编程找出此中最大值并存于50H 单元中.解START: MOV R0,#40H;数据块首地点送 R0MOV R7,#09H;比较次数送R7MOV A,@R0;取数送ALOOP:INC R0MOV30H,@R0;取数送30 HCJNE A,30H,NEHT;( A)与( 30H)对比NEXT:JNC BIE1(A)≥ (30H)转 BIR1MOV A,30H;(A)< (30H),大数送 ABIE1:DJNZ R7,LOOP;比较次数减 1,不为 0,持续比较MOV50H,A;比较结束,大数送 50HRET6.片内 RAM30H 开始的单元中有 10B 的二进制数,请编程求它们之和(和<256 ).解ADDIO:MOV R0,30H ADD A,@R0MOV R7,#9DJNZ R7,LOOPMOV A,@R0MOV30H,A LOOP: INC R0RET7、设从内存BLOCK单元开始寄存一无符号数的数据块,其长度为LEN。
《单片机与嵌入式控制技术》实验书

《单片机与嵌入式控制技术》实验书机电工程学院目录安全注意事项 (1)实验一keil软件平台实验 (2)实验二按键控制实验 (10)实验三查表实验 (12)实验四中断实验 (14)附录......................................................................................................... 错误!未定义书签。
安全注意事项1、不要在实验室吃东西。
2、不要穿拖鞋进入实验室,下雨天雨伞不要带入实验室。
3、使用实验箱时轻拿轻放,插拔排线时,对准,不要把排针插歪或者弄折,同时注意别被排针扎手。
4、接线时,必须把实验箱电源关闭。
5、下课后整理实验箱,设备,导线,椅子归原位,电脑正常关机,产生的垃圾带走。
实验一keil软件平台实验一、实验目的认识单片机MCS-51最小系统的构成和相关的开发软件。
任何一个用户系统的开发都需要一个界面良好的调试平台,以方便地、快捷地完成系统的设计与调试。
单片机的开发也是如此。
Keil是目前最流行,使用最广泛的开发平台,也是我们学习单片机的良好工具。
因此,我们必须首先熟悉这个工具,掌握这个工具。
二、实验内容及原理(一)实验内容要求实现某一个I/O口控制八个LED发光二极管左移或者右移流水。
(二)实验原理实验是通过对一些简单程序的调试,帮助我们直观地了解与掌握Keil调试软件的基本功能,掌握如何利用Keil来调试应用系统的硬件与软件的基本方法。
1、硬件(1)实验箱开发板主控芯片采用单片机型号为STC89C52RC,总共四组八位并行I/O口,均可实现数据输入输出,一个全双工串口,可支持的振荡频率范围为2~48Mhz,具有三个16位可编程定时器/计数器,八个中断源,四级优先级,其引脚分布如图1-1所示。
此外实验箱开发板还配备了共阴极数码管显示模块、共阳极八字形流水灯模块、点阵模块、独立按键模块、矩阵按键模块、LCD1602液晶显示模块、蜂鸣器、实时时钟模块、直流电机模块、A/D转换模块等外围模块、超声波模块、温度传感器模块等,可供相关实验与单片机配合使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在单片机开发过程中.一些非线性的控制过程。
最适合做一个表格来。
时时改变系统的参数。
达到控制的目的.最常的如产生正弦的的程。
就是建一个大的数组时时改变输出的8位字节送给外部DA。
由DA生成一个完整的正弦波。
当然了。
LED显示也是一个例子。
通过建一个数组来实现段码的点亮点灭。
下面就是一个LED表——-digits[0]
#define SEG_a 0x01
#define SEG_b 0x02
#define SEG_c 0x04
#define SEG_d 0x08
#define SEG_e 0x10
#define SEG_f 0x20
#define SEG_g 0x40
#define SEG_dot 0x80
unsigned char digits[10]= {
(SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f), // 0
(SEG_b|SEG_c), // 1
(SEG_a|SEG_b|SEG_d|SEG_e|SEG_g), // 2
(SEG_a|SEG_b|SEG_c|SEG_d|SEG_g), // 3
(SEG_b|SEG_c|SEG_c|SEG_f|SEG_g), // 4
(SEG_a|SEG_c|SEG_d|SEG_f|SEG_g), // 5
(SEG_a|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g), // 6
(SEG_a|SEG_b|SEG_c), // 7
(SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g), // 8
(SEG_a|SEG_b|SEG_c|SEG_d|SEG_f|SEG_g) // 9
};
C查表就太简单了temp2 = digits[ show_data[i] ];一句搞定,C中还有一个switch语句也是一个很好的用查表语句
C51汇编就相对麻烦一点。
不过MCS-51指令系统中有专用的查表指令:MOVC A,@A+DPTR和MO V A,@A+PC.
MOVC A,@A+DPTR指令,DPTR作为基址寄存器时,其值为16位而且可根据需要设计,故可用于在64KROM范围内查表.编写查表程序时,首先把表的首址送入DPTR中,再将要查找的数据序号(或下表值)送入A中,然后就可以使用该指令进行查表操作,并将结果送累加器A中。
MOVC A,@A+PC指令,PC作为基址寄存器时,其值由指令的位置确定,它只能设在查表指令操作码下
的256个字节范围内.编写查表程序时,首先把查表数据的序号送入A中,再把从查表指令到表的首地址间的偏移量与A值相加,然后使用该指令进行查表操作,并把结果送累加器A中。
下面是把内部RAM 30H-37H单元中的十六进制数依次转换为ASCII码,并存入内部RAM 60H-6F H单元之中。
用查表法编写程序。
分析:由于十六进制数是从0~F,对应的ASCII码为30H~46H,每一个单元存放的16进制数,转换为ASCII码后分别存入2个单元,低位存低地址,高位存高地址。
用ANL A ,#0FH 分别取高4位和低4位. 进行查表转换成相应的ASCII码.
MOVC A ,@A+DPTR 程序如下:
ORG 0000H
AJMP MAININITIAL
ORG 0050H
MAININITIAL:;给30H—37H赋初值
MOV R0,#30H ;设置存数指针R0初值
MOV R1,#00H ;设置赋值变量个数计数寄存器R1(循环计数器)初值
MOV DPTR,#initialtab
NEXTINITIAL:
MOV A,R1
MOVC A,@A+DPTR ;查表数据送累加器A
MOV @R0,A
INC R0 ;指针增一
INC R1 ;循环计数器增一
CJNE R1,#8,NEXTINITIAL ;判给30H—3FH赋初值完否
MAIN:
MOV R0,#30H ;设置十六进制数地址指针
MOV R1,#60H ;设置ASCII码地址指针
MOV R7,#08H ;需拼装的十六进制数字节个数
MOV DPTR,#ACSIITAB
ABC:
MOV A,@R0 ;取十六进制数
MOV B,A ;暂存
ANL A,#0F0H ;取十六进制数的字节高4位
RR A ;取十六进制数的字节高4位移到字节的低4位
RR A
RR A
RR A
MOVC A,@A+DPTR ;查表数据送累加器A
MOV @R1,A ;保存转换结果
INC R1 ;转换结果指针增一
MOV A,B
ANL A,#0FH ;取十六进制数的字节低4位
MOVC A,@A+DPTR ;查表数据送累加器A
MOV @R1,A ;保存转换结果
INC R1 ;转换结果指针增一
INC R0 ;转换数据指针增一
DJNZ R7,ABC ;继续
SJMP $
initialtab:;给30H-37H赋值用初值表
DB 23H,6DH,09H,7FH,8CH,1EH,4BH,5AH
ACSIITAB:;0~F,对应的ASCII码表
DB ”012345678”
DB "9ABCDEF”
END
MOVC A,@A+PC程序如下:
ORG 0000H
AJMP MAININITIAL
ORG 0050H
MAININITIAL:;给30H—37H赋初值
MOV R0,#30H ;设置存数指针R0初值
MOV R1,#00H ;设置赋值变量个数计数寄存器R1(循环计数器)初值MOV DPTR,#initialtab
NEXTINITIAL:
MOV A,R1
MOVC A,@A+DPTR ;查表数据送累加器A
MOV @R0,A
INC R0 ;指针增一
INC R1 ;循环计数器增一
CJNE R1,#8,NEXTINITIAL ;判给30H-3FH赋初值完否
MAIN:
MOV R0,#30H ;设置十六进制数地址指针
MOV R1,#60H ;设置ASCII码地址指针
MOV R7,#08H ;需拼装的十六进制数字节个数
MOV DPTR,#ACSIITAB
ABC:
MOV A,@R0 ;取十六进制数
MOV B,A ;暂存
ANL A,#0F0H ;取十六进制数的字节高4位
RR A ;取十六进制数的字节高4位移到字节的低4位
RR A
RR A
RR A
ACALL TRANACSAII ;查表数据送累加器A
MOV @R1,A ;保存转换结果
INC R1 ;转换结果指针增一
MOV A,B
ANL A,#0FH ;取十六进制数的字节低4位
ACALL TRANACSAII ;查表数据送累加器A
MOV @R1,A ;保存转换结果
INC R1 ;转换结果指针增一
INC R0 ;转换数据指针增一
DJNZ R7,ABC ;继续
SJMP $
initialtab: ;给30H—37H赋值用初值表
DB 23H,6DH,09H,7FH,8CH,1EH,4BH,5AH
TRANACSAII:
INC A ;查表之前A加1是因为MOVC指令与数据表之间有一个地址单元的间隔(RET指令)MOVC A,@A+PC ;由于数据表紧跟MOVC指令之后,因此以PC作为基址寄存器比较方便。
RET
ACSIITAB:;0~F,对应的ASCII码表
DB "012345678"
DB ”9ABCDEF"
end
其它单片机跟C51查表类似。
下面介绍松翰的单片机的查表程序。
松翰单片机查表是通过X。
Y寄存器来达到指向的表的目的如下
b0mov z,#segtab$L
b0mov y,#segtab$M
b0mov a,freqh ;led 3
add z,a
b0bts0 fc
incms y;表加1
nop
movc .。
...。
.。
.。
.
segtab:
dw 000ch
dw 000ah
dw 000ch ;0
dw 000ch
dw 0000h
dw 0000h ;1
dw 0008h
dw 000eh
dw 0004h ;2 。
...。
.。
.。
.。
..
希望看了此文之后。
大家对查表的一个清楚认识。