单片机原理与应用-基于汇编、C51及混合编程1-11章习题解答 下载本文

TL2 DATA 0CCH RCAP2L DATA 0CAH RCAP2H DATA 0CBH T2MOD DATA 0C9H T2CON DATA 0C8H TR2 BIT 0CAH TF2 BIT 0CFH ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV T2CON,#00H;T2工作在时钟输出方式 MOV T2MOD,#02H;T2输出时钟使能 MOV TL2,#0A0H;输出50Hz频率方波 MOV TH2,#15H MOV RCAP2L,#0A0H MOV RCAP2H,#15H

SETB TR2;T2开始工作 SJMP $

END

C51程序:

#include sfr T2MOD=0xC9; void main() {

T2CON=0x00; T2MOD=0x02;

TL2=0xA0;//输出50Hz频率方波 TH2=0x15; RCAP2L=0xA0; RCAP2H=0x15; TR2=1; while(1); }

7-11 简述STC12C5A60S2单片机的PCA模块的功能。

PCA每个模块都有自己的工作方式寄存器,通过对工作方式寄存器的设置,可以使各模块工作在定时方式(相当于定时、计数器)、捕获方式(相对应模块计数器所计数据进行捕获的方式,用于测量外部信号产生的时间间隔)、方波输出方式、输出信号脉宽调制(PWM)方式。

7-12假设系统时钟频率为12MHz,利用PCA模块的功能,分别用汇编语言和C51编程实现在P1.3引脚上间断重复输出频率为450Hz的

21

方波,持续和停止时间均为4s。

分析:将PCA模块的工作方式寄存器CCAPM0寄存器写为4DH,即PCA0设为时钟输出方式,从而可以在P1.3引脚自动翻转,输出方波,并允许PCA中断。要求方波频率为450hz,即周期为1/450,定时时间应设定为1/900s,选择计数器时钟来源为系统时钟频率的12分频,即工作方式寄存器CMOD设为00H,需要计数(1/900)/(12/12000000)=10000/9≈1111=0457H个时钟脉冲,可将CL、CH初始值设为零,CCAP0H设为04H,CCAP0L设为57H,在每次PCA中断里:将计数值加到比较匹配寄存器里CCAP0H、CCAP0L=CCAP0H、CCAP0L+0457H

启动PCA计数持续4秒(CR=1),停止(CR=0)持续4秒;

4秒钟定时:定时器T1,工作在方式1,计数时钟fosc/12,定时50毫秒,用R7计数T1中断80次产生4秒钟定时。

初值为N:由(65536-N)*1=50000得N=15536=3cb0H (1) 汇编程序:

CCON EQU 0D8H;PCA控制寄存器 CMOD EQU 0D9H;PCA模式寄存器 CL EQU 0E9H;PCA定时器的低8位 CH EQU 0F9H;PCA定时器的高8位

CCAPM0 EQU 0DAH; PCA模块0的模式寄存器

CCAP0L EQU 0EAH;PCA模块0的捕获寄存器的低8位 CCAP0H EQU 0FAH;PCA模块0的捕获寄存器的高8位 AUXR EQU 8EH

CR BIT CCON.6;PCA定时控制位 CF BIT CCON.7;PCA溢出标志位 ORG 0000H LJMP MAIN ORG 001BH LJMP T1_INT ORG 003BH LJMP PCA_INT ORG 0100H MAIN: CLR A MOV CCON,A;//(P197) MOV CL,A; MOV CH,A; MOV SP,#0BFH;初始化堆栈指针 MOV TMOD,#10H;T1工作在方式1 MOV TL1,#0B0H;给T1写入初值 MOV TH1,#3CH; ANL AUXR,#101111111H;//T1X12=0 MOV CCAPM0,#4DH;// 允许中断,输出方波

22

MOV CCAP0L,#57H; MOV CCAP0H,#04H; MOV CMOD,#0H;//FOSC/12时钟计数 MOV R7,#80;利用寄存器R7计数80次 SETB EA; SETB ET1; SETB TR1; SETB CR SJMP $

T1_INT: MOV TL1,#0B0H;给T1写入初值 MOV TH1,#3CH; DJNZ R7,NEXT; MOV C,CR CPL C MOV CR,C MOV R7,#80; NEXT:RETI PCA_INT: PUSH PSW PUSH ACC CLR CCF0

MOV A,CCAP0L ADD A,#57H MOV CCAP0L,A MOV A,CCAP0H ADDC A,#04H MOV CCAP0H,A POP ACC POP PSW RETI END

C51程序:

#include unsigned char i=0; unsigned int j=0; void main() {

TMOD=0x10; TL1=0x0B0; TH1=0x3C; CMOD=0x00; AUXR&=0x0BF; CCAPM0=0x4D; CCAP0L=0x57;

23

CCAP0H=0x04;

EA=1; ET1=1; TR1=1; CR=1; while(1); }

void T1_INT() interrupt 3 {

TH1=0x0B0; TH1=0x3C; i++; if(i==80) {

CR=~CR; i=0; } }

void pca_INT() interrupt 7 {

CCAP0L+=0x57; If(CCAP0L<0x57) {

CCAP0H+=0x01; }

CCAP0H+=0x04; }

7-13假设系统的时钟频率为11.0592MHz,利用PCA模块的PWM功能分别用汇编语言和C51编程实现输出400Hz且占空比为60%的矩形波。

分析:系统的时钟频率为11.0592MHz,根据公式PWM的频率

=PCA的时钟源频率,计算出PCA的时钟源频率为102400Hz,用T0的溢出作为

256PCA时钟源,11059200?102400=108,即对系统时钟源fosc进行108级分频,设T0工作在1T模式,T0的初值为256-108=148=94H,由占空比256-CCAP0L==0.6,可计算出CCAP0L=66H,CMOD寄存器应赋值为04H,

256CCAPM0寄存器初值为42H。

24