单片机代码.doc_第1页
单片机代码.doc_第2页
单片机代码.doc_第3页
单片机代码.doc_第4页
单片机代码.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NAME T1_1CSEG AT 0000H LJMP STARTCSEG AT 4100HSTART: MOV A,#0FEHLOOP: RR A MOV P1,A LCALL DELAY JMP LOOP DELAY: MOV R1,#127 DEL1: MOV R2,#200DEL2: DJNZ R2,DEL2 DJNZ R1,DEL1 RET ENDNAME T1_2 ;P1口输入实验OUT_PORTEQU0CFA0HCSEG AT 0000H LJMP STARTCSEG AT 4100HSTART: MOV P1,#0FFH ;复位P1口为输入状态 MOV A,P1 ;读P1口的状态值入累加器A MOV DPTR,#OUT_PORT ;将输出口地址赋给地址指针DPTR MOVX DPTR,A ;将累加器A的值赋给DPTR指向的地址 JMP START ;继续循环监测端口P1的状态 ENDNAME T2 ;P1口输实验CSEG AT 0000H LJMP STARTCSEG AT 4100HSTART: SETB P1.0 SETB P1.1 ;用于输入时先置位口内锁存器 MOV A,P1 ANL A,#03H ;从P1口读入开关状态,取低两位 MOV DPTR,#TAB ;转移表首地址送DPTR MOVC A,A+DPTR JMP A+DPTRTAB: DB PRG0-TAB DB PRG1-TAB DB PRG2-TAB DB PRG3-TABPRG0: MOV P1,#0FFH ;向P1口输出0,发光二极管全灭 ;此时K1=0,K2=0 JMP STARTPRG1: MOV P1,#0F3H ;只点亮L1、L2,表示左转弯 ACALL DELAY ;此时K1=1,K2=0MOV P1,#0FFH ;再熄灭0.5秒 ACALL DELAY ;延时0.5秒 JMP STARTPRG2: MOV P1,#03FH ;只点亮L5、L6,表示右转弯 ACALL DELAY ;此时K1=0,K2=1 MOV P1,#0FFH ACALL DELAY JMP STARTPRG3: MOV P1,#00H ;发光二极管全亮,此时K1=1,K2=1JMP STARTDELAY: MOV R1,#5 ;延时0.5秒DEL1: MOV R2,#200DEL2: MOV R3,#126DEL3: DJNZ R3,DEL3 DJNZ R2,DEL2 DJNZ R1,DEL1 RETENDNAME T3 ;I/O口扩展实验一PORT EQU 0CFA0H ;片选地址CS0CSEG AT 0000H LJMP STARTCSEG AT 4100HSTART: MOV A,#11H ;两个红灯亮,黄灯、绿灯灭 ACALL DISP ;调用273显示单元(以下雷同) ACALL DE3S ;延时3秒LLL: MOV A,#12H ;东西路口绿灯亮;南北路口红灯亮 ACALL DISP ACALL DE10S ;延时10秒 MOV A,#10H ;东西路口绿灯灭;南北路口红灯亮 ACALL DISP MOV R2,#05H ;R2中的值为黄灯闪烁次数TTT: MOV A,#14H ;东西路口黄灯亮;南北路口红灯亮 ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#10H ;东西路口黄灯灭;南北路口红灯亮 ACALL DISP ACALL DE02S ;延时0.2秒 DJNZ R2,TTT ;返回TTT,使东西路口;黄灯闪烁五次 MOV A,#11H ;两个红灯亮,黄灯、绿灯灭 ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#21H ;东西路口红灯亮;南北路口绿灯亮 ACALL DISP ACALL DE10S ;延时10秒 MOV A,#01H ;东西路口红灯亮;南北路口绿灯灭 ACALL DISP MOV R2,#05H ;黄灯闪烁五次GGG: MOV A,#41H ;东西路口红灯亮;南北路口黄灯亮 ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#01H ;东西路口红灯亮;南北路口黄灯灭 ACALL DISP ACALL DE02S ;延时0.2秒 DJNZ R2,GGG ;返回GGG,使南北路口;黄灯闪烁五次 MOV A,#03H ;两个红灯亮,黄灯、绿灯灭 ACALL DISP ACALL DE02S ;延时0.2秒 JMP LLL ;转LLL循环DE10S: MOV R5,#100 ;延时10秒 JMP DE1DE3S: MOV R5,#30 ;延时3秒 JMP DE1DE02S: MOV R5,#02 ;延时0.2秒DE1: MOV R6,#200DE2: MOV R7,#126DE3: DJNZ R7,DE3 DJNZ R6,DE2 DJNZ R5,DE1 RETDISP: MOV DPTR,#PORT ;273显示单元CPL AMOVX DPTR,ARET ENDNAME T4 ;I/O口扩展实验CSEG AT 0000H LJMP STARTCSEG AT 4100HINPORT EQU 0CFA8H ;74LS244端口地址OUTPORT EQU 0CFB0H ;74LS273端口地址START: MOV DPTR,#INPORTLOOP: MOVX A,DPTR ;读开关状态 MOV DPTR,#OUTPORT MOVX DPTR,A ;显示开关状态 MOV R7,#10H ;延时DEL0: MOV R6,#0FFHDEL1: DJNZ R6,DEL1 DJNZ R7,DEL0 JMP STARTENDNAME T5 ;中断控制实验OUTPORT EQU 0CFB0H ;端口地址SAVE EQU 55H ;save保存从端口cfa0输出的数据CSEG AT 0000H LJMP STARTCSEG AT 4003H LJMP INTCSEG AT 4100HSTART: SETB IT0 SETB EX0 SETB EA MOV A,#11H ;置首显示码 MOV SAVE,A ;保存 ACALL DISP ;显示输出 ACALL DE3S ;延时3秒LLL: MOV A,#12H ;东西路口绿灯亮,南北路口红灯亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延时10秒 MOV A,#10H ;东西路口绿灯灭 MOV SAVE,A ACALL DISP MOV R2,#05H ;东西路口黄灯闪烁5次TTT: MOV A,#14H MOV SAVE,A ACALL DISP ACALL DE02S MOV A,#10H MOV SAVE,A ACALL DISP ACALL DE02S DJNZ R2,TTT MOV A,#11H ;红灯全亮 MOV SAVE,A ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#21H ;东西路口红灯亮,南北路口绿灯亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延时10秒 MOV A,#01H ;南北路口绿灯灭 MOV SAVE,A ACALL DISP MOV R2,#05H ;南北路口黄灯闪烁5次GGG: MOV A,#41H MOV SAVE,A ACALL DISP ACALL DE02S MOV A,#01H MOV SAVE,A ACALL DISP ACALL DE02S DJNZ R2,GGG MOV A,#11H ;红灯全亮 MOV SAVE,A ACALL DISP ACALL DE02S ;延时0.2秒 JMP LLL ;转LLL循环DE10S: MOV R5,#100 ;延时10秒 JMP DE1DE3S: MOV R5,#30 ;延时3秒 JMP DE1DE02S: MOV R5,#02 ;延时0.2秒DE1: MOV R6,#200DE2: MOV R7,#126DE3: DJNZ R7,DE3 DJNZ R6,DE2 DJNZ R5,DE1 RETINT: CLR EAPUSH ACC ;中断处理 PUSH PSW MOV A,R5 PUSH ACC MOV A,#11H ;红灯全亮,绿、黄灯全灭 ACALL DISP DEL10S: MOV R3,#100 ;延时10秒 DEL1: MOV R2,#200DEL2: MOV R5,#126DEL3: DJNZ R5,DEL3 DJNZ R4,DEL2 DJNZ R3,DEL1 MOV A,SAVE ;取SAVE中保存数据输出到cfa0端口 ACALL DISP POP ACC ;出栈 MOV R5,A POP PSW POP ACC SETB EA ;允许外部中断 RETIDISP: MOV DPTR,#OUTPORTCPL A MOVX DPTR,A RETENDNAME T6 ;定时器实验OUTPORT EQU 0CFB0HCSEG AT 0000H LJMP STARTCSEG AT 401BH ;定时器/计数器1中断程序入口地址 LJMP INTCSEG AT 4100HSTART: MOV A,#01H ;首显示码 MOV R1,#03H ;03是偏移量,即从基址寄存器到表首的距离 MOV R0,#5H ;05是计数值 MOV TMOD,#10H ;计数器置为方式1 MOV TL1,#0AFH ;装入时间常数 MOV TH1,#03CH ORL IE,#88H ;CPU中断开放标志位和定时器 ;1溢出中断允许位均置位 SETB TR1 ;开始计数LOOP1: CJNE R0,#00,DISP MOV R0,#5H ;R0计数计完一个周期,重置初值 INC R1 ;表地址偏移量加1 CJNE R1,#31H,LOOP2 MOV R1,#03H ;如到表尾,则重置偏移量初值LOOP2: MOV A,R1 ;从表中取显示码入累加器 MOVC A,A+PC JMP DISP DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCH DB 0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H,0FEH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH DB 0EFH,0F7H,0FBH,0FDH,0FEH,00H,0FFH,00HDISP: ;MOV DPTR,#OUTPORT ;MOVX DPTR,A MOV P1,A ;将取得的显示码从P1口输出显示 JMP LOOP1INT: CLR TR1 ;停止计数 DEC R0 ;计数值减一 MOV TL1,#0AFH ;重置时间常数初值 MOV TH1,#03CH SETB TR1 ;开始计数 RETI ;中断返回ENDNAME T7 ;8255A实验一CSEG AT 0000H LJMP STARTCSEG AT 4100HPA EQU 0CFA0HPB EQU 0CFA1HPCTL EQU 0CFA3HSTART: MOV DPTR,#PCTL ;置8255A控制字,A、B、C口均工作 ;方式0,A、C口为输出,B口为输入 MOV A,#082H MOVX DPTR,ALOOP: MOV DPTR,#PB ;从B口读入开关状态值 MOVX A,DPTR MOV DPTR,#PA ;从A口将状态值输出显示 MOVX DPTR,A MOV R7,#10H ;延时DEL0: MOV R6,#0FFHDEL1: DJNZ R6,DEL1 DJNZ R7,DEL0 JMP LOOPENDNAME t8 ;8255键盘实验PA EQU 0CFA0HPB EQU PA+1PC0 EQU PB+1PCTL EQU PC0+1CSEG AT 4000H LJMP STARTCSEG AT 4100HSTART: MOV 42H,#0FFH ;42H中放显示的字符码,初值为0FFHSTA1: MOV DPTR,#PCTL ;设置控制字,ABC口工作于方式0 ;AC口输出而B口用于输入 MOV A,#82H MOVX DPTR,ALINE: MOV DPTR,#PC0 ;将字符码从C口输出显示 MOV A,42H CPL A MOVX DPTR,A MOV DPTR,#PA ;从A口输出全零到键盘的列线 MOVX DPTR,A MOV DPTR,#PB ;从B口读入键盘行线值 MOVX A,DPTR MOV 40H,A ;行线值存于40H中 CPL A ;取反后如为全零 ;表示没有键闭合,继续扫描 JZ LINE MOV R7,#10H ;有键按下,延时10MS去抖动DL0: MOV R6,#0FFHDL1: DJNZ R6,DL1 DJNZ R7,DL0 MOV DPTR,#PCTL ;重置控制字,让A为输入,BC为输出 MOV A,#90H MOVX DPTR,A MOV A,40H MOV DPTR,#PB ;刚才读入的行线值取出从B口送出 MOVX DPTR,A MOV DPTR,#PA ;从A口读入列线值 MOVX A,DPTR MOV 41H,A ;列线值存于41H中 CPL A ;取反后如为全零 JZ STA1 ;表示没有键按下 MOV DPTR,#TABLE ;TABLE表首地址送DPTR MOV R7,#18H ;R7中置计数值16 MOV R6,#00H ;R6中放偏移量初值TT: MOVX A,DPTR ;从表中取键码前半段字节,行线值与实 CJNE A,40H,NN1 ;际输入的行线值相等吗?不等转NN1 INC DPTR ;相等,指针指向后半字节,即列线值 MOVX A,DPTR ;列线值与实际输入的列线值 CJNE A,41H,NN2 ;相等吗?不等转NN2 MOV DPTR,#CHAR ;相等,CHAR表基址和R6中的偏移量 MOV A,R6 ;取出相应的字符码 MOVC A,A+DPTR MOV 42H,A ;字符码存于42HBBB: MOV DPTR,#PCTL ;重置控制字,让AC为输出,B为输入 MOV A,#82H MOVX DPTR,AAAA: MOV A,42H ;将字符码从C口送到二极管显示 MOV DPTR,#PC0 CPL A MOVX DPTR,A MOV DPTR,#PA ;判断按下的键是否释放 CLR A MOVX DPTR,A MOV DPTR,#PB MOVX A,DPTR CPL A JNZ AAA ;没释放转AAA MOV R5,#2 ;已释放则延时0.2秒,减少总线负担DEL1: MOV R4,#200DEL2: MOV R3,#126DEL3: DJNZ R3,DEL3 DJNZ R4,DEL2 DJNZ R5,DEL1 JMP START ;转STARTNN1: INC DPTR ;指针指向后半字节即列线值NN2: INC DPTR ;指针指向下一键码前半字节即行线值 INC R6 ;CHAR表偏移量加一 DJNZ R7,TT ;计数值减一,不为零则转TT继续查找 JMP BBBTABLE: DW 0FE06H,0FD06H,0FB06H,0F706H;TABLE为键值表,每个键位占 DW 0BF06H,07F06H,0FE05H,0FD05H; 两个字节,第一个字节为行 DW 0EF05H,0DF05H,0BF05H,07F05H ;线值,第二个为列线值 DW 0FB03H,0F703H,0EF03H,0DF03H; CHAR: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ;字符码表 DB 0AH,0BH,0CH,0DH,0EH,0FH,10H,11H,12H,13H DB 14H,15H,16H,17HEND;将P1口的P1.0P1.5与LED8LED3相连,74LS273的SO0SO7与ADp相连,片选信号CS273与CS0相连。去掉短路子连接。NAME T9 ;数码显示实验PORT EQU 0CFA0HBUF EQU 23H ;存放计数值SBF EQU 22H ;存放秒值MBF EQU 21H ;存放分值CSEG AT 0000H LJMP STARTCSEG AT 401BH LJMP CLOCKCSEG AT 4100HSTART: MOV R0,#40H ;40H-45H是显示缓冲区,依次存放 MOV A,#00H ;分高位、分低位,0A,0A(横线) MOV R0,A ;以及秒高位、秒底位 INC R0 MOV R0,A INC R0 MOV A,#0AH MOV R0,A INC R0 MOV R0,A INC R0 MOV A,#00H MOV R0,A INC R0 MOV R0,A MOV TMOD,#10H ;定时器1初始化为方式1 MOV TH1,#38H ;置时间常数,延时0.1秒 MOV TL1,#00H MOV BUF,#00H ;置0 MOV SBF,#00H MOV MBF,#00H SETB ET1 SETB EA SETB TR1DS1: MOV R0,#40H ;置显示缓冲区首址 MOV R2,#20H ;置扫描初值,点亮最左边的LED6DS2: MOV DPTR,#PORT MOV A,R0 ;得到的段显码输出到段数据口 ACALL TABLE MOVX DPTR,A MOV A,R2 ;向位数据口P1输出位显码 CPL A MOV P1,A MOV R3,#0FFH ;延时一小段时间DEL: NOP DJNZ R3,DEL INC R0 ;显示缓冲字节加一 CLR C MOV A,R2 RRC A ;显码右移一位 MOV R2,A ;最末一位是否显示完毕?,如无则 JNZ DS2 ;继续往下显示 MOV R0,#45H MOV A,SBF ;把秒值分别放于44H,45H中 ACALL GET DEC R0 ;跳过负责显示-的两个字节 DEC R0 MOV A,MBF ;把分值分别放入40H,41H中 ACALL GET SJMP DS1 ;转DS1从头显示起TABLE: INC A ;取与数字对应的段码 MOVC A,A+PC RET DB 3FH,06H,5BH,4FH,66H,6DH,7DH, 07H, 7FH,6FH, 40H GET: MOV R1,A ;把从分或秒字节中取来的值的高 ANL A,#0FH ;位屏蔽掉,并送入缓冲区 MOV R0,A DEC R0 MOV A,R1 ;把从分或秒字节中取来的值的低 SWAP A ;位屏蔽掉,并送入缓冲区 ANL A,#0FH MOV R0,A DEC R0 ;R0指针下移一位 RETCLOCK: MOV TL1,#0AFH ;置时间常数 MOV TH1,#3CH PUSH PSW PUSH ACC INC BUF ;计数加一 MOV A,BUF ;计到10否?没有则转到QUIT退出中断 CJNE A,#0AH,QUIT MOV BUF,#00H ;置初值 MOV A,SBF INC A ;秒值加一,经十进制调整后放入 DA A ;秒字节 MOV SBF,A CJNE A,#60H,QUIT ;计到60否?没有则转到QUIT退出中断 MOV SBF,#00H ;是,秒字节清零 MOV A,MBF INC A ;分值加一,经十进制调整后放入 DA A ;分字节 MOV MBF,A CJNE A,#60H,QUIT ;分值为60否?不是则退出中断 MOV MBF,#00H ;是,清零QUIT: POP ACC POP PSW RETI ;中断返回END NAME T10 ;8279显示实验一(不用接线)PORT EQU 0CFE8HBUF EQU 24HSEC EQU 21HCSEG AT 0000H LJMP STARTCSEG AT 400BH LJMP CLOCKCSEG AT 4100HSTART: MOV DPTR,#PORT+1 ;8279显示RAM全部清零 MOV A,#0D1H MOVX DPTR,A MOV TMOD,#01H ;定时器0设置为方式一 MOV TL0,#0AFH ;置时间常数,每0.1秒中断一次 MOV TH0,#3CH MOV SEC,#00H MOV BUF,#00H SETB ET0 SETB EA SETB TR0LOOP: MOV DPTR,#PORT+1 ;写显示缓冲RAM命令 MOV A,#80H MOVX DPTR,A MOV R1,#21H ;秒字节地址入R1 MOV DPTR,#PORT ;8279数据端口地址DL0: MOV A,R1 ;取相应的时间值 MOV R2,A ;存入R2中 SWAP A ANL A,#0FH ;获取高半字节 ACALL TABLE MOVX DPTR,A ;送入缓冲区 MOV DPTR,#PORT+1 ;写显示缓冲RAM命令 MOV A,#81H MOVX DPTR,A MOV DPTR,#PORT MOV A,R2 ANL A,#0FH ;获取低半字节 ACALL TABLE MOVX DPTR,A LJMP LOOP ;否则从头开始显示TABLE: INC A ;取相应段显码 MOVC A,A+PC RET DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FHCLOCK: MOV TL0,#0AFH ;重置时间常数 MOV TH0,#3CH PUSH ACC PUSH PSW INC BUF ;计数值加一 MOV A,BUF CJNE A,#0AH,ENDT ;到一秒了吗?没有则退到ENDT MOV BUF,#00H ;到一秒了,计数值置零 MOV A,SEC INC A ;秒值加一,经十进制调整 DA A MOV SEC,A ;送回秒字节 CJNE A,#60H,ENDT ;秒值为60否? MOV SEC,#00H ;是,清零 ENDT: POP PSW POP ACC RETI ;中断返回ENDNAME T11 ;8279键盘实验二;将键盘的KA10KA12接8259的KA0KA2;RL10RL17接8255A的RL0RL7 ; T11 8279键盘显示接口实验二CSEG AT 0000H LJMP STARTCSEG AT 4100HSTART: MOV DPTR,#00CFE9H ;8279命令字 MOV A,#0D1H ;清显示 MOVX DPTR,ALOOP1: MOVX A,DPTR ANL A,#0FH JZ LOOP1 ;有键按下?没有则循环等待 MOV A,#0A0H ;显示消隐命令 MOVX DPTR,A MOV A,#40H ;读FIFO命令 MOVX DPTR,A MOV DPTR,#0CFE8H ;读键值 MOVX A,DPTR MOV R1,A ;保存键值 MOV DPTR,#0CFE9H ;写显示RAM命令 MOV A,#81H ;选中LED2 MOVX DPTR,A MOV A,R1 ANL A,#0FH ;取后半字节 MOV DPTR,#TAB MOVC A,A+DPTR ;取段显码 MOV DPTR,#0CFE8H ;写显示RAM MOVX DPTR,A MOV DPTR,#0CFE9H ;写显示RAM命令 MOV A,#80H ;选中LED1 MOVX DPTR,A MOV A,R1 ANL A,#0F0H SWAP A ;取后半字节 MOV DPTR,#TAB MOVC A,A+DPTR ;取段显码 MOV DPTR,#0CFE8H ;写显示RAM MOVX DPTR,A MOV DPTR,#0CFE9H SJMP LOOP1TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;段显码表 db 7fh,6fh,77h,7ch,39h,5eh,79h,71hEND;8031的TXD接RXD;74LS273的CS273接CS0;SO0SO7接发光二极管的L1L8;NAME T12 ;串行口实验一CSEG AT 0000H LJMP STARTCSEG AT 4100HPORT EQU 0CFA0HSTART: MOV TMOD,#20H ;选择定时器模式2,计时方式 MOV TL1,#0F2H ;预置时间常数,波特率为1200 MOV TH1,#0F2H MOV 87H,#00H ;PCON=00,使SMOD=0 SETB TR1 ;启动定时器1 MOV SCON,#50H ;串行口工作于方式1,允许串行接收 MOV R1,#12H ;R1中存放显示计数值 MOV DPTR,#TABLE MOV A,DPL MOV DPTR,#L1 CLR C SUBB A,DPL ;计算偏移量 MOV R5,A ;存放偏移量 MOV R0,ASEND: MOV A,R0 MOVC A,A+PC ;取显示码L1: MOV SBUF,A ;通过串行口发送显示码WAIT: JBC RI,L2 ;接收中断标志为0时循环等待 SJMP WAITL2: CLR RI ;接收中断标志清零 CLR TI ;发送中断标志清零 MOV A,SBUF ;接收数据送A MOV DPTR,#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论