




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4、附录实验一源程序ORG00H AJMP START ORG 0100HSTART:MOV A,#0FEH MOV P0,A ;初始化P0口MAIN: JNB P1.0,K1 ;判断K1是否按下 JNB P1.1,K2 ;判断K2是否按下 SJMPMAINK1: LCALL DELAYMS ;延时消抖 JNB P1.0,K11 ;再次判断 SJMPMAINK11:RR A MOV P0,A LCALL DELAY SJMPMAINK2: LCALL DELAYMS ;延时消抖 JNB P1.1,K22 ;再次判断 SJMPMAINK22:RL A MOV P0,A LCALL DELAY SJMP MAINDELAYMS: MOV R3,#60 ;30MSD0: MOV R4,#248 DJNZ R4,$ DJNZ R3,D0 RETDELAY:MOV R5,#20;延时程序,延时0.2sD1: MOV R6,#20D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END实验二源程序/与程序流程图不一致ORG00HLJMPSTART;跳至主程序ORG000BH;中断子程序起始地址T0INT:PUSHPSW;状态保护MOVTH0,#0FCH;置定时器初值MOVTL0,#17HMOVA,#0FFHMOVP0,AMOVA,P2RLAMOVP2,ACJNE A,#00000001B,N_LOOP1;相等就不跳转MOV DPTR,#TABLE;指针指向表头地址MOVA,#01H ;设置地址偏移量MOVCA,A+DPTR;查表取得段码,送A存储MOVP0,A;段码送LED显示JMPEXITN_LOOP1:CJNE A,#00000010B,N_LOOP2;相等就不跳转MOV DPTR,#TABLE;指针指向表头地址MOVA,#02H ;设置地址偏移量MOVCA,A+DPTR;查表取得段码,送A存储MOVP0,AJMPEXITN_LOOP2:CJNE A,#00000100B,N_LOOP3;相等就不跳转MOV DPTR,#TABLE;指针指向表头地址MOVA,#03H ;设置地址偏移量MOVCA,A+DPTR;查表取得段码,送A存储MOVP0,AJMPEXITN_LOOP3:CJNE A,#00001000B,N_LOOP4;相等就不跳转MOV DPTR,#TABLE;指针指向表头地址MOVA,#04H ;设置地址偏移量MOVCA,A+DPTR;查表取得段码,送A存储MOVP0,AJMPEXITN_LOOP4:CJNE A,#00010000B,N_LOOP5;相等就不跳转MOV DPTR,#TABLE;指针指向表头地址MOVA,#05H ;设置地址偏移量MOVCA,A+DPTR;查表取得段码,送A存储MOVP0,AJMPEXITN_LOOP5:CJNE A,#00100000B,N_LOOP6;相等就不跳转MOV DPTR,#TABLE;指针指向表头地址MOVA,#06H ;设置地址偏移量MOVCA,A+DPTR;查表取得段码,送A存储MOVP0,AJMPEXITN_LOOP6:CJNE A,#01000000B,N_LOOP7;相等就不跳转MOV DPTR,#TABLE;指针指向表头地址MOVA,#07H ;设置地址偏移量MOVCA,A+DPTR;查表取得段码,送A存储MOVP0,AJMPEXITN_LOOP7: CJNE A,#10000000B,EXIT;相等就不跳转MOV DPTR,#TABLE;指针指向表头地址MOVA,#08H ;设置地址偏移量MOVCA,A+DPTR;查表取得段码,送A存储MOVP0,AEXIT:POPPSWRETI ORG0100HSTART:MOVP0,#0FFHMOVP2,#01HMOVTMOD,#01H;方式1,定时器MOVTH0,#0FCH;置定时器初值MOVTL0,#17HMOVIE,#10000010B;EA=1,IT0=1SETBTR0;开始定时JMP$TABLE: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,0ffH;(0-9,off)END 实验三源程序org 0000h ajmp main org 0100h main: mov dptr,#table ;将表头放入DPTR lcall key ;调用键盘扫描程序 movc a,a+dptr ;查表后将键值送入ACC mov p0,a ;将Acc值送入P0口 ljmp main ;返回反复循环显示 KEY: LCALL KS ;调用检测按键子程序 JNZ K1 ;有键按下继续 LCALL DELAY2 ;无键按调用延时去抖 AJMP KEY ;返回继续检测按键 K1: LCALL DELAY2 LCALL DELAY2 ;有键按下延时去抖动 LCALL KS ;再调用检测按键程序 JNZ K2 ;确认有按下进行下一步 AJMP KEY ;无键按下返回继续检测 K2: MOV R2,#0EFH ;将扫描值送入 R2暂存 MOV R4,#00H ;将第一列值送入R4暂存 K3: MOV P1,R2 ;将R2的值送入P1口 L6: JB P1.0,L1 ;P1.0等于1跳转到L1 MOV A,#00H ;将第一行值送入ACC AJMP LK ;跳转到键值处理程序 L1: JB P1.1,L2 ;P1.1等于1跳转到L2 MOV A,#04H ;将第二行的行值送入ACC AJMP LK ;跳转到键值理程序进行键值处理 L2: JB P1.2,L3 ;P1.2等于1跳转到L3 MOV A,#08H ;将第三行的行值送入ACC AJMP LK ;跳转到键值处理程序L3: JB P1.3,NEXT ;P1.3等于1跳转到NEXT处 MOV A,#0cH ;将第四行的行值送入ACC LK: ADD A,R4 ;行值与列值相加后的键值送入A PUSH ACC ;将A中的值送入堆栈暂存 K4: LCALL KS ;调用按键检测程序 JNZ K4 ;按键没有松开继续返回检测 POP ACC ;将堆栈的值送入ACC RET NEXT: INC R4 ;将列值加一 MOV A,R2 ;将R2的值送入A JNB ACC.7,KEY ;扫描完至KEY处进行下一扫描 RL A ;扫描未完将A中的值右移一位进行下一列的扫描 MOV R2,A ;将ACC的值送入R2暂存 AJMP K3 ;跳转到K3继续 KS: MOV P1,#0FH ;将P1口高四位置0低四位值1 MOV A,P1 ;读P1口 XRL A,#0FH ;将A中的值与A中的值相异或 RET ;子程序返回 DELAY2: ;40ms延时去抖动子程序 MOV R5,#08H L7: MOV R6,#0FAH L8: DJNZ R6,L8 DJNZ R5,L7 RET TABLE: ;七段显示器数据定义 DB 0C0H, 0F9H, 0A4H, 0B0H, 99H ; 01234 DB 92H, 82H, 0F8H, 80H, 90H ; 56789 DB 88H, 83H, 0C6H, 0A1H, 86H ; ABCDE DB 8EH ; F END ;程序结束实验四源程序;*功能说明*;用AT89S52的MCU驱动DAC0832输出三角波;通过数码管显示输出的电压值;*;*IO口定义*/DAC_CSBITP2.7DAC_WRBITP2.6DAC_BUSEQUP0TEMP EQU 30HDISSTART EQU 40H ;显示单元首地址LED_DATA EQU P1 ;数码管数据口定义ORG0000HLJMPMAINORG0100HMAIN: MOV SP,#60H MOV P1,#0FFH MOV P3,#00H MOV TEMP,#01 MOV A,#00; MOV DISSTART+3,A ;清除百位显示缓存 MOV DISSTART+2,A ;清除百位显示缓存 MOV DISSTART+1,A ;清除十位显示缓存 MOV DISSTART,A ;清除个位显示缓存M_LOOP: CALL CONVT LCALL DELAY2MS CALL DISPLAY LCALL DELAY2MS CALL DAC_CONVT LCALL DELAY2MS JMP M_LOOPDAC_CONVT:MOVP0,TEMPCLRDAC_CSCLRDAC_WRSETBDAC_CSSETBDAC_WRINCTEMPRET;-UIDIV:CJNER4,#00H,LOOP_C11CJNER6,#00H,LOOP_C32MOVA,R7MOVB,R5DIVABMOVR7,AMOVR5,BRETLOOP_C11:CLRAXCHA,R4MOVR0,AMOVB,#08HLOOP_C17:MOVA,R7ADDA,R7MOVR7,AMOVA,R6RLCAMOVR6,AMOVA,R4RLCAMOVR4,AMOVA,R6SUBBA,R5MOVA,R4SUBBA,R0JCLOOP_C2BMOVR4,AMOVA,R6SUBBA,R5MOVR6,AINCR7LOOP_C2B:DJNZB,LOOP_C17CLRAXCHA,R6MOVR5,ARETLOOP_C32:MOVA,R5MOVR0,AMOV B,AMOVA,R6DIVABJBOV,LOOP_C57MOVR6,AMOVR5,BMOVB,#08HLOOP_C41:MOVA,R7ADDA,R7MOVR7,AMOVA,R5RLCALOOP_C52:MOVR5,AJCLOOP_50SUBBA,R0JNCLOOP_C52DJNZB,LOOP_C41LOOP_C57:RETLOOP_50:CLRCSUBBA,R0MOVR5,AINCR7DJNZB,LOOP_C41RET;-;代码变换 (HEX TO BCD);-CONVT: ;-A*B-MOVR3,#0C3HMOVR2,TEMPMOVA,R3MOVB,R2MULABMOV08H,BMOV09H,AMOVR6,08HMOVR7,AMOVR4,#27HMOV R5,#10HCALLUIDIVMOV 0AH,R7MOV DISSTART+2,R7MOVR6,08HMOVR7,09HMOVR4,#03HMOVR5,#0E8HCALLUIDIVMOVR4,#00HMOVR5,#0AHCALLUIDIVMOV 0BH,R5MOV DISSTART+1,R5MOV DISSTART+3,#0BHMOV DISSTART,#00H RET;-DISPLAY: MOV R0,#DISSTART ;获得显示单元首地址 MOV R1,#08H ;从第一个数码管开始 MOV R2,#04H ;共显示4位数码管DISP1: MOV P3,#00H ;开始清除显示MOV A,R0 ;获得当前位地址 MOV DPTR,#TAB_NU ;获得表头 MOVC A,A+DPTR ;查表获得显示数据MOVR3,AMOVA,R2SUBBA,#02HJNZLOOP_SKIPMOVA,R3ANLA,#7fHMOVR3,ALOOP_SKIP: MOV LED_DATA,R3 ;显示数据 MOV P3,R1 ;开始显示当前位 MOV A,R1 ;准备显示下一位 RR A MOV R1,A ;下一位 INC R0 ;取下一个单元地址 LCALL DELAY2MS ;延时 2 MS DJNZ R2,DISP1 ;重复显示下一个 ;MOV P3,#0FFH ;关闭显示 RET ;显示完成,返回;-;延时子程序;-DELAY2MS: MOV R6,#10DEL1: MOV R7,#100 DJNZ R7,$ DJNZ R6,DEL1 RETTAB_NU: DB 0C0h,0F9h,0a4h,0B0h,99h,92h,82h,0F8h,80h,90h,0FFH,0BFH;- END实验五源程序 org 0000hjmp startorg 0003hljmp keyscanorg 0013hljmp eint1org 0023hljmp serialstart:;定时器初始化mov tmod,#20h;设置定时器1工作在方式2mov tl1,#0f2hmov th1,#0f2hsetb tr1;串口初始化mov scon,#50h;串口工作在方式1,REN=1允许接收数据mov pcon,#0;波特率不加倍setb es;两外部中断使能setb ex1setb ex0setb eamov r1,#10;灭LEDmov r2,#10loop0:mov p1,#00000111b;上五位和下三位分别为行和列,所以送出高低电压检查有没有按键按下call display0;显示将要发送的数据call display2;显示已收到的数据jmp loop0;*;显示程序display0:mov a,r1;将要发送的数据放在r1mov dptr,#tablemovc a,a+dptrmov p0,aretdisplay2:mov a,r2;接收的数据放在r2mov dptr,#tablemovc a,a+dptrmov p2,arettable:DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90hDB 0FFH;*;键盘扫描程序keyscan:call delay;去抖动延时;*;第一列的扫描k10:jb p1.0,k20;扫描正式开始,先检查列1四个键是否有键按下,如果没有,则跳到K20检查列2k11:mov p1,#11110111b;列1有键按下时,P1.0变低,到底是那一个键按下?现在分别输出各行低电平jb p1.0,k12;该行的键不按下时,p1.0为高电平,跳到到K12,检查其它的行mov r1,#1;如果正好是这行的键按下,将寄存器R1写下1,表示1号键按下了k12:mov p1,#11101111bjb p1.0,k13mov r1,#4;如果正好是这行的键按下,将寄存器R1写下4,表示4号键按下了k13:mov p1,#11011111bjb p1.0,k14mov r1,#7;如果正好是这行的键按下,将寄存器R1写下7,表示7号键按下了k14:mov p1,#10111111bjb p1.0,kend;如果现在四个键都没有按下,可能按键松开或干扰,退出扫描(以后相同);mov r3,#10;如果正好是这行的键按下,将寄存器R3写下*,表示*号键按下了jmp kend;已经找到按下的键,跳到结尾;*;第二列的扫描k20:jb p1.1,k30;列2检查为高电平再检查列3、4 k21:mov p1,#11110111b;列2有健按下时,P0.0会变低,到底是那一行的键按下呢?分别输出行的低电平jb p1.1,k22;该行的键不按下时p0.0为高电平,跳到到K22,检查另外三行mov r1,#2;如果正好是这行的键按下,将寄存器R1写下5,表示5号键按下了(以后相同,不再重复了)k22:mov p1,#11101111bjb p1.1,k23mov r1,#5k23:mov p1,#11011111bjb p1.1,k24mov r1,#8k24:mov p1,#10111111bjb p1.1,kendmov r1,#0jmp kend;已经找到按下的键,跳到结尾;*;第三列的扫描k30:jb p1.2,kendk31:mov p1,#11110111bjb p1.2,k32mov r1,#3k32:mov p1,#11101111bjb p1.2,k33mov r1,#6k33:mov p1,#11011111bjb p1.2,k34mov r1,#9k34:mov p1,#10111111bjb p1.2,kend;mov r3,#12;按下了#号kend:reti;发送命令的中断eint1:clr es;屏蔽因为发送完产生的中断mov a,r1mov sbuf,ajnb ti,$clr ti setb esreti;串口中断接收数据serial:clr rimov a,sbufmov r2,aretidelay:mov r4,#0fhloop2:mov r5,#0ffhloop4:djnz r5,loop4djnz r4,loop2retend实验六源程序ORG 0000H;单片机内存分配申明!TEMPER_L EQU 29H;用于保存读出温度的低8位TEMPER_H EQU 28H;用于保存读出温度的高8位FLAG1 EQU 38H;是否检测到DS18B20标志位a_bit equ 20h ;数码管个位数存放内存位置b_bit equ 21h ;数码管十位数存放内存位置MAIN: LCALL GET_TEMPER;调用读温度子程序;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度;显示范围00到99度,显示精度为1度;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度;这个转化温度的方法可是我想出来的哦非常简洁无需乘于0.0625系数MOV A,29HMOV C,40H;将28H中的最低位移入CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISPLAY;调用数码管显示子程序;CPL P1.0AJMP MAIN; 这是DS18B20复位初始化子程序INIT_1820:SETB P3.7NOPCLR P3.7;主机发出延时537微秒的复位低脉冲MOV R1,#3TSR1:MOV R0,#107DJNZ R0,$DJNZ R1,TSR1SETB P3.7;然后拉高数据线NOPNOPNOPMOV R0,#25HTSR2:JNB P3.7,TSR3;等待DS18B20回应DJNZ R0,TSR2LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在;CLR P1.7;检查到DS18B20就点亮P1.7LEDLJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在;CLR P1.1LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间TSR7:SETB P3.7RET; 读出转换后的温度值GET_TEMPER:SETB P3.7LCALL INIT_1820;先复位DS18B20JB FLAG1,TSS2CLR P1.2RET ; 判断DS1820是否存在?若DS18B20不存在则返回TSS2:CLR P1.3;DS18B20已经被检测到!MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒LCALL DISPLAYLCALL INIT_1820;准备读温度前先复位MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200; 将读出的温度数据保存到35H/36H CLR P1.4RET;写DS18B20的子程序(有具体的时序要求)WRITE_1820:MOV R2,#8;一共8位数据CLR CWR1:CLR P3.7MOV R3,#6DJNZ R3,$RRC AMOV P3.7,CMOV R3,#23DJNZ R3,$SETB P3.7NOPDJNZ R2,WR1SETB P3.7RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据 READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOV R2,#8;数据一共有8位RE01:CLR CSETB P3.7NOPNOPCLR P3.7NOPNOPNOPSETB P3.7MOV R3,#9RE10: DJNZ R3,RE10MOV C,P3.7MOV R3,#23RE20: DJNZ R3,RE20RRC ADJNZ R2,RE01MOV R1,ADEC R1DJNZ R4,RE00RET;显示子程序display: MOV A,29H;将29H中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制DIV ABMOV b_bit,A ;十位在aMOV a_bit,B ;个位在bMOV dptr,#numtab ;指定查表启始地址MOV R0,#4 dpl1: mov r1,#250 ;显示1000次dplop: mov a,a_bit ;取个位数MOVC A,A+DPTR ;查个位数的7段代码MOV P0,A ;送出个位的7段代码SETB P2.1 ;开个位显示ACALL d1ms ;显示1msCLR p2.1MOV a,b_bit ;取十位数MOVC A,A+DPTR ;查十位数的7段代码MOV P0,A ;送出十位的7段代码SETB P2.0 ;开十位显示ACALL d1ms ;显示1msCLR P2.0DJNZ R1,dplop ;100次没完循环DJNZ R0,dpl1 ;4个100次没完循环RET;1MS延时(按12MHZ算)D1MS: MOV R7,#80 DJNZ R7,$RET;实验板上的7段数码管09数字的共阴显示代码numtab: DB 0C0H;0 DB 0F9H;1 DB 0A4H;2 DB 0B0H;3 DB 099H;4 DB 092H;5 DB 082H;6 DB 0F8H;7 DB 080H;8 DB 090H;9END实验七源程序;*IO口定义*/EOC BIT P3.0CS BIT P2.7;/* 用户定义宏 */LED_0 DATA 30H ;显示缓冲区LED_1 DATA 31HLED_2 DATA 32HLED_3 DATA 33HADC DATA 34HORG 0000HLJMPMAINORG0100HMAIN:MOVA,#0FFHMOV P0,AMOV A,#00HMOV P2,AMAIN1:MOV DPTR,#7FFFH MOV A,#0FH MOVX DPTR,A LOOP: JNB EOC,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建泉州文旅集团招聘61人笔试参考题库附带答案详解
- 2025年湖南邵阳邵东市城市发展集团有限公司招聘10人笔试参考题库附带答案详解
- 汉江师范学院《电力系统综合实验》2023-2024学年第二学期期末试卷
- 福建船政交通职业学院《跨国企业战略管理(双语)》2023-2024学年第二学期期末试卷
- 广州中医药大学《产品系统设计》2023-2024学年第二学期期末试卷
- 金华职业技术学院《牵引电机与拖动技术》2023-2024学年第二学期期末试卷
- 福州科技职业技术学院《业财融合实训》2023-2024学年第二学期期末试卷
- 辽宁商贸职业学院《现代企业管理学》2023-2024学年第二学期期末试卷
- 西安高新科技职业学院《摄影测量学》2023-2024学年第二学期期末试卷
- 陕西国防工业职业技术学院《程序设计基础实验》2023-2024学年第二学期期末试卷
- (三模)遵义市2025届高三年级第三次适应性考试英语试卷(含答案)
- (三模)豫西北教研联盟 (平许洛济)2024-2025学年高三第三次质量检测生物试卷(含答案)
- 护士助教面试题及答案
- 《分布式存储技术》课件
- 《思想道德与法治》课件-第三章 继承优良传统 弘扬中国精神
- 第18课《井冈翠竹》课件-2024-2025学年统编版语文七年级下册
- 第16课《有为有不为》公开课一等奖创新教学设计
- 【MOOC】《思想道德与法治》(东南大学)章节中国大学慕课答案
- 【MOOC】以案说法-中南财经政法大学 中国大学慕课MOOC答案
- 卜算子-送鲍浩然之浙东课件
- MOOC 中医与辨证-暨南大学 中国大学慕课答案
评论
0/150
提交评论