当前位置:文档之家› 51单片机课程设计源程序

51单片机课程设计源程序

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 MAINORG 0003H ;外部中断0入口0003 020141 LJMP INT0_INORG 000BH ;设置定时器0中断入口地址000B 020132 LJMP TIME0ORG 0013H ;外部中断1入口0013 020151 LJMP INT1_INORG 0030H ;主程序开始地址0030 758169 MAIN: MOV SP,#69H ;初始化堆栈指针0033 C292 CLR P1.2 ;显示器清零0035 D292 SETB P1.20037 753000 MOV FINISH_ID,#0 ;将标志位清零003A C2D5 C LR TIME0_DOWN003C C200 CLR KEY_FLAG003E C201 CLR KEY_LONG0040 753100 MOV KEY_D,#00043 C202 CLR ADC_FLAG0045 753200 MOV ADC_DATE,#00048 753300 MOV ADC_0,#0004B 753400 MOV ADC_1,#0004E 753500 MOV ADC_2,#00051 753600 MOV ADC_3,#00054 C291 CLR P1.1 ;初始化键盘,行线置零,有键按下触发中断0056 C293 CLR P1.30058 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,R20065 C3 CLR C0066 9401 SUBB A,#10068 900232 MOV DPTR,#TAB_ID ;查断码表表得到发送的数据值006B 93 MOVC A,@A+DPTR006C F599 MOV SBUF,A ;发送数据006E 109902 CONT: JBC TI,NEXT ;等待数据发完,发完清除中断标志继续发送0071 80FB SJMP CONT0073 DAEF NEXT: DJNZ R2,DIS_ID ;判断第一段发完没有,发完后继续发送下一段0075 7A05 MOV R2,#5 ;重赋发送数据的个数0077 0530 INC FINISH_ID ;递增学号显示标志,判断是否发送完成0079 E530 MOV A,FINISH_ID007B B40306 CJNE A,#3,NEXT1 ;没有完成则先延时后继续发送007E 753000 MOV FINISH_ID,#00081 02009F LJMP OTHER ;发送完成后执行其他程序0084 758C3C NEXT1: MOV TH0,#3CH ;定时器0定时初值,延时50ms,计算方法:0087 758AB0 MOVTL0,#0B0H ;TH0=(65536-50000)/256,TL0=(65536-50000)%25 6008A 7B1E MOV R3,#30 ;设置软件计数器,计30次,即1.5s008C D28C S ETB TR0 ;启动定时器0008E E582 MOV A,DPL ;发完一次后DPTR加5,指向下一页数据0090 2405 ADD A,#50092 F582 MOV DPL,A0094 E583 MOV A,DPH0096 3400 ADDC A,#00098 F583 MOV DPH,A009A 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,#0B0H00AA 7B1E M OV R3,#3000AC D28C SETB TR000AE 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_D00BE 2531 ADD A,KEY_D00C0 73 JMP @A+DPTR;*********delay10ms子程序**************00C1 D2D3 DELAY_10MS: SETB PSW.3 ;10MS延时子程序00C3 780A DL0: MOV R0,#1000C5 797D DL1: MOV R1,#7DH00C7 00 NOP00C8 00 NOP00C9 D9FA DJNZ R1,DL100CB D8F6 DJNZ R0,DL000CD C2D3 CLR PSW.300CF 22 RET;**********键盘扫描子程序**************00D0 5390FD KEYSCAN: ANL P1,#11111101B ;键盘扫描子程序,先将P1.1赋0,P1.3赋100D3 439008 ORL P1,#00001000B00D6 E590 MOV A,P1 ;读回P1.5,P1.7的值,若P1.5为0,则键值为000D8 20E506 JB ACC.5,K100DB 753100 MOV KEY_D,#000DE 020104 LJMP OUT_KS1 ;若P1.7为1,则键值为100E1 20E706 K1: JB ACC.7,KS00E4 753101 MOV KEY_D,#100E7 020104 LJMP OUT_KS100EA 5390F7 KS: ANL P1,#11110111B ;再将P1.3赋0,P1.1赋1 00ED 439042 ORL P1,#01000010B00F0 E590 MOV A,P1 ;读回P1.5,P1.7的值,若P1.5为0,则键值为200F2 20E506 JB ACC.5,K200F5 753102 MOV KEY_D,#200F8 020104 LJMP OUT_KS100FB 20E706 K2: JB ACC.7,OUT_KS1 ;若P1.7为0,则键值为300FE 753103 MOV KEY_D,#30101 020104 LJMP OUT_KS1 ;读出键值后判断松手0104 E590 OUT_KS1: MOV A,P1 ;读回P1值0106 445F ORL A,#5FH ;屏蔽不相干位0108 F4 CPL A ;变0有效为1有效0109 600B JZ OUT_KS2 ;判断是否继续为0,若为0,则说明松手了,继续判断是否为长按键010B E531 MOV A,KEY_D ;若不为0,则显示键值010D 900241 MOV DPTR,#TAB_NUM ;查表法显示键值0110 93 MOVC A,@A+DPTR0111 120126 LCALL DIS_NUM ;调用显示键值程序0114 80EE SJMP OUT_KS1 ;循环判断是否松手0116 30D504 OUT_KS2: JNB TIME0_DOWN,OUT_KS3 ;判断定时器0是否定时完,若完,则置长按键标志0119 C2D5 CLR TIME0_DOWN ;否则,直接返回011B D201 SETB KEY_LONG011D C200 OUT_KS3: CLR KEY_FLAG ;先清除按键标志,关闭蜂鸣器,关闭定时器0,再返回011F C28C CLR TR00121 D2A8 SETB EX00123 D290 SETB P1.00125 22 RET;************显示键值子程序***************0126 7C05 DIS_NUM: MOV R4,#50128 F599 DIS_NUM1: MOV SBUF,A012A 109902 LP: JBC TI,DIS_NUM2012D 80FB SJMP LP012F DCF7 DIS_NUM2: DJNZ R4,DIS_NUM10131 22 RET;*********定时器0中断服务程序*************0132 758C3C TIME0: MOV TH0,#3CH ;重复初值0135 758AB0 MOV TL0,#0B0H0138 DB06 D JNZ R3,OUT_TIME0 ;递减软件计数器,若减为0,说明计数时间到013A 7B1E MOV R3,#30 ;否则,直接返回013C C28C CLR TR0 ;计数时间到后,重赋软件计数器初值,关闭计数器013E D2D5 SETB TIME0_DOWN ;设定计数时间到标志0140 32 OUT_TIME0: RETI;*********外部中断0中断服务程序**********0141 C0D0 INT0_IN: PUSH PSW ;保护现场0143 1200C1 LCALL DELAY_10MS ;出现中断信号后,先延时10ms0146 A2B2 MOV C,P3.2 ;读回P3.2引脚状态0148 4006 JC OUT_INT0 ;若继续为低电平,则确定有键按下,置按键标志,开启蜂鸣器后返回014A D200 SETB KEY_FLAG ;若为高电平,说明为干扰信号,标志位不置位直接返回014C C290 CLR P1.0014E D0D0 POP PSW ;恢复现场0150 32 OUT_INT0: RETI;*********外部中断1中断服务程序**********0151 C0E0 INT1_IN: PUSH ACC ;保护现场0153 908000 MOV DPTR,#ADC0809_AD ;给ADC0809地址,读回AD转换值0156 E0 MOVX A,@DPTR0157 F532 MOV ADC_DATE,A0159 D202 SETB ADC_FLAG ;AD读完数据标志置位015B D0E0 POP ACC ;恢复现场015D 32 RETI;*********AD功能程序*********************015E 908000 FUN_AD: MOV DPTR,#ADC0809_AD ;DPTR赋值为ADC0809地址0161 F0 MOVX @DPTR,A ;打开AD0162 100202 L3: JBC ADC_FLAG,NEXT2 ;等待AD是读数完成0165 80FB SJMP L30167 E532 NEXT2: MOV A,ADC_DATE ;将AD读数送A 0169 75F013 MOV B,#19 ;将读到的值乘以19得到应该显示的读数值016C A4 MUL AB016D D2D4 SETB PSW.4 ;保护第0组工作寄存器016F FA MOV R2,A ;先把该显示的值暂存0170 ABF0 MOV R3,B0172 C3 AD0: CLR C ;把暂存的值转化为4位BCD码0173 EA MOV A,R2 ;利用减法,先减1000,够减则相应位加1,否则,恢复原值0174 94E8 SUBB A,#0E8H ;继续减100,得到百位值,同上的方法0176 FA MOV R2,A ;十位和个位利用除法得到0177 EB MOV A,R30178 9403 SUBB A,#03H017A FB MOV R3,A017B 4004 JC AD01017D 0533 INC ADC_0017F 80F1 SJMP AD00181 EA AD01: MOV A,R20182 24E8 ADD A,#0E8H0184 FA MOV R2,A0185 EB MOV A,R30186 3403 ADDC A,#03H0188 FB MOV R3,A0189 EA AD1: MOV A,R2018A C3 CLR C018B 9464 SUBB A,#64H018D FA MOV R2,A018E EB MOV A,R3018F 9400 SUBB A,#00191 FB MOV R3,A0192 4004 JC AD110194 0534 INC ADC_10196 80F1 SJMP AD10198 EA AD11: MOV A,R20199 2464 ADD A,#64H019B 75F00A MOV B,#10019E 84 DIV AB019F F535 MOV ADC_2,A01A1 85F036 MOV ADC_3,B01A4 E536 MOV A,ADC_3 ;判断最后一位的值大小,若小于5,舍掉01A6 B40500 CJNE A,#5,AD2 ;否则,向高位进101A9 401C AD2: JC SHE01AB E535 MOV A,ADC_201AD 2401 ADD A,#101AF D4 DA A01B0 FC MOV R4,A01B1 540F ANL A,#0FH01B3 F535 MOV ADC_2,A01B5 EC MOV A,R401B6 C4 SWAP A01B7 540F ANL A,#0FH01B9 2534 ADD A,ADC_101BB D4 DA A01BC FC MOV R4,A01BD 540F ANL A,#0FH01BF F534 MOV ADC_1,A01C1 EC MOV A,R401C2 C4 SWAP A01C3 540F ANL A,#0FH01C5 2433 ADD A,#ADC_001C7 753600 SHE: MOV ADC_3,#001CA 1201D8 LCALL DIS_AD ;转换后显示转换值01CD C2D4 CLR PSW.4 ;恢复第0组工作寄存器01CF 200003 JB KEY_FLAG,AD_OUT ;等待其他键按下01D2 02015E LJMP FUN_AD01D5 02009F AD_OUT: LJMP OTHER;***********AD显示功能********************01D8 E535 DIS_AD: MOV A,ADC_2 ;先发送最后一位01DA 900241 MOV DPTR,#TAB_NUM ;查表得到段码01DD 93 MOVC A,@A+DPTR01DE F599 MOV SBUF,A ;发送段码01E0 109902 A_0: JBC TI,DIS_AD0 ;等待发完,未完继续等待,完成后发送下一个01E3 80FB SJMP A_001E5 E534 DIS_AD0: MOV A,ADC_101E7 900241 MOV DPTR,#TAB_NUM01EA 93 MOVC A,@A+DPTR01EB F599 MOV SBUF,A01ED 109902 A_1: JBC TI,DIS_AD101F0 80FB SJMP A_101F2 E533 DIS_AD1: MOV A,ADC_001F4 90024C MOV DPTR,#TAB_DOT01F7 93 MOVC A,@A+DPTR01F8 F599 MOV SBUF,A01FA 109902 A_2: JBC TI,DIS_AD201FD 80FB SJMP A_201FF 7400 DIS_AD2: MOV A,#00H0201 F599 MOV SBUF,A0203 109902 A_3: JBC TI,DIS_AD30206 80FB SJMP A_30208 7400 DIS_AD3: MOV A,#00H020A F599 MOV SBUF,A020C 109902 A_4: JBC TI,OUT_DIS_AD020F 80FB SJMP A_40211 22 OUT_DIS_AD: RET;************DA功能************************0212 900000 FUN_DA: MOV DPTR,#DAC0832_AD ;赋DA地址0215 7400 MOV A,#00H ;发送数据给DAC08320217 F0 UP: MOVX @DPTR,A0218 04 INC A ;A加1后继续传0219 00 NOP ;等待时间到021A 00 NOP021B 00 NOP021C 00 NOP021D 00 NOP021E 70F7 JNZ UP0220 14 DOWN: DEC A ;A加完后开始减1 0221 F0 MOVX @DPTR,A ;传送数据给DAC08320222 00 NOP0223 00 NOP0224 00 NOP0225 00 NOP0226 00 NOP0227 70F7 JNZ DOWN0229 200003 JB KEY_FLAG,DA_OUT ;判断是否有其他键按下,有即跳出DA功能,无则继续跳回DA功能022C 04 INC A022D 80E8 SJMP UP022F 02009F DA_OUT: LJMP OTHER0232 0000800235 8080 TAB_ID: DB 00H,00H,80H,80H,80H ;学号显示断码表0237 404046023A C686 DB 40H,40H,46H,0C6H,86H023C 6060FC023F FEDA DB 60H,60H,0FCH,0FEH,0DAH0241 FC60DA0244 F266B60247 BEE0FE024A F600 TAB_NUM: DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,00H ;数字断码表024C FD61DB024F F367B7 TAB_DOT: DB 0FDH,61H,0DBH,0F3H,67H,0B7H ;带小数点数字断码表0252 0164 TAB_FUN: AJMPDIS_ID ;第二功能转向地址表0254 0164 AJMP DIS_ID0256 215E AJMP FUN_AD0258 4112 AJMP FUN_DAEND符号值类型AC = 00D6H CONST 常量ACC = 00E0H CONST 常量AD0 = 0172H CODE 标号AD01 = 0181H CODE 标号AD1 = 0189H CODE 标号AD11 = 0198H CODE 标号AD2 = 01A9H CODE 标号ADC0809_AD = 8000H CONST 常量ADC_0 = 0033H CONST 常量ADC_1 = 0034H CONST 常量ADC_2 = 0035H CONST 常量ADC_3 = 0036H CONST 常量ADC_DATE = 0032H CONST 常量ADC_FLAG = 0002H CONST 常量AD_OUT = 01D5H CODE 标号A_0 = 01E0H CODE 标号A_1 = 01EDH CODE 标号A_2 = 01FAH CODE 标号A_3 = 0203H CODE 标号A_4 = 020CH CODE 标号B = 00F0H CONST 常量CONT = 006EH CODE 标号CY = 00D7H CONST 常量DAC0832_AD = 0000H CONST 常量DA_OUT = 022FH CODE 标号DELAY_10MS = 00C1H CODE 标号DIS_AD = 01D8H CODE 标号DIS_AD0 = 01E5H CODE 标号DIS_AD1 = 01F2H CODE 标号DIS_AD2 = 01FFH CODE 标号DIS_AD3 = 0208H CODE 标号DIS_ID = 0064H CODE 标号DIS_NUM = 0126H CODE 标号DIS_NUM1 = 0128H CODE 标号DIS_NUM2 = 012FH CODE 标号DL0 = 00C3H CODE 标号DL1 = 00C5H CODE 标号DOWN = 0220H CODE 标号DPH = 0083H CONST 常量DPL = 0082H CONST 常量EA = 00AFH CONST 常量ES = 00ACH CONST 常量ET0 = 00A9H CONST 常量ET1 = 00ABH CONST 常量EX0 = 00A8H CONST 常量EX1 = 00AAH CONST 常量F0 = 00D5H CONST 常量F1 = 00D1H CONST 常量FINISH_ID = 0030H CONST 常量FUN_AD = 015EH CODE 标号FUN_DA = 0212H CODE 标号IE = 00A8H CONST 常量IE0 = 0089H CONST 常量IE1 = 008BH CONST 常量INT0_IN = 0141H CODE 标号INT1_IN = 0151H CODE 标号IP = 00B8H CONST 常量IT0 = 0088H CONST 常量IT1 = 008AH CONST 常量K1 = 00E1H CODE 标号K2 = 00FBH CODE 标号KEYSCAN = 00D0H CODE 标号KEY_D = 0031H CONST 常量KEY_FLAG = 0000H CONST 常量KEY_LONG = 0001H CONST 常量KS = 00EAH CODE 标号L1 = 009AH CODE 标号L3 = 0162H CODE 标号LP = 012AH CODE 标号MAIN = 0030H CODE 标号NEXT = 0073H CODE 标号NEXT1 = 0084H CODE 标号NEXT2 = 0167H CODE 标号OTHER = 009FH CODE 标号OUT_DIS_AD = 0211H CODE 标号OUT_INT0 = 0150H CODE 标号OUT_KS1 = 0104H CODE 标号OUT_KS2 = 0116H CODE 标号OUT_KS3 = 011DH CODE 标号OUT_TIME0 = 0140H CODE 标号OV = 00D2H CONST 常量P = 00D0H CONST 常量P0 = 0080H CONST 常量P1 = 0090H CONST 常量P2 = 00A0H CONST 常量P3 = 00B0H CONST 常量PCON = 0087H CONST 常量PS = 00BCH CONST 常量PSW = 00D0H CONST 常量PT0 = 00B9H CONST 常量PT1 = 00BBH CONST 常量PX0 = 00B8H CONST 常量PX1 = 00BAH CONST 常量RB8 = 009AH CONST 常量REN = 009CH CONST 常量RI = 0098H CONST 常量RS0 = 00D3H CONST 常量RS1 = 00D4H CONST 常量SBUF = 0099H CONST 常量SCON = 0098H CONST 常量SEC_FUN = 00B7H CODE 标号SHE = 01C7H CODE 标号SM0 = 009FH CONST 常量SM1 = 009EH CONST 常量SM2 = 009DH CONST 常量SP = 0081H CONST 常量TAB_DOT = 024CH CODE 标号TAB_FUN = 0252H CODE 标号TAB_ID = 0232H CODE 标号TAB_NUM = 0241H CODE 标号TB8 = 009BH CONST 常量TCON = 0088H CONST 常量TF0 = 008DH CONST 常量TF1 = 008FH CONST 常量TH0 = 008CH CONST 常量TH1 = 008DH CONST 常量TI = 0099H CONST 常量TIME0 = 0132H CODE 标号TIME0_DOWN = 00D5H CONST 常量TL0 = 008AH CONST 常量TL1 = 008BH CONST 常量TMOD = 0089H CONST 常量TR0 = 008CH CONST 常量TR1 = 008EH CONST 常量UP = 0217H CODE 标号公有符号: 125 私有符号: 0。

相关主题