6、用汇编语言编写程序,将R0中的8位二进制数的各位用其ASCII码表示,结果保存到片内RAM的30H开始的单元中。
MOV R1,#30H MOV R7,#8 MOV A,R0 NEXT: RLC A
JC 0NE
MOV @R1,#30H JMP EXIT 或者 ONE: MOV @R1,#31H EXIT: INC R1
DJNZ R7,NEXT SJMP $ END
个数据块的第一字节用来存放数据块的长度。结果存入片内
MOV R0,#60H ACALL MAX
MOV B,A;第一个数据块最大值 MOV R0,#70H ACALL MAX
MUL AB;两个数据块最大值相乘 MOV 5FH,B MOV 5EH,A SJMP $
MAX: MOV A,@R0;数据块长度
DEC A MOV R7,A INC R0
MOV A,@R0;第一个数据
LOOP: CLR C
MOV B,A INC R0 MOV A,@R0
SUBB A,B;两个比较,也可以用CJNE实现 JNC NEXT MOV A,B SJMP NEXT1
$INCLUDE(C8051F020.INC) LOOP:MOV B,02H X DATA 30H Y EQU 20H ORG 0000H AJMP START ORG 0100H START:MOV DPTR,#TAB MOV SP,#3FH MOV R1,#X MOV Y,#00H MOV A,R0 DIV AB PUSH ACC MOV A,B MOVC A,@A+DPTR MOV @R1,A POP ACC INC R1 INC Y JNB Y.3,LOOP SJMP $ TAB :DB ‘0’,’1’ END 11、用汇编语言编程求两个无符号数据块中最大值的乘积。数据块的首地址分别为片内RAM的60H和70H,每
NEXT: ADD A,B
NEXT1:DJNZ R7,LOOP (下一行)RET 第4章:
5.利用C8051F020单片机的T0计数,每计10个脉冲,P1.0取反一次,试用查询和中断两种方式编程。 确定工作方式,计算初值:选方式2计数方式,初值=256-10=246=0xf6; 查询方式程序: sbit P1_0=P1^0; void main(void) {
//关看门狗 WDTCN=0xde; WDTCN=0xad; //配置交叉开关
XBR1=0x02;//允许T0外部输入 XBR2=0x40;//使能交叉开关 //初始化定时器0
TMOD=0x06;// 方式2计数 TL0=OxF6; TH0=OxF6; TR0=1;//启动T0 While(1) {
While(!TF0);//等待计数溢出 TF0=0; P1_0=!P1_0; } }
中断方式程序: sbit P1_0=P1^0; void main(void) {
//关看门狗 WDTCN=0xde; WDTCN=0xad; //配置交叉开关
XBR1=0x02;//允许T0外部输入 XBR2=0X40; //初始化定时器0
IE|=0x82;//允许T0中断 While(1);//等待中断 }
void T0_ISR(void) interrupt 1 {
P1_0=!P1_0; }
TMOD=0x06;// 方式2计数 TL0=OxF6; TH0=OxF6; TR0=1;//启动T0
8.在C8051F020单片机中,已知系统时钟频率为12MHz,编写程序使P1.0和P1.1分别输出周期为2ms和50μs的方波。
解:P1.0和P1.1分别每1ms和25μs取反一次即可。选T0方式1定时25μs,每溢出40次P1.0取反一次。初值计算:由P157公式:TC?2N?T12(1?T0M)?fosc,选T0M=0得: 程序:
sbit P1_0=P1^0; sbit P1_1=P1^1; int count=40; void main(void) {
//关看门狗 WDTCN=0xde; WDTCN=0xad; //使能交叉开关 XBR2=0x40; //初始化定时器0
TMOD=0x01;// 方式1定时 TL0=0xe7; TH0=0xff;
IE|=0x82;//允许T0中断 TR0=1;//启动T0 While(1);//等待中断 }
void T0_ISR(void) interrupt 1 {
TL0|=0xe7; TH0=0xff; P1_0=!P1_0; Count--;
If(Count==0){ P1_1=!P1_1; Count=40;}
a=216-25=65511=0xffe7;
}
15.当C8051F020的串行口工作在方式2、3时,它的第9数据位可用作“奇偶校验位”进行传送,接收端用它来核对接收到的数据正确与否。试编写串行口方式2带奇偶校验的发送和接收程序。 解:发送程序: void send(char ch) {
ACC=ch; TB80=P; SBUF0=ch; While (!TI0); TI0=0; }
接收程序: char receive(void) {
While (!RI0); RI0=0; ACC=SBUF0;
If (RB80==P) return ch; }
16. 设甲乙两机采用UART0方式1通信,波特率为4800,甲机发送0、1、2…、1FH,乙机接受并存放在内部RAM以20H为首地址的单元,试用查询和中断两种方式编写甲、乙两机的程序(系统时钟为12MHz) 设利用T1工作在定时方式2(自动重装初值)提供波特率,T1M=0(按振荡器12分频)计数,SMOD0=0,T1初值计算如下:
12?106?12(0?1)2SMOD0?SYSCLK?(12(T1M?1))X=256-=256-=250=FAH
32?波特率32?4800#include
unsigned char xdata tbuf[]={0x0,0x1,…,0x1f}; void main(void) {
unsigned char i;
unsigned char xdata *p=tbuf;
XBR0=0x04; //配置交叉开关 XBR2=0x40;
P0MDOUT|=0x01;//TX0(P0.0)为推挽输出方式 TMOD=0x20;
TH1=0xfa;
//初始化并启动T1