单片机实验程序

合集下载

单片机实验指导书(6个实验)

单片机实验指导书(6个实验)

单片机原理和接口技术实验指导书襄樊学院物理和电子信息技术系实验要求1.进入实验室前完成的部分1)认真阅读实验指导书,弄懂实验原理和实验内容。

2)编写实验所要用到的程序,将其放在U盘上。

3)写出预习报告。

2. 进入实验室后完成的部分1)建立工程,加入已准备好的程序文件。

2)对程序进行调试,修改错误,获得要求的结果。

3)保存调试后的程序。

3.实验结束后的部分对实验结果进行分析、总结,写出实验报告。

实验报告内容及格式1.实验目的2.实验设备3.实验原理及环境4.实验内容只做文字叙述,程序部分放在程序清单中。

流程图也可不画。

5.程序清单本实验使用的完整程序。

如果使用了本实验或前面实验中完全相同的子程序,可不列写,只做注明即可。

6.实验步骤7.实验总结主要包括对实验结果、调试过程、错误及产生的原因的分析,以及本次实验的重要收获等。

此项为实验成绩评定的重要依据。

实验1 Keil C51的使用(汇编语言)实验目的:初步掌握Keil C51(汇编语言)和ZY15MCU12BD型综合单片机实验箱的操作和使用,能够输入和运行简单的程序。

实验设备:ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装Keil C51的计算机一台。

实验原理及环境:在计算机上已安装Keil C51软件。

这个软件既可以和硬件(ZY15MCU12BD型综合单片机实验箱)连接,在硬件(单片机)上运行程序;也可以不和硬件连接,仅在计算机上以虚拟仿真的方法运行程序。

如果程序有对硬件的驱动,就需要和硬件连接;如果没有硬件动作,仅有软件操作,就可以使用虚拟仿真。

实验内容:1.掌握软件的开发过程:1)建立一个工程项目选择芯片确定选项。

2)加入C 源文件或汇编源文件。

3)用项目管理器生成各种使用文件。

4)检查并修改源文件中的错误。

5)编译连接通过后进行软件模拟仿真。

6)编译连接通过后进行硬件仿真。

7)I A P 编程操作2.按以上步骤实现在P1.0输出一个频率为1Hz的方波。

单片机程序流程图及源代码

单片机程序流程图及源代码

单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。

实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。

2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。

实现方式:通过peripherals实现端口数据观察实验。

程序流程图:将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。

源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H;延迟程序入口地址DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1;0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET;从延迟程序返回END;结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。

程序流程图:将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。

源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口ACALL DELAY; 调用延迟,使数码管亮0持续0.33SMOV P0,#60H; show 1ACALL DELAY;MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#0F6H; show 9ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL:MOV R5,#05H; 采用软件延迟,若主频为12MHz,则DEL1:MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,DEL2:MOV R7,#0FFH; 人眼可分辨。

单片机实验一-加法器实验报告

单片机实验一-加法器实验报告

单片机实验一-加法器实验报告南昌大学实验报告学生姓名:学号:专业班级:实验类型:□验证□综合■设计□创新实验日期:实验成绩:实验一单片机软件实验—1至100求和(一)实验目的1.掌握51单片机Keil软件集成开发环境。

2.学习使用汇编语言编写应用程序。

(二)设计要求熟悉51单片机的Keil软件集成开发环境,使用汇编语言编写“1+2+3+…+100”的程序。

(三)实验原理类似C语言里的循环语句,从1开始加,利用CJNE判断是否已加到100,从而进行循环计数。

(四)实验设备装有Keil4的电脑一台(五)实验结果计算结果高8位r3为0x13,低8位r4为0xba,即0x13ba,十进制数5050。

(六)结果讨论与心得体会实验结果和预期结果一致。

以前就用过Keil编程C51,所以使用起来没有什么障碍。

第一次自己编汇编程序,感觉汇编和C还是有很多相通之处,有很多思想和方法可以借鉴。

(七)附录:实验源代码ORG 0000H ;程序运行入口LJMP M AIN ;跳向主程序MAINORG 0030H ;主程序入口MAIN: MOV R2,#01H ;给R2赋初值1,从1开始加MOV R3,#00H ;R3用于存放最终结果的高8位MOV R4,#00H ;R4用于存放最终结果的低8位START: CLR C;Cy位清零CJNE R2,#65H,LOOP ;判断R2是否等于101,如果不相等,就跳到LOOPSJMP RESULT ;R2等于101时,表示已经完成1加到100的运算,跳转到RESULT LOOP: MOV A,R2 ;将R2的值移入累加器ADD A,R4 ;将R4的值加到累加器里MOV R4,A ;将累加器的值移入R4,作为相加后结果的低8位MOV A,R3 ;将R3的值移入累加器ADDC A,#00H ;累加器加0,并且带进位相加,这样做就把低8位进位加上去了MOV R3,A ;将累加器的值移入R3,作为相加后结果的高8位INC R2 ;R2的值加1,递增,作为下一个加数SJMP START ;跳转到START,继续相加RESULT: SJMP RESULT ;显示结果END ;结束。

单片机所有实验程序

单片机所有实验程序

单片机实验程序-------- 1.定时器及中断实验#include<reg51.h>#define uchar unsigned char#define uint unsigned intvoid delay(){uint x,y;for(x=100;x>0;x--)for(y=110;y>0;y--);}uchar m,flag;main(){uchar a,b;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EX0=1;EX1=1;PX1=1;ET0=1;TR0=1;EA=1;m=0;P1=0;while(1){while(flag==0);flag=0;if(m==100)m=0;m++;a=m/10;b=m+a*6;P1=b;}}void timer0() interrupt 1 using 0{uchar t;TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(t<20)t++;else {flag=1;t=0; }}void exter0() interrupt 0 using 1{if(INT0==0)delay();if(INT0==0)flag=1;}void exter1() interrupt 2 using 2{if(INT1==0)delay();if(INT1==0)m=0;}2.定时器控制二极管#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar num;uint a;main(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;num=0;a=0;P1=table[num];while(1){}}void exter0() interrupt 1{ TH0=(65536-50000)/256;TL0=(65536-50000)%256;a++;if(a==20){ a=0;num++;if(num==8) num=0;P1=table[num];}}3.时钟综合实验#include <reg51.h>unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char m,sec,min;void delay(){ unsigned char x,y;for(x=100;x>0;x--)for(y=50;y>0;y--);}void main(){TMOD=0x01;TH0=15536/256;TL0=15536%256;ET0=1;TR0=1;IT0=1;EX1=1;EX0=1;EA=1;while(1){P2=0x80;P0=tab[sec%10];delay();P0=0xff;P2=0x40;P0=tab[sec/10];delay();P0=0xff;P2=0x20;P0=tab[min%10];delay();P0=0xff;P2=0x10;P0=tab[min/10];delay();P0=0xff;}}void timer() interrupt 1 using 1 {TH0=15536/256;TL0=15536%256;m++;if(m==3){m=0;sec++;}if(sec==60){sec=0;min++;}if(min==60)min=0;}void srv0() interrupt 0 using 0 {if(INT0==0)min++;if(min==60)min=0;}void srv1() interrupt 2 using 2 {if(INT1==0){ sec=0;min=0;}}4.PC发送到单片机#include <reg51.h> unsigned char a;void main(){ SCON=0x50;TMOD=0x20;TH1=TL1=0xfd;TR1=1;ET1=0;ES=1;EA=1;while(1);/* {/* while(!RI);a=SBUF;RI=0;if(a==0x55){SBUF=0x41;while(!TI);TI=0;}*/// }}void srv() interrupt 4{ if(RI){a=SBUF;RI=0;}if(a==0x55){SBUF=0x41;while(!TI);TI=0;}}发送#include <reg51.h>void main(){ SCON=0x40;TMOD=0x20;TH1=TL1=0xfd;TR1=1;while(1){SBUF=0x55;while(!TI);TI=0;}}AD#include <reg51.h>#include <intrins.h>#include <absacc.h>#define PIN0 XBYTE[0x7ff8]#define PIN1 XBYTE[0x7ff9] typedef unsigned char byte; typedef unsigned int word;void main(void){float resuit0,result1;float resuit0_reg,result1_reg;byte i,j,k;while(1){for(i=0;i<2;i++){if(!i)PIN0=0;else PIN1=0;for(k=0;k<255;k++);if(!i)resuit0_reg=PIN0;else result1_reg=PIN1;}resuit0=resuit0_reg*5/255;result1=result1_reg*5/255;}}。

[整理]单片机6个必做实验

[整理]单片机6个必做实验

第一部分软件实验实验一二进制到BCD码转换一、实验目的1、掌握简单的数值转换算法2、基本了解数值的各种表达方法二、实验说明单片机中的数值有各种表达方式,这是单片机的基础。

掌握各种数制之间的转换是一种基本功。

我们将给定的一个二进制数,转换成二十进制(BCD)码。

将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。

三、实验内容及步骤1、启动计算机,打开伟福仿真软件,进入仿真环境。

首先进行仿真器的设置,选择使用伟福软件模拟器。

2、打开TH2.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA),点击暂停按钮,观察地址30H、31H、32H的数据变化,30H更新为01,31H更新为02,32H更新为03。

用键盘输入改变地址30H、31H、32H的值,点击复位按钮后,可再次运行程序,观察其实验效果。

修改源程序中给累加器A的赋值,重复实验,观察实验效果。

3、打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。

四、流程图及源程序1.源程序RESULT EQU 30HORG 0000HLJMP STARTBINTOBCD:MOV B,#100DIV ABMOV RESULT,A ;除以100得百位数MOV A,BMOV B,#10DIV ABMOV RESULT+1,A ;余数除以10得十位数MOV RESULT+2,B ;余数为个位数RETSTART:MOV SP,#40HMOV A,#123CALL BINTOBCDLJMP $END2.流程图实验四程序跳转表一、实验目的1、了解程序的多分支结构2、掌握多分支结构程序的编程方法二、实验说明多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。

若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。

单片机整套实验及程序(交通灯_跑马灯等)

单片机整套实验及程序(交通灯_跑马灯等)

实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。

二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管〔D1、D2、D3、D4〕按照一定的方式点亮。

如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。

●基于Proteus ISIS仿真环境完成上述功能的仿真。

●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。

四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。

五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//翻开总中断ET0=1;//翻开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完本钱实验内容,深刻理解汇编语言程序设计结构。

单片机汇编实验报告

单片机汇编实验报告

单片机汇编实验报告1. 实验目的本实验旨在通过编写单片机汇编程序,掌握单片机的基本操作,理解汇编语言和单片机的工作原理。

2. 实验器材•STC89C52单片机开发板•串口线•电脑3. 实验原理单片机是一种集成了处理器、存储器、输入输出设备等功能的微型计算机系统。

通过编写汇编语言程序,可以利用单片机的内部寄存器和外部接口,实现各种功能。

4. 实验步骤步骤一:准备工作1.将STC89C52单片机开发板与电脑通过串口线连接。

2.打开开发板电源,确保电源工作正常。

步骤二:编写汇编程序1.打开汇编语言编辑器,例如Keil C51。

2.创建一个新的汇编语言项目,命名为“experiment.asm”。

3.编写汇编程序,实现所需的功能。

例如,可以编写一个简单的程序,使LED灯闪烁。

步骤三:编译和烧录程序1.选择适当的编译选项,将汇编程序编译为二进制文件。

2.将生成的二进制文件烧录到单片机中。

可以使用烧录软件或者编程器完成这一步骤。

步骤四:连接外部电路1.根据需要,连接外部电路到单片机的GPIO引脚。

例如,如果需要控制LED灯,可以将LED的阳极连接到单片机的某个输出引脚,将LED的阴极连接到单片机的地。

步骤五:运行实验1.将开发板连接到电源,确保电源正常工作。

2.按下开发板上的复位按钮,使单片机开始执行程序。

3.观察实验现象,并记录下实验结果。

5. 实验结果与分析通过以上步骤,我们成功编写并烧录了一个简单的汇编程序到单片机中。

在运行实验时,LED灯按照程序的要求进行闪烁。

这表明我们的实验设计和编程是正确的。

6. 实验总结在本次实验中,我们通过编写汇编程序,学习了单片机的基本操作和工作原理。

通过实际操作,我们更好地理解了汇编语言的编写和单片机的工作方式。

同时,我们还学会了使用烧录软件将程序烧录到单片机中,并通过外部电路观察实验结果。

7. 实验改进在以后的实验中,我们可以尝试更复杂的功能,例如通过单片机控制电机或者LCD显示屏等。

单片机闪烁实验报告

单片机闪烁实验报告

单片机闪烁实验报告单片机闪烁实验报告引言:单片机是一种集成电路,具有微处理器核心、存储器和输入输出设备等功能。

在现代电子技术中,单片机应用广泛,其灵活性和可编程性使其成为各种电子设备的重要组成部分。

本实验旨在通过使用单片机控制LED灯的闪烁,探索单片机的基本原理和应用。

一、实验目的:通过本实验,我们的目的是熟悉单片机的工作原理和编程方法,理解单片机控制LED灯闪烁的过程。

同时,通过实际操作,培养我们的动手能力和团队合作精神。

二、实验器材:1. 单片机开发板2. LED灯3. 连接线4. 电源三、实验步骤:1. 将单片机开发板与电源连接,确保电源正常工作。

2. 将LED灯连接到开发板上的GPIO引脚。

3. 打开开发板上的编程软件,编写控制LED闪烁的程序。

4. 将编写好的程序下载到单片机开发板上。

5. 打开开发板上的电源,观察LED灯是否按照程序闪烁。

四、实验结果:经过实验,我们成功地控制了LED灯的闪烁。

在程序中,我们通过设置GPIO引脚的高低电平来控制LED灯的亮灭。

通过调整程序中的延时时间,我们还可以控制LED灯的闪烁频率和亮度。

这进一步验证了单片机的可编程性和灵活性。

五、实验总结:通过本次实验,我们深入理解了单片机的工作原理和应用。

单片机作为一种集成电路,不仅具有微处理器的功能,还可以通过编程实现各种功能。

在实验中,我们通过控制LED灯的闪烁,体会到了单片机的实际应用价值。

同时,实验过程中我们也发现了一些问题和挑战,例如程序编写的复杂性和调试的难度。

这些问题提醒我们要不断学习和提升自己的技能,以更好地应对未来的挑战。

六、实验展望:本次实验只是单片机应用的一个简单示例,单片机的应用领域非常广泛,包括家电、汽车、工业自动化等。

未来,我们可以进一步研究单片机的高级应用,例如通过单片机控制温度、湿度等传感器,实现智能家居系统。

这将有助于我们更好地理解和应用单片机技术,为未来的科技发展做出贡献。

结语:通过本次实验,我们不仅学习了单片机的基本原理和应用,还培养了动手能力和团队合作精神。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机实验程序软件实验一1、分别编程实现两个16位无符号数相加,结果存放在40H41H中;两个16位的无符号数相减,结果存放在30H31H中。

; 两个16位无符号数相加,结果存放在30H31H中ORG 0000HLJMP MAINORG 0030HMAIN :MOV R3,#01H ;输入加数高八位MOV R4,#23H ;输入加数低八位MOV R5,#45H ;输入被加数高八位MOV R6,#67H ;输入被加数低八位MOV A,R4 ;将R4存入寄存器AADD A,R6 ;A与R6相加,结果存入AMOV 31H,A ;将低八位的和数存入31HMOV A,R3 ;将R3存入寄存器AADDC A,R5 ;A与R5相加,结果存入AMOV 30H,A ;将高八位的和数存入30HSJMP $END; 两个16位的无符号数相减,结果存放在30H31H中。

ORG 0000HLJMP MAINORG 0030HMAIN :MOV R3,#12H ;输入减数高八位MOV R4,#34H ;输入减数低八位MOV R5,#56H ;输入被减数高八位MOV R6,#78H ;输入被减数低八位MOV A,R4 ;将R4存入寄存器ACLR C ;C位清"0"SUBB A,R6 ;A与R6相减,结果存入AMOV 31H,A ;将低八位的差数存入31HMOV A,R3 ;将R3存入寄存器ASUBB A,R5 ;A与R5相减,结果存入A MOV 30H,A ;将高八位的差数存入30HSJMP $END2、编程实现X (X ≥40)Y= 2X (20<X<40)0(X≤20);实现X>=40时,Y=X;20<X<40时,Y=2X;X<20时,Y=0 X的值存放于R2中,Y的值存放于R3中ORG 0000HLJMP MAINORG 0030HMAIN:CMP40: CJNE R2,#40,NEXT0 ;X与40比较,结果由CY读出NEXT0: JNC BIGGER40 ;判断C的值,C为0时则X大于或者等于40,跳到BIGGER40 JC CMP20 ;判断C的值,C不为0时则X小于40,跳到CMP20CMP20: CJNE R2,#21,NEXT1 ;X与21比较,结果由CY读出NEXT1: JNC BIGGER20 ;判断C的值,C为0时则X大于或者等于21(即X大于20),跳到BIGGER20JC SMALLER20 ;判断C的值,C不为0时则X小于20,跳到SMALLER20BIGGER40: MOV A,R2 ;X>=40时,将X的值赋给存放Y的值的R3MOV R3,ASJMP $BIGGER20: MOV A,R2 ;20<X<40时,将X的值乘以2再赋给存放Y的R3MOV B,#02MUL ABMOV R3,ASJMP $SMALLER20: CLR A ;X<20时,将0赋给YMOV R3,ASJMP $3、学生实验:编写80个数相加,结果存放在30H31H中。

;编写80个数相加,结果存放在30H31H中ORG 0000HLJMP MAINORG 0030HMAIN: MOV R2,#80 ;输入累加的个数N存放到R2中MOV R0,#32H ;输入参与累加数据的首个数据的地址ADDER: MOV A,@R0 ;将参与累加的数据的值赋给AADD A,31H ;将A与当前累加数的和的低位(31H)相加结果存放在A中 MOV 31H,A ;将求得的和数的低位放入31H中CLR A ;对A清"0"ADDC A,30H ;计算已得累加数高位与当前进位相加,结果存放在A中 MOV 30H,A ;将求得的和数的高位放入30H中INC R0 ;R0中的数据加1LOOP: DJNZ R2,ADDER ;循环判断SJMP $END软件实验二1、编写R1×R2R3=R4R5R6,R1R2×R3R4=R4R5R6R7。

; R1×R2R3=R4R5R6ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,R3 ; R1乘以低位数R3 R3xR1=R5R6MOV B,R1MUL ABMOV R6,AMOV R5,BMOV A,R2 ; R1乘以高位数R2 ;R2xR1=R4AMOV B,R1MUL ABMOV R4,BADD A,R5 ; 高。

低乘数结果相加 R5+A=R5MOV R5,A ;R4+CY=R4MOV A,R4ADDC A,#00HMOV R4,ASJMP $END;R1R2×R3R4=R4R5R6R7ORG 0000H LJMP MAINORG 0030H;————R2乘以R3R4存放于R5R6R7MAIN: LCALL MULLMOV R5,30HMOV R6,31HMOV R7,32H ;调用子程序MULL;————R1先赋给R2,再乘以R3R4MOV A,R1MOV R2,ALCALL MULL ;调用子程序MULLCLR C ;进位清"0"MOV A,32H ;R6加上32H中的值,存放于R6ADD A,R6MOV R6,AMOV A,R5 ;R5加上31H中的值,存放于R5ADDC A,31HMOV R5,AMOV A,#00H ;30H加上进位C,存放于R4ADDC A,30HMOV R4,ASJMP $;————子程序MULL:实现R2乘以R3R4R结果存放于30H31H32H MULL: MOV A,R4 ; R2乘以低位数R4 R3xR1=31H32HMOV B,R2MUL ABMOV 32H,AMOV 31H,BMOV A,R3 ; R2乘以高位数R3 ;R2xR1=30HMOV B,R2MUL ABMOV 30H,BADD A,31H ; 高。

低乘数结果相加 31H+A=31HMOV 31H,A ;30H+CY=30HMOV A,30HADDC A,#00HMOV 30H,ARETEND2、找出内RAM中从30H到50H中在最小值。

;找出内RAM中从30H到50H中在最小值,并将最小值存放于60H中ORG 0000HLJMP MAINORG 0030HADDRMAX EQU 50H ;定义ADDRMAX为所查找范围的上限值ADDRMIN EQU 30H ;定义ADDRMIN为所查找范围的下限值MAIN: MOV R0,#ADDRMIN ;将地址指针存放于R0中,并赋初值LOOP1: MOV 60H,@R0LOOP2: CJNE R0,#ADDRMAX,NEXT1;判断R0是否达到所查找范围的上限NEXT1: JNC OUT ;是就跳出循环INC R0 ;否则RO加1MOV A,@R0CJNE A,60H,NEXT2 ;将相邻两个数((R0))和(60H)进行比较NEXT2: JNC LOOP2 ;若((R0))大于(60H)则直接跳到LOOP2JC LOOP1 ;若((R0))小于或者等于(60H)则 OUT: SJMP $ ;跳到LOOP1END3、用查表方式编写y=x3(x为0~9的整数),要求分别用@A+DPTR和@A+PC的方法。

;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,R4ADD A,R4 ;将累加器A翻倍MOV DPTR,#TABMOVC A,@A+DPTRMOV R2,AMOV A,R4 ;重新将X的值存入AADD A,R4 ;A翻倍INC A ;A加1MOVC A,@A+DPTRMOV R3,ASJMP $ TAB: DW 0000H,0001H,0008H,0019H,0040H ;0~9立方表DW 007DH,00C4H,0157H,0200H,02D9HEND;用@A+PC的方法。

X存放于R4中,Y存放于R2R3中ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,R4ADD A,R4 ;存放X的R4加倍 ADD A,#09H ;累加器加上偏移量 MOVC A,@A+PCMOV R2,AMOV A,R4ADD A,R4ADD A,#04H ;累加器加上偏移量 MOVC A,@A+PCMOV R3,ASJMP $TAB: DW 0000H,0001H,0008H,0019H,0040H ;0~9立方表DW 007DH,00C4H,0157H,0200H,02D9HEND4.编程实现:时钟频率6MHZ,延时2MS;时钟频率12MHZ,延时10S;延时2MS,时钟频率6MHZORG 0000HLJMP MAINORG 0030HMAIN: LCALL DELSJMP $DEL: MOV R7,#5 ;外循环DEL1: MOV R6,#100 ;内循环DEL2: DJNZ R6,DEL2 ;先执行内循环,后执行外循环DJNZ R7,DEL1RETEND;延时10S,时钟频率12MHZORG 0000HLJMP MAINORG 0030HMAIN: LCALL DELSJMP $DEL: MOV R7,#5 ;外二循环DEL1: MOV R6,#50 ;外一循环DEL2: MOV R5,#200 ;内循环DEL3: DJNZ R5,DEL3 ;先执行内循环,后执行外一循环DJNZ R6,DEL2 ;最后执行外二循环DJNZ R7,DEL1RETEND软件实验三1、用查表方式编写y=x13+x23+x33。

(x为0~9的整数)#include <reg51.h>void main(){int a[10]={0,1,8,27,64,125,216,343,512,729}; //0~9的立方表int x1,x2,x3,y;x1=0;x2=6;x3=6;y=a[x1]+a[x2]+a[x3]; //X1,X2,X3的立方和while(1);}2、有10个8位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的数据(1的个数为偶数)都要存到内RAM50H开始的数据区中。

试编写有关程序。

#include <reg51.h>void main(){unsigned char data a[10]={0,1,8,19,40,75,88,57,2,9}; //二进制数据存入数组a中 char i;char *d=0x50; //定义d为指向内RAM50H的指针//对a[i]进行奇偶校验,偶数存入内RAM50H开始的数据中for(i==0;i<10;i++){ACC=a[i]; //a[i]存入累加器ACC中 if (P==0) //对a[i]进行奇偶校验{*d=a[i]; //偶数存入内RAM50H开始的数据区中d++; //d指针加1}}while(1);}3、有10个8位带符号二进制数,请将10个数按从小到大的顺序排列,并存到内RAM50H开始的单元中。

相关文档
最新文档