51单片机课程设计源程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档