单片机经典子程序例题

合集下载

单片机汇编语言经典一百例

单片机汇编语言经典一百例

51单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

单片机 11道编程例题及答案

单片机  11道编程例题及答案

1.把长度为10H的字符串从内部RAM的输入缓冲区inbuf向位物外部RAM的输出缓冲区outbuf传送,一直进行到遇见回车或整个字符串传送完毕。

试编程实现。

ORG 0030H MOV R0,#inbuf MOV R1,#outbuf MOV R4,#10HLOOP:MOV A,@R0 ; 从内部RAM取数 CJNE A,#0DH,LL ;是否为回车符CRSJMP STOP ;是转停止传送 LL: MOVX @R1,A ;不是则传送到外部RAMINC R0 INC R1 DJNZ R4,LL;沒传送完则循环 STOP: SJMP $2、内部RAM从list单元开始存放一正数表,表中之数作无序排列,并以“-1”作结束标志。

编程实现在表中找出最小数。

(3AH存放在运行程序时的最小的数)ORG 0030HMOV R0,#listMOV A,@R0 ;取第一个正数LOOP: INC R0 ;指向下一个正数MOV 3AH,@R0CJNE A,3AH,CHK ;前一个数与后一个数比较CHK: JC LOOP1 ;前一个数小,则转MOV A,@R0 ;前一个数大,取后一个数LOOP1: XCH A,3AHCJNE A,#0FFH,LOOPXCH A,3AH ;取最小数MOV 3BH,A SJMP $3.内部RAM的X,Y 单元中各存放一个带符号的数,试编程实现按如下条件进行的运算,并将结果存入Z单元中。

若X为正奇数,Z =X+Y;若X为正偶数,Z =X∨Y;若X为负奇数,Z =X∧Y;若X为负偶数,Z =X⊕Y。

分析:负数:第7位为1,正数:第7位为0 奇数:第0位为1,偶数:第0位为0 ORG 0000H MOV A,20H CLR C RL A JC FS ;移到负数处处理RR A RR A ;第0位移到C 再判定一下是不是1 JC ZJS ;到正奇数处MOV A,20H ORL A,21H MOV 22H,A SJMP OKZJS: MOV A,20H ADD A,21H MOV 22H,A SJMP OKFS: MOV A,20H CLR C RR A JC FJS ;第0位是1,移到正奇数处理MOV A,20H XRL A,21H MOV 22H,A SJMP OKFJS: MOV A,20H ANL A,21H MOV 22H,A OK: END4、把一个8位二进制数的各位用ASCII码表示之(亦即为“0”的位用30H表示,为“1”的位用31H表示)。

单片机经典子程序例题

单片机经典子程序例题

(1)HBCD——单字节十六进制整数转换成单字节BCD码整数入口条件:待转换的单字节十六进制整数在累加器A中。

出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。

影响资源:PSW、A、B、R3 堆栈需求:2字节HBCD: MOV B,#100 ;分离出百位,存放在R3中DIV ABMOV R3,AMOV A,#10 ;余数继续分离十位和个位XCH A,BDIV ABSWAP AORL A,B ;将十位和个位拼装成BCD码RET(2)BCDH——单字节BCD码整数转换成单字节十六进制整数入口条件:待转换的单字节BCD码整数在累加器A中。

出口信息:转换后的单字节十六进制整数仍在累加器A中。

影响资源:PSW、A、B、R4 堆栈需求:2字节BCDH: MOV B,#10H ;分离十位和个位DIV ABMOV R4,B ;暂存个位MOV B,#10 ;将十位转换成十六进制MUL ABADD A,R4 ;按十六进制加上个位RET(3)FDS1——顺序查找(ROM)单字节表格入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。

出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。

影响资源:PSW、A、B、R2、R6 堆栈需求:2字节FDS1: MOV B,A ;保存待查找的内容MOV R2,#0 ;顺序号初始化(指向表首)MOV A,R7 ;保存表格的长度MOV R6,AFD11: MOV A,R2 ;按顺序号读取表格内容MOVC A,@A+DPTRCJNE A,B,FD12;与待查找的内容比较CLR OV ;相同,查找成功MOV A,R2 ;取对应的顺序号RETFD12: INC R2 ;指向表格中的下一个内容DJNZ R6,FD11 ;查完全部表格内容SETB OV ;未查找到,失败RET(4)DDM1——求单字节十六进制无符号数据块的平均值入口条件:数据块的首址在DPTR中,数据个数在R7中。

单片机常用子程序

单片机常用子程序
// P3.0~P3.3,第1~4列
// P3.4~P3.7,第1~4行
// 0 1 2 3
// 4 5 6 7
// 8 9 10 11
// 12 13 14 15
//****************************************************
void delay(unsigned int t)
while(P3!=0xf0);//等待按键弹出
//beep();
return(key);
}
void main()
{
while(1)
{
unsigned char key;
key=ScanKey44();
switch(key)
{
case 0x11:key=0; break; //0
case 0x24:key=6; break; //6
case 0x28:key=7; break; //7
case 0x41:key=8; break; //8
case 0x42:key=9; break; //9
case 0x44:key=10; break; //10
key=P3&0x3c;
while((P3&0x3c)!=0x3c); //等待弹出
//beep();
return(key);
}
#define S1 0x0e
#define S2 0x0d
#define S3 0x0b
#define S4 0x07
//4个简单按键扫描子程序
case 0x12:key=1; break; //1

单片机以及C程序例题1000题非常强大适合初学到中级的人

单片机以及C程序例题1000题非常强大适合初学到中级的人
JNB P3.5,$ Fra bibliotekINC 31H
MOV 30H,#SONG3
JMP NEXT
END3:
MOV A,31H
XRL A,#03H
JNZ END4
JB P3.5,$
CALL DELAY1
JNB P3.5,$
INC 31H
DB 84H,64H,54H,44H
DB 52H,42H,52H,62H,48H
DB 00H
SONG5: ;妹妹背着洋娃娃
;1
DB 84H,02H,82H,64H,54H
DB 64H,54H,48H
DB 64H,02H,52H,44H,24H
DB 14H,24H,18H
MOV 21H,A
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A
MOV 20H,A
SETB TR0
D1: CALL DELAY
INC 30H
JMP NEXT
END0: CLR TR0
MOV A,31H
DB 44H,54H,64H,44H
DB 64H,74H,88H
DB 64H,74H,88H
;2
DB 82H,92H,82H,72H,64H,44H
DB 82H,92H,82H,72H,64H,44H
DB 44H,84H,48H
DB 44H,14H,48H
{
while(1) //大循环
{
led1=0; /*点亮第一个发光二极管*/
delayms(200); //延时200毫秒

单片机试题库(编程题)

单片机试题库(编程题)

编程题:2.编一个子程序,将寄存器R0中的内容*10(积<256)3.编程将片内RAM 30H单元开始的15B的数据送到片外RAM 3000H开始的单元中去.4.用查表法编一子程序,将40H单元中的BCD码转换成ASCII码.4.片内RAM50H、51H单元中有一个10B的二进制数,高位在前,低位在后,请编程将其求补,存回原单元中去。

5.片内RAM30H开始的单元中有10B的二进制数,请编程求它们的和。

6.R1中存有一BCD码,请编程将它转换成ASKII码,存入外RAM1000H单元中去。

7.编一个程序,将累加器中的一个字符从串行接口发送出去。

8.片外RAM2000H开始的单元中有5B的数据,编程将它们传送到片内RAM20H开始的单元中去。

9 用查表法编一子程序,将R3中的BCD码转换成ASKII码。

10.片内RAM40H开始的单元内有10B二进制数,编程找出其中最大值并存于50H单元中。

11.编程将片外RAM3000H开始的20B的数据传送到片内RAM30H开始的单元中。

12.编程将R1、R2中的16位二进制数增1后送回原单元。

13.编程将片内RAM40H开始的单元存放的10B的二进制数传送到片外RAM4000H开始的单元中去。

14.编一子程序,从串行接口接受一个数据。

15.编写将30H和31H单元中2B二进制数乘2的子程序。

16.片外RAM2000H单元中有一BCD码,编程将其转换成ASKII码。

17.试编制单字节BCD码数的减法程序。

18.利用调子程序的方法,进行两个4B无符号数相加。

请编主程序及子程序。

19.若图11-2中数据为无符号数,求数据中最大值送A 。

编程并注释。

图11-2 片外 RAM中的数据块片外 RAM0001H┆20. 若图11-2中数据块是有符号数,求正数个数。

编程并注释。

21. 若图11-2中数据块为无符号数,求其累加和。

编程并注释。

22.已知20H单元有一位十进制数,通过查表找出与其对应的共阴极七段码,并存于30H单元。

单片机汇编语言经典一百例

单片机汇编语言经典一百例

单片机汇编语言经典一百例汇编语言是一种底层的程序设计语言,是一种将汇编指令直接翻译成机器指令的语言。

在单片机编程中,掌握汇编语言是非常重要的,因为它可以充分发挥单片机的性能,并且提高程序的运行效率。

本文将介绍一百个经典的单片机汇编语言例子,帮助读者更好地理解汇编语言的使用。

1. 点亮LED灯```ORG 0x0000 ; 程序起始地址MOV P1, #0xAA ; P1口输出高电平,LED灯点亮END ; 程序结束```2. LED流水灯效果```ORG 0x0000 ; 程序起始地址MOV P1, #0x01 ; P1口输出低电平,第一个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x02 ; P1口输出低电平,第二个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x04 ; P1口输出低电平,第三个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x08 ; P1口输出低电平,第四个LED点亮CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```3. 数码管动态扫描显示```ORG 0x0000 ; 程序起始地址CLR P0.0 ; P0.0口输出低电平,选择第一个数码管MOV P2, #0x7E ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.1 ; P0.1口输出低电平,选择第二个数码管MOV P2, #0x30 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.2 ; P0.2口输出低电平,选择第三个数码管MOV P2, #0x6D ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.3 ; P0.3口输出低电平,选择第四个数码管MOV P2, #0x79 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```...通过以上例子,我们可以看到单片机汇编语言的应用非常广泛,可以实现各种各样的功能。

单片机程序设计试题.docx

单片机程序设计试题.docx

一、填空题1.执行程序:MOVA, #OAOHADDA, #60H后,A的内容是_______ o2.执行程序:MOV SP, #62HMOV 62H, #50HMOV 61H,#40HPOP DPHPOP DPL后,DPTR的内容是_______ , SP的内容是________ o3.如果打开89S51的两个外部中断(其余中断关闭),应给以下语句赋值为:IE= __________ ;4.89S51共有______ 个定时计数器。

5.当P1 口做输入口输入数据时,必须先向该端口的锁存器写入______ ,否则输入数据可能出错。

6.89S51单片机的电源引脚标号是________ 和_________ =7.在外扩ROM、RAM或I/O设备时,8051单片机的 _________ 口接8位数据总线,______ 口为低8位地址线,_______ 口为高8位地址线。

&执行程序:MOV A, #02HMOV DPTR, #1000HMOVX A, @A+DPTRAJMP$ORG 1000HDB 12H 34H 56H 78H 9AH OBCH ODEH 0F0H 后,A的内容是。

9.若89S51单片机使用的频率为12MHz,那么指令:NOP的执行时间是____ 微秒,它占用_______ 个字节。

10.如果同时打开89S51的0#中断和1#中断(其余中断关闭),应给以下C51语句赋值为:IE= __________ ;11.将单片机的内部定时/计数器1设为工作方式2的计数器,其C51语句为:TMOD = ____________ ;12.启动定时器1的C51语句为:TR1 = ____________13.89S51的P1 口每个引脚最大可吸收约________ mA电流,8个引脚共可吸收约______ mA电流。

14.74LS244为_______ 口扩展芯片。

15.89C51单片机的电源引脚标号是 ______ o16.在外扩ROM、RAM或I/O设备时,8051单片机的_________ 口接8位数据总线。

经典单片机编程100例

经典单片机编程100例

经典单片机编程100例单片机是指具有微处理器内核、存储器和输入输出设备的集成电路芯片。

它广泛应用于各种电子设备中,例如家用电器、汽车电子、工业自动化等领域。

单片机编程是指通过给单片机内部写入特定的指令,使其按照程序逻辑完成特定的功能。

本文将介绍经典的单片机编程实例,帮助读者更好地理解和掌握单片机编程的基本原理和技巧。

1. LED闪烁程序在单片机编程中,最简单的实例之一就是控制LED灯的闪烁。

通过设置相应的IO口为输出模式,并在循环中对该IO口进行高低电平的切换,可以实现LED的闪烁效果。

以下是一个基本的LED闪烁程序示例:```c#include <reg51.h>sbit LED = P1^0;void delay(unsigned int t){while(t--);}void main(){while(1){LED = 0; // 点亮LEDdelay(50000);LED = 1; // 熄灭LEDdelay(50000);}}```上述代码中,通过设置P1口的第0位为1或者0,控制LED的亮灭状态,并在两个状态之间加入适当的延时,从而实现LED的闪烁。

2. 按键控制LED开关在单片机编程中,常常需要通过外部输入设备来控制其他设备的状态。

例如,通过按下按钮来控制LED的开关。

以下是一个简单的按键控制LED开关的程序示例:```c#include <reg51.h>sbit LED = P1^0;sbit Key = P0^0;void delay(unsigned int t){while(t--);}void main(){while(1){if(Key==0) // 如果按键被按下{LED = ~LED; // 取反LED的状态delay(50000); // 延时一段时间,防止按键抖动 while(Key==0); // 等待按键释放}}}```上述代码中,通过检测P0口的第0位,判断是否有按键按下。

单片机编程题(经典)

单片机编程题(经典)

单片机编程题(经典)一、编程题(每小题4分,共20分)1.已知在累加器A中存放一个BCD数(0~9),请编程实现一个查平方表的子程序。

2.请使用位操作指令实现下列逻辑操作:BIT=(10H∨P1.0)∧(11H∨CY)3.已知变量X存于VAR单元,函数值Y存于FUNC单元,按下式编程求Y值。

Y=10 01xxx> -=<?4.已知在R2中存放一个压缩的BCD码,请将它拆成二个BCD字节,结果存于SUM开始的单元中(低位在前)。

5.将存于外部RAM 8000H开始的50H数据传送0010H的区域,请编程实现。

编程题(每小题4分,共20分)1.SQR:1NC AMOVC A,@A+PCRETTAB:DB 0,1,4,9,16DB 25,36,49,64,812.ORL C,11HMOV 12H,CMOV C,P1.0ORL C,/10HANL C,12HMOV BIT,CRET3. MOV A,VARCJNE A,#0,COMPSJMP RES ;x=0,Y=0 COMP:JNC POSI ;x>0,Y=1 MOV A,#0FFH ;x<0,Y=-1 SJMP RESPOSI:MOV A,#01H RES:MOV FUNC,ARET4.MOV R0,#SUMMOV A,R2ANL A,#OFHMOV @R0,A ;存低字节BCD MOV A,R2ANL A,#0F0HSWAP A1NC R0MOV @R0,A ;存高字节BCD RET5. MOV DPTR,#8000H MOV R0,#10HMOV R2,#50HLOOP:MOVX A,@DPTR ;取数MOVX @R0,A ;存数1NC DPTR1NC R0DJNZ R2,LOOPRET二、编程题(10分)将内部RAM20H为首的16个单元的8位无符号数排序写出程序,并作适当注释SORT: MOV R0, #20HMOV R7,#07HCLR TR0 ;交换标志位复位LOOP: MOV A,@R0MOV 2BH, AINC R0MOV 2AH, @R0CLR CSUBB A, @R0;比较前后两个数JC NEXT ;MOV @R0, 2BHDEC R0MOV @R0, 2AHINC R0SETB TR0 ;置交换标志位有效NEXT: DJNZ R7, LOOPJB TR0, SORT;若交换标志位有效,继续进行HERE: SJMP $三、编程序***1.请使用位操作指令,实现下列逻辑操作:P1.5=ACC.2∧P2.7∨ACC.1∧P2.02.在外部RAM首地址为TABLE的数据表中有10个字节数据,请编程将每个字节的最高位无条件地置1。

单片机 c语言例题

单片机 c语言例题

单片机 c语言例题单片机 C 语言例题在单片机教学中,C 语言的例题是帮助学生理解和掌握单片机编程的重要工具。

通过例题的学习,学生可以更好地理解C语言语法和单片机的工作原理。

本文将介绍几个单片机 C 语言例题,帮助读者更好地了解单片机的应用。

例题一:LED 灯的闪烁以下是一个简单的单片机 C 语言例题,通过控制单片机上的LED 灯,实现灯的闪烁效果。

```c#include <reg51.h> // 单片机头文件// 主函数void main() {while(1) { // 循环执行P1 = 0x00; // 将 P1 置为低电平(LED 灯熄灭)Delay(); // 延时P1 = 0xFF; // 将 P1 置为高电平(LED 灯亮)Delay(); // 延时}}// 延时函数void Delay() {int i, j;for(i = 0; i < 800; i++) { // 大约延时 1 秒for(j = 0; j < 1000; j++) {}}}```在上述例题中,我们使用了一个延时函数 `Delay()`,通过循环控制LED 灯的亮灭状态,实现了灯的闪烁效果。

通过修改延时循环,可以改变灯闪烁的频率。

例题二:数码管显示数字以下是另一个单片机 C 语言例题,通过控制单片机上的数码管,实现数字的显示效果。

```c#include <reg51.h> // 单片机头文件sbit LED = P2^0; // 数码管的引脚定义// 数码管显示数字函数void Display(int num) {switch (num) {case 0: LED = 0xFC; break; // 数字0显示case 1: LED = 0x60; break; // 数字1显示case 2: LED = 0xDA; break; // 数字2显示case 3: LED = 0xF2; break; // 数字3显示case 4: LED = 0x66; break; // 数字4显示case 5: LED = 0xB6; break; // 数字5显示case 6: LED = 0xBE; break; // 数字6显示case 7: LED = 0xE0; break; // 数字7显示case 8: LED = 0xFE; break; // 数字8显示case 9: LED = 0xF6; break; // 数字9显示default: LED = 0xFF; break; // 其他情况,不显示数字 }}// 主函数void main() {int num = 0; // 待显示的数字while(1) { // 循环执行Display(num); // 数码管显示数字num++; // 数字自增if (num > 9) { // 数字大于9后重置为0 num = 0;}Delay(); // 延时}}// 延时函数void Delay() {int i, j;for(i = 0; i < 800; i++) { // 大约延时 1 秒 for(j = 0; j < 1000; j++) {}}}```在上述例题中,我们通过控制数码管的引脚,并编写了一个显示数字的函数 `Display()`,通过循环控制数码管显示不同的数字,实现了数字的切换和显示效果。

单片机程序设计例题

单片机程序设计例题

例4 把内部RAM中从ST1地址开始存放的数据传 送到以ST2开始的存储区中,数据块长度未知, 但已知数据块的最后一个字节内容为00H,而其 它字节均不为0。并设源地址与目的地址空间不 重复。 分析:显然,我们可以利用判断每次传送的 内容是否为 0 这一条件来控制循环。也可用 CJNE来比较与0是否相等设计。 利用判A转移控制的循环流程图如下图所示。
START: CLR MOV MOVX MOV INC MOVX SUBB JC MOVX SJMP BIG1:XCH BIG2:INC MOVX SJMP C DPTR,#ST1 A, @DPTR R7, A DPTR A, @DPTR A, R7 BIG1 A, @DPTR BIG2 A, R7 DPTR @DPTR,A $
例2 计算50个8位二进制数(单字节)之和。 要求:50个数存放在30H开头的内部RAM中, 和放在R6R7中。 分析:采用DJNZ循环体的流程框图如下页所 示,在参考程序中,R0为数据地址指针,R2为 减法循环计数器。 需要指出的是,在使用DJNZ控制时,循环计 数器初值不能为0,当为0时,第一次进入循环 执行到DJNZ时,减1使R2变为FFH,循环次数成 了256,显然不合题意。
例2流程、程序如下: START:MOV R6, MOV R7, MOV R2, MOV R0, LOOP: MOV ADD A A, MOV R7, CLR A ADDC A, MOV R6, INC R0 DJNZ R2, SJMP
#0 #0 #50 #30H A, R7 @R0 A R6 A LOOP $
例4参考程序如下:
START: MOV R0, #ST1 MOV R1, #ST2 LOOP: MOV A, JZ ENT @R0

单片机程序设计题库及答案

单片机程序设计题库及答案

单片机程序设计题库及答案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 中。

单片机典型例题

单片机典型例题

单片机典型例题[例题] 指出下列指令的寻址方式MOV A,R1 ;A←(R1)寄存器寻址ADD A,#05H ; A←(A)+立即数05H 立即寻址MOV A,@R1 ; A ←((R1)) 寄存器间接寻址MOV 30H,4AH ; 30H ←(4AH)直接寻址MOVC A,@A+DPTR ;A←((A)+(DPTR)) 变址寻址SJMP LP ; PC←(PC)+ 2 + 偏移量相对寻址MOV C, 65H ; Cy ←(65H))位寻址【例】MOV DPTR,#1234H ;(DPTR)=1234H该指令也可以用两条8位数据传送指令实现:MOV DPH,#12H ;(DPH)=12HMOV DPL,#34H ;(DPL)=34H,(DPTR)=1234H例1:读下面程序,写出41H、42H单元内容MOV R0,#40HMOV R1,#41HMOV A,#11HMOV 40H,#32HMOV @R1,AMOV 42H ,@R0解:(41H)=11H,(42H)=32H例2:将片内RAM中30H~3FH单元的内容复制到50H~5FH单元中。

MOV R0,#30H ;30h →R0MOV R1,#50H ;50h →R1MOV R7,#10H ;10h →R7LOOP:MOV A,@R0 ;( (R0 )) →AMOV @R1,A ;A →(R1 )INC R0 ;(R0 )+1 →R0INC R1 ;(R1 )+1 →R1DJNZ R7,LOOP ;R7内容不为零转LOOPRET例1 :已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。

【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次MOVX 指令完成此操作。

ORG 2000HMOV R0,#88H ;为8位指针赋值MOVX A,@R0 ;取x 到累加器AMOV DPTR,#1818H ;为16位指针赋值MOVX @DPTR,A ;x 送RAM的1818h单元已知RAM50h单元有一个0~9的数,试编程将它变成相应的ASCII码。

单片机编程练习题(含部分答案)

单片机编程练习题(含部分答案)

单片机编程练习题(含部分答案)单片机编程练习题(含部分答案)在单片机编程的学习过程中,练习题是非常重要的一部分。

通过完成各种编程练习,我们可以提高自己的编程能力,掌握单片机的各种功能和应用。

本文将介绍一些常见的单片机编程练习题,并提供部分答案,帮助读者更好地理解相关知识。

一、LED亮灯顺序控制题目描述:使用单片机控制4个LED灯按指定的顺序依次亮起。

解答思路:首先,我们需要定义4个LED灯的引脚,使用宏定义的方式可以方便地修改引脚号码。

然后,在主函数中通过设置引脚输出高电平或低电平的方式控制LED灯的亮灭状态。

可以使用延时函数来控制每个LED灯亮起的时间。

代码示例:```#include <reg51.h>#define LED1 P1_0#define LED2 P1_1#define LED3 P1_2#define LED4 P1_3void delay(unsigned int time) // 延时函数{unsigned int i, j;for (i = time; i > 0; i--)for (j = 110; j > 0; j--);}void main(){LED1 = 0; // LED1灭LED2 = 0; // LED2灭LED3 = 0; // LED3灭LED4 = 0; // LED4灭while (1){LED1 = 1; // LED1亮delay(1000); // 延时1秒LED1 = 0; // LED1灭LED2 = 1; // LED2亮delay(1000); // 延时1秒LED2 = 0; // LED2灭LED3 = 1; // LED3亮delay(1000); // 延时1秒LED3 = 0; // LED3灭LED4 = 1; // LED4亮delay(1000); // 延时1秒LED4 = 0; // LED4灭}}```二、数码管计数器题目描述:使用单片机控制数码管显示一个0~9的计数器。

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

(1)HBCD——单字节十六进制整数转换成单字节BCD码整数
入口条件:待转换的单字节十六进制整数在累加器A中。

出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。

影响资源:PSW、A、B、R3 堆栈需求:2字节
HBCD: MOV B,#100 ;分离出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余数继续分离十位和个位
XCH A,B
DIV AB
SWAP A
ORL A,B ;将十位和个位拼装成BCD码
RET
(2)BCDH——单字节BCD码整数转换成单字节十六进制整数
入口条件:待转换的单字节BCD码整数在累加器A中。

出口信息:转换后的单字节十六进制整数仍在累加器A中。

影响资源:PSW、A、B、R4 堆栈需求:2字节
BCDH: MOV B,#10H ;分离十位和个位
DIV AB
MOV R4,B ;暂存个位
MOV B,#10 ;将十位转换成十六进制
MUL AB
ADD A,R4 ;按十六进制加上个位
RET
(3)FDS1——顺序查找(ROM)单字节表格
入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。

出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。

影响资源:PSW、A、B、R2、R6 堆栈需求:2字节
FDS1: MOV B,A ;保存待查找的内容
MOV R2,#0 ;顺序号初始化(指向表首)
MOV A,R7 ;保存表格的长度
MOV R6,A
FD11: MOV A,R2 ;按顺序号读取表格内容
MOVC A,@A+DPTR
CJNE A,B,FD12;与待查找的内容比较
CLR OV ;相同,查找成功
MOV A,R2 ;取对应的顺序号
RET
FD12: INC R2 ;指向表格中的下一个内容
DJNZ R6,FD11 ;查完全部表格内容
SETB OV ;未查找到,失败
RET
(4)DDM1——求单字节十六进制无符号数据块的平均值
入口条件:数据块的首址在DPTR中,数据个数在R7中。

出口信息:平均值在累加器A中。

影响资源:PSW、A、R2~R6 堆栈需求:4字节
DDM1: MOV A,R7 ;保存数据个数
MOV R2,A
PUSH DPH
PUSH DPL
CLR A ;初始化累加和
MOV R4,A
MOV R5,A
DM11: MOVX A,@DPTR ;读取一个数据
ADD A,R5 ;累加到累加和中
MOV R5,A
JNC DM12
INC R4
DM12: INC DPTR ;调整指针
DJNZ R2,DM11 ;累加完全部数据
LCALL D457 ;求平均值(R4R5/R7-→R3)
MOV A,R3 ;取平均值
POP DPL
POP DPH
RET
(5)SORT——单字节无符号数据块排序(增序)
气泡排序算法:
气泡排序法是依托比较相邻的一对数据,如不符合规定的递增(或递减)顺序,则交换两个数据的位置,第一对比较完毕后,接着比较第二对,直到清单中所有的数据依次比较完成,第一轮比较结束,这是最大(小)的数据降到清单的最低位置。

第一轮排序需要进行N-1次比较。

第二轮比较需要进行N-2次比较,第二轮结束后,次最大(小)的数据排底部第二位置上。

重复上述过程,直到全部排完。

入口条件:数据块的首址在R0中,字节数在R7中。

出口信息:完成排序(增序)
影响资源:PSW、A、R2~R6 堆栈需求:2字节
SORT: MOV A,R7
MOV R5,A ;比较次数初始化
SRT1: CLR F0 ;交换标志初始化
MOV A,R5 ;取上遍比较次数
DEC A ;本遍比上遍减少一次
MOV R5,A ;保存本遍次数
MOV R2,A ;复制到计数器中
JZ SRT5 ;若为零,排序结束
MOV A,R0 ;保存数据指针
MOV R6,A
SRT2: MOV A,@R0 ;读取一个数据
MOV R3,A
INC R0 ;指向下一个数据
MOV A,@R0 ;再读取一个数据
MOV R4,A
CLR C
SUBB A,R3 ;比较两个数据的大小
JNC SRT4 ;顺序正确(增序或相同),不必交换
SETB F0 ;设立交换标志
MOV A,R3 ;将两个数据交换位置
MOV @R0,A
DEC R0
MOV A,R4
MOV @R0,A
INC R0 ;指向下一个数据
SRT4: DJNZ R2,SRT2 ;完成本遍的比较次数
MOV A,R6 ;恢复数据首址
MOV R0,A
JB F0,SRT1 ;本遍若进行过交换,则需继续排序SRT5: RET ;排序结束
END
(6)MM——求单字节十六进制无符号数据块的极值
入口条件:数据块的首址在DPTR中,数据个数在R7中。

出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。

影响资源:PSW、A、B、R1~R7 堆栈需求:4字节MM: MOV B,R7 ;保存数据个数
MOVX A,@DPTR ;读取第一个数据
MOV R6,A ;作为最大值的初始值
MOV R7,A ;也作为最小值的初始值
MOV A,DPL ;取第一个数据的地址
MOV R3,A ;作为最大值存放地址的初始值
MOV R5,A ;也作为最小值存放地址的初始值
MOV A,DPH
MOV R2,A
MOV R4,A
MOV A,B ;取数据个数
DEC A ;减一,得到需要比较的次数
JZ MME ;只有一个数据,不需要比较
MOV R1,A ;保存比较次数
PUSH DPL ;保护数据块的首址
PUSH DPH
MM1: INC DPTR ;指向一个新的数据
MOVX A,@DPTR ;读取这个数据
MOV B,A ;保存
CLR C;与最大值比较
SUBB A,R6
JC MM2 ;不超过当前最大值,保持当前最大值
MOV R6,B ;超过当前最大值,更新最大值存放地址 MOV R2,DPH ;同时更新最大值存放地址
MOV R3,DPL
SJMP MM3
MM2: MOV A,B ;与最小值比较
CLR C
SUBB A,R7
JNC MM3 ;大于或等于当前最小值,保持当前最小值MOV R7,B ;更新最小值
MOV R4,DPH ;更新最小值存放地址
MOV R5,DPL
MM3: DJNZ R1,MM1 ;处理完全部数据
POP DPH ;恢复数据首址
POP DPL
MME: RET。

相关文档
最新文档