单片机的查表程序
- 格式:doc
- 大小:19.00 KB
- 文档页数:5
μ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 应用程序。
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时,操作数由端口锁存器读入。
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转换模块等外围模块、超声波模块、温度传感器模块等,可供相关实验与单片机配合使用。
51单片机汇编指令总结数据传输指令一.片内RAM数据传输指令1.以累加器A为目的操作数的指令:MOV A , RnMOV A , directMOV A , @RiMOV A , #data2.以寄存器Rn为目的操作数的指令:MOV Rn , AMOV Rn ,directMOV Rn ,data3.以直接地址为目的操作数的指令:MOV direct ,AMOV direct ,RnMOV direct1 ,derect2MOV direct ,@RiMOV direct ,#data4.间接地址为目的操作数的指令:MOV @Ri ,AMOV @Ri ,directMOV @Ri ,#data5.十六位数据传送指令:MOV DPTR , #data16二.累加器A与片外RAM数据传送指令:MOVX A ,@RiMOVX A , @DPTRMOVX @Ri ,AMOVX @DPTR ,A三.查表寻址:MOVC A ,@A+DPTR (先PC←(PC)+1,后A←((A)+(DPTR)))+MOVC A ,@A+PC (先PC←(PC)+1,后A←((A)+(PC)))四.交换指令:1.字节交换指令:XCH A ,RnXCH A ,directXCH A ,@Ri2.半字节交换指令:XCHD A ,@Ri3.累加器半字节交换指令:SWAP A五.栈操作指令:1.PUSH(入栈指令)PUSH direct2.POP(出栈指令)POP direct算术运算指令:一.加法减法指令:1.加法指令:ADD A ,RnADD A ,directADD A ,@RiADD A ,#data2.带进位加法指令:ADDC A ,Rn A←(A)+(Rn)+CYADDC A ,direct A←(A)+(direct)+CYADDC A ,@Ri A←(A)+((Ri))+CYADDC A ,#data A←(A)+(data)+CY3.带借位减法指令:SUBB A ,Rn A←(A)-CY-(Rn)SUBB A ,direct A←(A)-CY-(direct)SUBB A ,@Ri A←(A)-CY-((Ri))SUBB A ,#data A←(A)-CY-#data二.乘法除法指令:1.乘法指令:MUL AB BA←(A) ×(B)高字节放在B中,低字节放在A中2.除法指令:DIV AB A←(A) ÷(B)的商,(B) ←(A) ÷(B)的余数三.加1减1指令:1.加1指令:INC A A←(A)+1INC Rn Rn←(Rn)+1INC direct direct←(direct)+1INC @Ri (Ri) ←((Ri))+1INC DPTR DPTR←(DPTR)+12.减1指令:DEC ADEC RnDEC directDEC @Ri四.十进制调制指令:DA A 调整累加器A的内容为BCD码逻辑操作指令:一.逻辑与、或、异或指令:1.逻辑与指令:ANL A ,RnANL A ,directANL A ,@RiANL A ,#data2.逻辑或这令:ORL A ,RnORL A ,directORL A ,@RiORL A ,#dataORL direct ,AORL direct ,#data3.逻辑异或指令:XRL A ,RnXRL A ,directXRL A ,@RiXRL A ,#dataXRL direct ,AXRL direct ,#data二.清零、取反指令:1.累加器A清零指令:CRL A2.累加器A取反指令:CPL A三.循环位移指令:1.累加器A循环左移指令:RL A2.累加器A循环右移指令:RR A3.累加器A连同进位位循环左移指令:RLC A4. 累加器A连同进位位循环右移指令:RRC A控制转移指令:一.无条件转移指令:1.绝对转移指令:AJMP addr11 (先PC+2,然后将addr11的低十位传给PC,PC的高六位不变)2.长转移指令:LJMP addr16 (用addr16的值替换PC的值)3.相对转移(短转移)指令:SJMP rel(带符号的偏移字节数)(PC+2,再加rel赋值给PC)4.间接转移指令:JMP @A+DPTR (A)+(DPTR) →(PC)二.条件转移指令:1.累加器判零转移指令:JZ rel 先PC+2;后判断,A为0时转移,PC+rel赋值给PC;否则顺序执行JNZ rel 先PC+2,后判断,A不为0时转移,PC+rel赋值给PC;否则顺序执行2.比较转移指令:CJNE 目的操作数,源操作数,relCJNE A,direct,rel 先PC+3传回PC,再比较目的操作数和原操作数CJNE A,#data,rel 目>源时,程序转移,PC+rel传回PC且CY=0CJNE Rn,#data,rel 目=源时,程序顺序执行CJNE @Ri,#data,rel 目<源时,程序转移,PC+rel传回PC且CY=13.减一非0指令:DJNZ Rn,rel 先PC\+2,Rn-1,当Rn为0时程序顺序执行,否则PC+rel传回PCDJNZ direct,rel 先PC+3,direct-1,direct为0时程序顺序执行,否则PC+rel 传回PC二.子程序调用、返回指令:1.绝对调用指令ACALL:ACALL addr11 先PC+2,SP+1将PC的低八位存入SP;SP+1,将PC的高八位存入SP。
单片机程序设计题库及答案2.查表法求 Y=某 2。
设某(0≤某≤15)在片内 RAM 的 20H 单元中,要求查表求 Y,存入片内 RAM21H 单元。
1)ORG1000H3.分析下面程序MOVR0,#0C8H;(R0) =200CLRP1.7;P1.7 为低电平LOOP:CPLP1.7;P1.7 变反(1μ) NOP;(1μ) NOP;(1μ)DJNZR0,LOOP;(R0)≠0 则转(2μ)4.设计一个延时 10m 的延时子程序,已知单片机使用的晶振为 6MHZ。
机器周期数 ORG0020H1MOVR0,#0AH;外循环 10 次 1DL2:MOVR1,#MT;内循环 MT 次 1DL1:NOP 1NOP;空操作指令2DJNZR1,DL12DJNZR0,DL2RET内循环 DL1 到指令 DJNZR1,DL1 的计算:(1+1+2)ⅹ2μⅹMT=1000μMT=125=7DH 总的延时时间: {1+[1+(1+1+2)ⅹ125+2]ⅹ10}ⅹ2μ=10.062m5.试计算延时程序的执行时间DELAY:MOVR6,#64H (=100) 1I1:MOVR7,#0FFH (=255) 1I2:DJNZR7,I22DJNZR6,I12RET2 延时时间计算:(设时钟 fOSC=12MHz)T=1u计算延时程序的执行时间(设时钟 fOSC=6MHz,T=2u) 7.十六进制数转换为 ASCII 码:HASC:CJNEA,#0AH,NN:JNCN1 (C=0 跳 N1) ADDA,#30HSJMPSEN1:ADDA,#37HSE:RET8.设从片内 RAM30H 单元和40H 单元有两个 16 字节数,把它们相加,结果放于 30H 单元开始的位置处(设结果不溢出)。
ORG1000HMOVR0,#30HMOVR1,#40HMOVR2,#16CLRC9.按下面公式编写程序,某为无符号数,存在 20h 单元 y 存放在 21h 单元MOVB,#2MULABAJMPNE 某 T2NE 某 T1:CPLANE 某 T2:MOV21H,AEND从内部 RAM22h 单元开始存有一个无符号数数据块,长度 n 存于 21h 中。
实验一:系统认识实验一、设计目的:1. 学习 Keil C51 集成开发环境的操作;2. 熟悉 TD-51 系统板的结构及使用。
二、设计内容:编写程序,将 00H~0FH 共 16 个数写入单片机内部 RAM 的 30H~3FH 空间。
三、设计步骤:1. 创建 Keil C51 应用程序(1)运行 Keil C51 软件,进入 Keil C51 集成开发环境。
(2)选择工具栏的 Project 选项,弹出下拉菜单,选择 NewProject 命令,建立一个新的μVision2 工程。
这时会弹出文件保存对话框,选择工程目录并输入文件名 Asm1 后,单击保存。
(3)工程建立完毕后,μVision2 会马上弹出器件选择窗口。
器件选择的目的是告诉μVision2 使用的 80C51 芯片的型号是哪一个公司的哪一个型号,不同型号的 51 芯片内部资源是不同的。
此时选择 SST 公司的 SST89E554RC。
(4)到此建立好一个空白工程,现在需要人工为工程添加程序文件,如果还没有程序文件则必须建立它。
选择工具栏的 File 选项,在弹出的下拉菜单中选择 New 目录。
(5)输入程序,完毕后点击“保存”命令保存源程序,将 Text1 保存成Asm1.asm。
Keil C51 支持汇编和 C 语言,μVision2 会根据文件后缀判断文件的类型,进行自动处理,因此保存时需要输入文件名及扩展名.ASM 或.C。
保存后,文件中字体的颜色会发生一定变化,关键字会变为蓝色。
(6)程序文件建立后,并没有与 Asm1.Uv2 工程建立任何关系。
此时,需要将 Asm1.asm 源程序添加到 Asm1.Uv2 工程中,构成一个完整的工程项目。
在Project Window 窗口内,选中Source Group1 点击鼠标右键,选择 Add Files to Group‘Source Group1’命令,此时弹出添加源程序文件对话框,选择文件Asm1.asm,点击 Add 命令按钮即可将源程序文件添加到工程中。
单⽚机查表指令单⽚机具有两条查表指令,⽤于从 ROM 中读出预存的数据: MOVC A, @A + PC MOVC A, @A + DPTR 其中前⼀条指令的⽤法,⽐较难,使⽤的时候,需要计算⼀个“偏移量”。
不了解“指令的字节数”的⼈,都不清楚应该如何计算。
第⼀条指令 第⼀条指令中,Rn代表的是R0-R7。
第⼆条指令中,direct就是指的直接地址,⽽第三条指令中,就是我们刚才讲过的。
第四条指令是将⽴即数data送到A中。
下⾯我们通过⼀些例⼦加以说明: MOV A,R1 ;将⼯作寄存器R1中的值送⼊A,R1中的值保持不变。
MOV A,30H ;将内存30H单元中的值送⼊A,30H单元中的值保持不变。
MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送⼊A中。
如执⾏命令前R1中的值为20H,则是将20H单元中的值送 ⼊A中。
MOV A,#34H ;将⽴即数34H送⼊A中,执⾏完本条指令后,A中的值是34H。
以寄存器Rn为⽬的操作的指令 MOV Rn,A MOV Rn,direct MOV Rn,#data 这组指令功能是把源地址单元中的内容送⼊⼯作寄存器,源操作数不变。
以直接地址为⽬的操作数的指令 MOV direct,A 例: MOV 20H,A MOV direct,Rn MOV 20H,R1 MOV direct1,direct2 MOV 20H,30H MOV direct,@Ri MOV 20H,@R1 MOV direct,#data MOV 20H,#34H 以间接地址为⽬的操作数的指令 MOV @Ri,A 例:MOV @R0,A MOV @Ri,direct MOV @R1,20H MOV @Ri,#data MOV @R0,#34H ⼗六位数的传递指令 MOV DPTR,#data16 8051是⼀种8位机,这是唯⼀的⼀条16位⽴即数传递指令,其功能是将⼀个16位的⽴即数送⼊DPTR中去。
在单片机开发过程中.一些非线性的控制过程。
最适合做一个表格来。
时时改变系统的参数。
达到控制的目的.最常的如产生正弦的的程。
就是建一个大的数组时时改变输出的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 。
...。
.。
.。
.。
..
希望看了此文之后。
大家对查表的一个清楚认识。