单片机答案汇编

发布时间 : 星期四 文章单片机答案汇编更新完毕开始阅读

MOV TMOD, #01H ;T0在工作方式1 MOV TH0, #3CH MOV TL0, #0B0H SETB EA SETB ET0 SETB TR0

S0: AJMP S0 ;此处放任意程序段 TIME0: PUSH ACC PUSH PSW MOV P1, R7 MOV A, R7 RL A

MOV R7, A

MOV TH0, #3CH MOV TL0, #0B0H POP PSW POP ACC RETI END

7-11 编写一段程序,功能要求为:当P1.0引脚的电平正跳变时,对P1.1的输入脉冲进行计数;当P1.2引脚的电平负跳变时,停止计数,并将计数值写入R0、R1(高位存R1,低位存R0)。 答:将P1.1的输入脉冲接入T0,即使用T0计数器完成对P1.1口的脉冲计数。R2中记T0计满数的次数。

程序代码如下: ORG 0000H LJMP MAIN ORG 000BH LJMP IT0

MAIN: JNB P1.0, MAIN

MOV TMOD, #05H ;定时/计数器T0为计数方式1 SETB TR0 ;启动T0,开始计数 SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 WAIT: JB P1.2, WAIT CLR EA CLR TR0

MOV R1, TH0 MOV R0, TL0 AJMP $ IT0: INC R2 RETI

7-18 为什么定时/计数器T1用做串行口波特率发生器时,应采用方式2?若已知时钟频率、通信波特率,如何计算其初值?

答:因为方式2是有自动重装载计数值的功能,从而可以产生精确的波特率。串行工作方式0和方式2波特率是固定的,所以不用设初值;串行工作方式1和方式3时:

波特率:BR = (2

SMOD

×T)/32

dd

osc

溢出一次的时间:1/T= (256-TH1)*12/f 溢出率:T= f/[12×(256-TH1)]

d

osc

初值:TH1 = 256- f/(12* T)

osc

d

7-19 若晶体振荡器为11.059MHz,串行口工作于方式1,波特率为4800b/s,写出用T1作为波特率发

生器的方式控制字和计数初值。 答: MOV TMOD, #20H

MOV TH1, #0FAH

MOV TL1, #0FAH SETB TR1

MOV SCON, #50H

7-20 利用单片机串行口扩展24个发光二极管和8个按键,要求画出电路图并编写程序使24个发光二极管按照不同的顺序发光(发光的时间间隔为1s)。 答: ORG 1000H

START: MOV SCON, #00H ;串行口工作方式0 MOV R0, #00H MOV R7, #03H MOV R6, #24H

CLR P1.0 ;关闭并行输出 LOOP: MOV A, @R0

MOV DPTR, #TAB ;查表取数,送出 MOVC A, @A+DPTR MOV SBUF, A

OUT0: JNB TI, OUT0 INC R0 CLR TI

DJNZ R7, LOOP

SETB P1.0 ;开启并行输出 ACALL DELAY DJNZ R6, START AJMP LOOP

DELAY: MOV R2, #250 D1: MOV R3, #100 D2: MOV R4, #20 D3: DJNZ R4, D3 DJNZ R3, D2 DJNZ R2, D1 RET

TAB: DB 00000000B, 00000000B, 00000001B, 00000000B DB 00000000B, 00000010B, 00000000B, 00000000B DB 00000100B, 00000000B, 00000000B, 00001000B DB 00000000B, 00000000B, 00010000B, 00000000B DB 00000000B, 00100000B, 00000000B, 00000000B DB 01000000B, 00000000B, 00000000B, 10000000B DB 00000000B, 00000001B, 00000000B, 00000000B DB 00000010B, 00000000B, 00000000B, 00000100B DB 00000000B, 00000000B, 00001000B, 00000000B DB 00000000B, 00010000B, 00000000B, 00000000B DB 00100000B, 00000000B, 00000000B, 01000000B DB 00000000B, 00000000B, 10000000B, 00000000B DB 00000001B, 00000000B, 00000000B, 00000010B DB 00000000B, 00000000B, 00000100B, 00000000B DB 00000000B, 00001000B, 00000000B, 00000000B DB 00010000B, 00000000B, 00000000B, 00100000B DB 00000000B, 00000000B, 01000000B, 00000000B DB 00000000B, 10000000B, 00000000B, 00000000B END

11-4 试设计一个顺序开关灯控制器,要求当按钮K第一次按下时,灯A立刻亮,灯B在延时11秒钟后亮,在灯B亮后15秒,灯C亮;当按钮K第2次按下时,灯C立刻灭,延时17秒后灯B灭,灯B灭后12秒,灯A灭。

#include

#define uint unsigned int unsigned char sum=0;

void delay(char);

sbit asight=P1^0; /*A灯*/ sbit bsight=P1^1; /*B灯*/ sbit csight=P1^2; /*C灯*/ void key1() {

asight=1; /*A灯亮*/ delay(11);

bsight=1; /*B灯亮*/ delay(15);

csight=1; /*C灯亮*/ }

void key2() {

csight=0; /*C灯灭*/ delay(17);

bsight=0; /*B灯灭*/ delay(12);

asight=0; /*A灯灭*/ }

void in_0() interrupt 0 using 0 {

switch (sum) {

case 0: {

key1(); sum++;

EX0=1; /*由于在执行中断之后EX和EA会硬件自动置0*/ EA=1; break; }

case 1: key2(); break; } }

void delay_1_s() /*延时1s*/ {

char wt=10; uint j;

while(wt--) {

j=9050; while(j--); } }

void delay(char s) /*延时N秒,参数s为需要延时的秒数*/ {

while(s--) {

delay_1_s(); } }

void main() {

P1=0x00;

EX0=1; EA=1; while(1) {;} }

联系合同范文客服:xxxxx#qq.com(#替换为@)