51单片机课程设计源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TIME0_DOWN EQU F0 ;将F0设置为定时器0定时到标志
FINISH_ID EQU 30H ;学号发送标志
KEY_FLAG BIT 00H ;有键按下标志
KEY_LONG BIT 01H ;键长按
KEY_D EQU 31H ;键值存放地址
ADC0809_AD EQU 8000H ;设置ADC0809地址
DAC0832_AD EQU 0000H ;设置DAC0832地址
ADC_FLAG BIT 02H ;设置ADC0809读数据标志
ADC_DATE EQU 32H ;设置ADC0809数据地址
ADC_0 EQU 33H ;ADC0809转化为BCD码后个位存放地址
ADC_1 EQU 34H ;十分位存放地址
ADC_2 EQU 35H ;百分位存放地址
ADC_3 EQU 36H ;千分位存放地址
ORG 0000H ;程序开始,跳转至主程序
0000 020030 LJMP MAIN
ORG 0003H ;外部中断0入口0003 020141 LJMP INT0_IN
ORG 000BH ;设置定时器0中断入口地址
000B 020132 LJMP TIME0
ORG 0013H ;外部中断1入口0013 020151 LJMP INT1_IN
ORG 0030H ;主程序开始地址
0030 758169 MAIN: MOV SP,#69H ;初始化堆栈指针
0033 C292 CLR P1.2 ;显示器清零
0035 D292 SETB P1.2
0037 753000 MOV FINISH_ID,#0 ;将标志位清零
003A C2D5 C LR TIME0_DOWN
003C C200 CLR KEY_FLAG
003E C201 CLR KEY_LONG
0040 753100 MOV KEY_D,#0
0043 C202 CLR ADC_FLAG
0045 753200 MOV ADC_DATE,#0
0048 753300 MOV ADC_0,#0
004B 753400 MOV ADC_1,#0
004E 753500 MOV ADC_2,#0
0051 753600 MOV ADC_3,#0
0054 C291 CLR P1.1 ;初始化键盘,行线置零,有键按下触发中断
0056 C293 CLR P1.3
0058 D2B8 S ETB PX0 ;设置键盘中断为高级中断
005A D28A SETB IT1 ;设置外部中断1为下降沿触发方式
005C 758901 MOV TMOD,#01H ;设置定时器0工作方式
005F 75A887 MOV IE,#10000111B ;开中断
;*************显示学号******************
0062 7A05 MOV R2,#5 ;显示学号程序,设置发送数据的个数
0064 EA DIS_ID: MOV A,R2
0065 C3 CLR C
0066 9401 SUBB A,#1
0068 900232 MOV DPTR,#TAB_ID ;查断码表表得到发送的数据值
006B 93 MOVC A,@A+DPTR
006C F599 MOV SBUF,A ;发送数据
006E 109902 CONT: JBC TI,NEXT ;等待数据发完,发完清除中断标志继续发送
0071 80FB SJMP CONT
0073 DAEF NEXT: DJNZ R2,DIS_ID ;判断第一段发完没有,发完后继续发送下一段
0075 7A05 MOV R2,#5 ;重赋发送数据的个数
0077 0530 INC FINISH_ID ;递增学号显示标志,判断是否发送完成
0079 E530 MOV A,FINISH_ID
007B B40306 CJNE A,#3,NEXT1 ;没有完成则先延时后继续发送
007E 753000 MOV FINISH_ID,#0
0081 02009F LJMP OTHER ;发送完成后执行其他程序0084 758C3C NEXT1: MOV TH0,#3CH ;定时器0定时初值,延时50ms,计算方法:
0087 758AB0 MOV
TL0,#0B0H ;TH0=(65536-50000)/256,TL0=(65536-50000)%25 6
008A 7B1E MOV R3,#30 ;设置软件计数器,计30次,即1.5s
008C D28C S ETB TR0 ;启动定时器0
008E E582 MOV A,DPL ;发完一次后DPTR加5,指向下一页数据
0090 2405 ADD A,#5
0092 F582 MOV DPL,A
0094 E583 MOV A,DPH
0096 3400 ADDC A,#0
0098 F583 MOV DPH,A
009A 10D5C7 L1: JBC TIME0_DOWN,DIS_ID ;等待计时时间到,时间
到继续下步显示
009D 80FB SJMP L1
;************判断按键执行其他功能**************
009F 3000C2 OTHER: JNB KEY_FLAG,DIS_ID ;判断是否有键按下,没有则继续显示学号
00A2 C2A8 CLR EX0 ;如果有键按下,则关闭键盘中断,以免再次中断导致键值读错
00A4 758C3C M OV TH0,#3CH ;开启定时器0,计算是否为长按键
00A7 758AB0 M OV TL0,#0B0H
00AA 7B1E M OV R3,#30
00AC D28C SETB TR0
00AE 1200D0 L CALL KEYSCAN ;键盘扫描,以确定按键值和长按键
00B1 200103 JB KEY_LONG,SEC_FUN ;判断是否为长按键,若是,则调用第二功能
00B4 020064 LJMP DIS_ID ;否则继续显示学号
00B7 C201 SEC_FUN:CLR KEY_LONG ;清楚长按键标志00B9 900252 MOV DPTR,#TAB_FUN ;利用查转向地址表法执行对应第二功能程序
00BC E531 MOV A,KEY_D
00BE 2531 ADD A,KEY_D
00C0 73 JMP @A+DPTR
;*********delay10ms子程序**************
00C1 D2D3 DELAY_10MS: SETB PSW.3 ;10MS延时子程序
00C3 780A DL0: MOV R0,#10
00C5 797D DL1: MOV R1,#7DH
00C7 00 NOP
00C8 00 NOP
00C9 D9FA DJNZ R1,DL1
00CB D8F6 DJNZ R0,DL0
00CD C2D3 CLR PSW.3
00CF 22 RET
;**********键盘扫描子程序**************
00D0 5390FD KEYSCAN: ANL P1,#11111101B ;键盘扫描子程序,先将P1.1赋0,P1.3赋1
00D3 439008 ORL P1,#00001000B
00D6 E590 MOV A,P1 ;读回P1.5,P1.7的值,若P1.5为0,则键值为0
00D8 20E506 JB ACC.5,K1
00DB 753100 MOV KEY_D,#0
00DE 020104 LJMP OUT_KS1 ;若P1.7为1,则键值为1
00E1 20E706 K1: JB ACC.7,KS
00E4 753101 MOV KEY_D,#1