《单片机原理及应用》
除非特别声明,编程题可以使用汇编语言编写,也可以使用C语言编写 1、 分析程序的执行结果,将结果填写到空格中。
ORG 0000H
MOV 30H,#50H MOV R0,#30H MOV A,@R0 ;(A= 50H ) MOV A,#79H
MOV B,#20H ;(A= 79H B= 20H )
DIV AB ;(A= 03H B= 19H ) PUSH B MOV B,#0AH MUL AB ;(A= 1EH B= 00H )
POP B ADD A,B ;(A= 37H B= 19H ) MOV 30H,A ;(30H单元的内容= 37H )
MOV 20H,30H CLR 01H ;(20H单元的内容= 37H ) MOV A,20H ;(PSW中P的内容= 1 ) CPL A RR A ;( PSW中C的内容= 0 ) SWAP A ;(A= 46H ) ADDC A,#0F0H ;(A= 36H ) ;(PSW中P的内容= 0 ) ;( PSW中C的内容= 1 ) RL A ;(A= 6CH ) ;(PSW中P的内容= 0 ) ;( PSW中C的内容= 0 ) LOOP: AJMP LOOP 2、 将MCS51内部RAM60H~65H单元存放的12个16进制数变为ASCII
码,放到0090H单元开始的外部RAM中。[使用汇编语言编写]
MAIN: MOV R0,#60H MOV R2,#6
MOV DPTR, #0090H HASC:
MOV A,@R0 ANL A,#0FH ;屏蔽高四位 ADD A,#0DH
MOVC A,@A+PC ;查表低四位转换为ASCII码 MOVX @DPTR,A ;送如外部RAM INC DPTR MOV A,@R0 ANL A,#0F0H SWAP A ADD A,#6
MOVC,@A+PC ;高四位转换为ASCII码 MOVX @DPTR,A INC R0 INC DPTR
DJNZ R2,HASC END
ASCTAB:DB 30H 31H 32H 33H 34 H 35H 36H 37H 38H 39H DB41H 42H 43H 44H 45H 46H
3、 某一故障检测系统,当出现故障1时,线路1上出现上升沿;当出现故
障2时,线路2上出现下降沿。没有故障时,线路1为低电平,线路2为高电平。出现故障时,相应的指示灯变亮。故障消失后,指示灯熄灭。试用MSC1211为单片机实现该故障检测功能,画出电路原理图,并写出相应程序。 4、 用MSC1211的T0定时/计数器,设计程序,实现在P1.0输出周期为200ms
的占空比为1:1的方波,输出500个方波后停止输出。
解:ORG 0000H LJMP MAIN ORG 000BH ;T0口中断服务程序入口地址 LJMP INT_T0
MAIN: MOV TMOD,#00H ;T0工作于方式0定时
MOV MOV MOV MOV SETB SETB SETB SETB SJMP
INT_T0:MOV MOV
CPL DEC JZ 继续输出 RETI
ENDP: END
TL0,#0CH
TH0,#1EH ;设定秒中断周期为1ms A,200 ;设定输出周期为200 ms R2,1000 ;输出500个方波 TR0 ET0 EA P1.0 $
TL0,#0CH
TH0,#1EH ;T0重装时间常数 P1.0 P1.0位取反 R2
ENDP ;若R2为0,则结束程序,否则返主程序;返主程序
5、 利用MSC1211的A/D构成数据采集系统。使用模拟通道0进行连续数
据采集,采集8次后取得平均值,存放到预先分配好的100个内存单元中,这100个单元存满后,再从第一个单元进行覆盖保存。写出完整的程序清单(应在适当的地方加程序注释)。
解:#include
extern void autobaud(void);//声明外部函数 extern void bipolar(void);
float a[100]={0},w[8]={0};int out=0;long result,temp;int j; int AUXinterrupts(void)interrupt6 using1//中断服务程序 {
if(PAI==6) //处理AD中断 { w[out++]=bipolar();
temp=w[out];
SUMR0=temp&0xff; SUMR1=(temp>>8)&0xff; SUMR2=(temp>>16)&0xff; SUMR3=(temp>>24)&0xff;
if(out==8) {
SUM=SUMR3<<24+SUMR2<<16+SUMR1<<8+SUMR0; } SUM/=8; a[j++]=SUM; if(j>=100) {j=0;} }
}
min(void) { float dummy; int decimation; decimationg=1440;//抽取因子 PDCON&=0x77;//打开ADC ACLK=9;//模拟采样频率
ADMUX=0;//使用通道0
ADCON0=0x30;//内部基准2.5V,缓冲器关,BOD关,PGA=0 ADCON1=0x01;//双极性,自动稳定模式,偏移增益自校准 ADCON2=decimation&0xff;//写入抽取因子低字节
ADCON3=(decimation>>8)&0x07;//写入抽取因子高字节 AIE=&0x20; autobaud(); //等待校准 for(i=0;i<4;i++) { while(!(AIE&0X20))
{
dummy=ADRESL; }
SSCON=0;//清除求和寄存器 EAI=1; While(1); }
6、 变量k从0变到150,变化步长为10。对于每一个值,使用整形数算术
运算计算8*k,k*k*k和(40*k/150)^3。这三个值通过MSC1211的D/A
转换后同步输出(均使用电压输出模式)。试编写程序实现。 解:include
DACH=0x24; while(1) { DACSEL=0;DAC=0x8000; for(j=0;j<100;j++) DAC=0; for(k=0;k<151;k+=10) { DACSEL=1;DAC=8*k; DACSEL=2;DAC=k*k*k; DACSEL=3;i=40*k/150;DAC=i*i*i; DACSEL=6;DACL=0Xfc;
} }
7、 利MSC1211或8051设计应答方式下的多机通讯程序。通讯参数:晶振
为11.0592MHz,9600,n,8,1。通讯过程如下:主机首先发送从机地址,从机收到地址后进行比较,如果地址相符,则将从机地址回发给主机作为应答信号。主机收到从机的地址应答信号后,将内存单元中的120个数据发送给从机,并进行数据块校验(将各个数据进行异或),若校验正确,则从机发送00H给主机,否则发送0FFH给主机,主机重新发送数据。(应在适当的地方加程序注释)
解:主机程序如下:
ORG 0000H
LJMP MAINT ;跳至主程序入口地址 ORG 0023H ;串行口中断服务程序入口