1、四、编程题1、使用定时/计数器1以工作方式2实现定时,在P1.0输出周期为1s的连续方波。已知晶振频率fosc=12MHz。求计数初值,方式控制字,编制相应程序。(中断方式)*分析:题目要求用定时/计数器1的工作方式2,定时/计数器1工作在方式2时是自动重装初值的8位定时/计数器。在不装初值的情况下,定时的最长时间也才t=256s,远远小于定时时间1s。可以考虑用软件计数方式来延长定时,假设定时器每250s中断一次,并且每500ms对方波取反一次,则需要重装的初值M=28-fosc/12250=6。软件计数器初值为2000,定时器溢出一次,软件计数器减1,当软件计数器减到0时,即获得500ms
2、的定时时间。由于单片机最多只能放8位二进制数,最大也只能装28=256。所以需要用到2个软件计数器,2个计数需要嵌套才能完成2000次的定时溢出!*OVERTIME1EQU100;软件计数器溢出次数,存放100,即进行100次的溢出中断OVERTIME2EQU20;软件计数器溢出次数,存放20,即进行20次的溢出中断TIMECON1DATA30H;30H作为软件计数器1的存储单元TIMECON2DATA31H;31H作为软件计数器2的存储单元ORG0000HLJMPMAINORG001BH;定时/计数器1中断入口LJMPCTC1ORG0100HMAIN:MOVSP, #5FH;初始化堆栈指针M
3、OVTIMECON1, #OVERTIME1;溢出次数送到软件计数器1MOVTIMECON2, #OVERTIME2;溢出次数送到软件计数器2MOVTH1,#6;送重装初值MOVTL1,#6ANL TMOD,#0FH ;为了不影响定时/计数器0的工作状态,将TMOD与0FH相与,使高4位不变,低4位清零ORL TMOD, #20H ;由TR1控制计数器开和关,GATE位为0;定时方式,即C/T位为0,M1M0为10,即方式2SETBEA;开总中断SETBET1;允许定时/计数器T1中断SETBTR1;开定时/计数器T1中断HERE: SJMP HERE ;循环等待,时间(从6加到256所用的时
4、间)一到就进入中断CTC1:;中断从此处开始PUSHPSWDJNZTIMECON1,NEXT;软件计数器1减1不为0,跳转到NEXTMOVTIMECON1,#OVERTIME1;重装软件计数器1初值,即100DJNZTIMECON2,NEXTMOVTIMECON2,#OVERTIME2;重装软件计数器2初值,即20CPLP1.0;取反,输出周期为1s的方波NEXT:POPPSWCLRTF1;每进行一次中断都要清除一次中断标志位,以便进行下次的中断!RETI;中断返回,返回后继续进行计数:从6加到256END;程序结束伪指令2、有一低频信号从单片机8XC5X的P3.2引脚输入,如下图所示。请编写
5、出测量该低频信号频率和脉冲宽度的程序。*此题参考教材P150*ORG0000HLJMPMAINORG100HMAIN:MOVSP,#5FHMOVTL0,#00HMOVTH0,#00HMOVTMOD,#00000001BSETBIT0JNBIE0,$SETBTR0CLRIE0JNBIE0,$CLRTR0MOVR2,TL0MOVR3,TH0MOVTL0,#00HMOVTH0,#00HANLTMOD,#0F0HORLTMOD,#000001001BWAITL:JBP3.2,WAITHSETBTR0WAITH:JNBP3.2,WAITHWAITHL:JBP3.2,WAITHLCLRTR0五、设计题:1
6、、设计一个33行列式键盘电路并编写键盘扫描子程序,要求具有去抖动及自动重复功能。键盘电路图如下:键盘扫描子程序与延时子程序如下:keyscan:MOVP0,#11000111;P0.7和P0.6不用JMPK10;跳到K10开始扫描K10:;第一列键盘扫描开始JBP0.0,K20;判断第一列是否有键被按下,如果没有则跳到K20扫描第二列LCALLDELAY;若第一列确实有键被按下,则延时进行消抖动;下面确定是第一行的哪个键被按下K11:;判断是否第一列第一行的键被按下MOVP0,#11110111B;让第一列置“0”,其余置“1”JBP0.0,K12;是否第一行键被按下?如果不是,跳到K12检查
7、第一行第二列的键MOVR1,#1;第一个键被按下,记这个键的键值为1K12:;判断是否第一行第二列的键被按下MOVP0,#11101111B;让第二列置“0”,其余置“1”JBP0.0,K13;是否第一行键被按下?如果不是,跳到K13检查第一行第三列的键MOVR1,#2;第二个键被按下,记这个键的键值为2K13:;判断是否第一行第三列的键被按下MOVP0,#11011111B;让第三列置“0”,其余置“1”JBP0.0,keyscan;是否第三个键被按下?如果不是,则跳到子程序开始处重新扫描,实现自动重复功能MOVR1,#3;第三个键被按下,记这个键的键值为2JMPKEND;第一行按键确认结束
8、;以下扫描程序和上述一样K20:;第二列键盘扫描开始JBP0.1,K30LCALLDELAYK21:MOVP0,#11110111BJBP0.1,K22MOVR1,#4K22:MOVP0,#11101111BJBP0.1,K23MOVR1,#5K23:MOVP0,#11011111BJBP0.1,keyscanMOVR1,#6JMPKENDK30:;第三列键盘扫描开始JBP0.2,keyscanLCALLDELAYK31:MOVP0,#11110111BJBP0.2,K32MOVR1,#7K32:MOVP0,#11101111BJBP0.2,K33MOVR1,#8K33:MOVP0,#1101
9、1111BJBP0.2,keyscanMOVR1,#9JMPKENDKEND:RET;扫描结束,返回C语言:/延时子程序void delay() unsigned char n, m; for (n = 100; n 0; n-) for (m = 300; m 0; m-); /按键扫描程序 P1.0-P1.2为行线 P1.3-P1.5为列线unsigned char Keycan(void) unsigned char rcode, ccode; P1 = 0x38; / 发全0行扫描码,列线输入 if(P1&0x38) != 0x38) / 若有键按下 delay();/ 延时去抖动 i
10、f(P1&0x38) != 0x38) rcode = 0x3E; / 逐行扫描初值 while(rcode&0x08) != 0) P1 = rcode; / 输出行扫描码 if(P1&0x38) != 0x38) / 本行有键按下 ccode = (P1&0x38)|0x38; do;while(P1&0x38) != 0x38); /等待键释放 return (rcode) + (ccode); / 返回键编码 else rcode = (rcode1)|0x01; / 行扫描码左移一位 return 0; / 无键按下,返回值为02、设计一个4位数码显示电路,并用汇编语言编程使8从右到
11、左显示一遍。*此题设计总体思路:采用查表法,但是此次查表得到的不是数码管的段码,而是数码管的位选码!原因是题中只是要求显示“8”,所以只要扫描数码管的各位即可。*ORG0000HLJMPSTARTSTART:MOVDPTR,#TABINC1:MOVR2,#0DISPLAY:MOVA,R2MOVCA,A+DPTRMOVP3,ALCALL DELAYMOVA,#10000000BMOVP0,AINC R2CJNE R2, #4, $+3JC DISPLAYLJMP INC1TAB:DB7FH,0BFH,0DFH,0EFHDELAY:MOVR7,#250D1:MOV R6,#250D2:DJNZ R
12、6,D2 DJNZ R7,D1RETEND六、扩展作图1、6264的地址范围:4000H5FFFH2764的地址范围:2000H3FFFH2、2716的地址范围:0000H0FFFH6116的地址范围:1000H1FFFH1请将片外RAM 20H25H单元清零 MOV R0,#20H MOV R7,#06H CLR A LOOP:MOVX R0,A INC R0 DJNZ R7,LOOP 2请将ROM 3000H单元内容送R7 MOV DPTR, #3000H CLR A MOVC A,A+DPTR MOV R7,A 一、地址范围(4分)6264:C000HDFFFH2764:C000HDFF
13、FH试将8031单片机外接一片2716 EPROM和一片6116 RAM组成一个应用系统,请画出硬件连线图,并指出扩展存储器的地址范围。(10分)答:2716是2K8位的EPROM,6116是2K8位的静态RAM,两者都仅需要11根地址线。由于没有规定地址范围,故可按最简单的方式来连接,即省去地址译码器,程序存储器的地址必须从0开始,基本地址为0000H07FFH。数据存储器的地址为0000H07FFH。控制线的连接为/PSEN控制EPROM的读出,/RD和/WR控制RAM的读写,两个芯片的片选端都固定接地,连线图如图所示。P2.2 P2.1 P2.0D7 Q7.D0 Q0G /EA7 A10. A9A0 A8/OE D7. 2764D0 /CE EEEDDEE/CEEP0 8031ALE/PSEN /EAA7 A10. A9A0 A8/OE/WE D7. 6116D0 /CE /RD /WE