发布时间 : 星期五 文章单片机答案汇编更新完毕开始阅读268310a2f524ccbff121849a
单元中去。
答:#include
#include
unsigned int temp;
temp = DWORD[0x0030]; XWORD[0x1000] = temp; while(1); }
5-5 试编写一段程序,将外部数据存储器40H单元中的内容传送到50H单元。 答:方法一:
#include
XBYTE[0x0050] = XBYTE[0x0040]; while(1); }
方法二:
#include
unsigned char xdata *xp; unsigned char data temp; xp = 0x0040; temp = *xp; xp = 0x0050; *xp =temp; while(1); }
5-6 试编写—段程序,将R3中的数乘以4。 答:#include
void main(void) {
unsigned int data *a; #pragma asm
MOV 30H, R3 #pragma endasm a = 0x30; *a = *a*4; while(1); }
5-7 试编写—段程序,将R2中的各位倒序排列后送入R3中。
答:考虑C中没有循环移位,对于这种很低级的运算,采用嵌入汇编的方式完成。
#include
#pragma asm MOV R7, #08H MOV R3, #00H DEL: CLR CY MOV A, R2
RLC A
MOV R2, A MOV A, R3 RRC A MOV R3, A DJNZ R7, DEL #pragma endasm while(1); }
5-8 试编写—段程序,将P1口的高5位置位,低3位不变。 答:#include
void main(void) {
P1 |= 0xf8; while(1); }
5-9 设8次采样值依次存放在20H~27H的连续单元中,采用算术平均值滤波法求采样平均值,结果保留在30H单元中。试编写程序。 答:#pragma small
#include
unsigned char *dp = 0x20,i; float temp = 0; for(i=0;i<8;i++) {
temp += *dp; dp++; }
temp /= 8; dp = 0x30; *dp = temp; while(1); }
5-10 从20H单元开始有一无符号数据块,其长度在20H单元中。编写程序找出数据块中最小值,并
存入21H单元。 答:#pragma small
#include
unsigned char *dp, num, min, i; dp = 0x20; num = *dp; dp++;
for(i=1;i min = *dp; dp++; if(min>*dp) min = *dp; } dp = 0x21; *dp = min; while(1); } 6-10 某系统有三个外部中断源1、2、3,当某一中断源变低电平时便要求CPU处理,它们的优先处理次序由高到低为3、2、1,处理程序的入口地址分别为2000H、2100H、2200H。试编写主程序及中断服务程序(转至相应的 入口即可)。 答:对系统的三个外中断源,可利用MCS-51的2个外中断源INT0和INTI,再将定时/计 数器T1 作为扩展的外部中断使用,INT0接外中断源3,INTI接外中断源2,定时/计数器T1接外中断源1,3个中断源设置为同级中断,外中断源1、2、3依次接到P1.0、P1.1、P1.2上。 汇编语言程序代码如下: ORG 0000H ;复位入口地址 AJMP MAIN ;转主程序 ORG 0003H AJMP INT1 ORG 0100H MAIN: MOV TMOD, #60H ;T1方式2 MOV TH1, #0FFH MOV TL1, #0FFH ;置初值 SETB TR1 ;启动计数器T1 SETB EA ;CPU中断开放 SETB ET1 ;允许T1中断 SETB IT0 ;允许外中断0产生中断 SETB IT1 SETB PX0 ;外中断0为高级中断 SETB PX1 SETB PT1 SETB IT0 ;外中断0为跳沿触发方式 SETB IT1 LOOP1: SJMP LOOP1 ;等待中断 ;中断服务程序 ORG 1000H INT1: PUSH PSW ;保护现场 PUSH ACC JB P1.0,IR1 ;P1.0高,外中断1有请求 JB P1.1,IR2 ;P1.1高,外中断2有请求 JB P1.2,IR3 ;P1.2高,外中断3有请求 INTIR: POP ACC ;恢复现场 POP PSW RETI ;中断返回 ORG 2000H IR1: … … ;外中断1的中断处理程序 AJMP INTIR ORG 2100H IR2: … … ;外中断2的中断处理程序 AJMP INTIR ORG 2200H IR3: … … ;外中断3的中断处理程序 AJMP INTIR END 7-5 采用定时/计数器T0对外部脉冲进行计数,每计数100个脉冲后,T0转为定时工作方式。定时1ms后,又转为计数方式,如此循环不止。假定MCS-51单片机的晶体振荡器频率为6MHz,请使用方式1实现,要求编写出程序。 答: ORG 0000H START: CLR TR0 MOV TMOD, #05H MOV TH0, #0FFH MOV TL0, #9CH ;计数器初始化 S0: JBC TF0, NEXT SJMP S0 NEXT: CLR TR0 MOV TMOD, #01H MOV TH0, #0F8H MOV TL0, #30H ;定时器初始化 SETB TR0 S1: JBC TF0, START SJMP S1 END 7-7 编写程序,要求使用T0,采用方式2定时,在P1.0输出周期为400μs,占空比为10:1的矩形脉冲。 答:本题采用晶体振荡器频率为12MHz,使用定时器配合计数器,设计成一个40μs定时将P1.0置0和一个400μs定时将P1.0置1。 ORG 0000H ;中断入口地址 AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ORG 0030H START: MOV SP, #5FH MOV 30H, #00H ;软件计数器清零 MOV TMOD, #02H ;T0工作在方式1 MOV TH0, #216 MOV TL0, #216 SETB EA SETB ET0 SETB TR0 ;任意程序段 TIME0: PUSH ACC ;中断处理子程序 PUSH PSW CLR P1.0 INC 30H MOV A, 30H CJNE A, #10, T0_4 SETB P1.0 MOV 30H, #00H T0_4: POP PSW POP ACC RETI END 7-9 利用定时/计数器T0产生定时时钟,由P1口控制8个指示灯。编一个程序,使8个指示灯依次一个一 个闪动,闪动频率为20次/秒(8个灯依次亮一遍为一个周期)。 答:本题采用晶体振荡器频率为12MHz,每个灯的闪烁周期是:50ms,采用工作方式1。 ORG 0000H AJMP START ORG 000BH AJMP TIME0 ORG 0030H START: MOV SP, #5FH MOV R7, #0FEH