南昌大学-单片机课程设计-设计图-源程序

南昌大学-单片机课程设计-设计图-源程序
南昌大学-单片机课程设计-设计图-源程序

(上图硬件原理图可以另存为图片放大了看,清晰度五颗星,放心好了)

源程序清单

1.汇编程序

ORG 0000H ;主程序入口

0000 020030 LJMP MAIN

ORG 0003H ;外部中断0入口

0003 0200D4 LJMP A2D

ORG 000BH ;t0入口

000B 02007A LJMP SELECT

ORG 0013H ;外部中断1入口

0013 020062 LJMP KEY

ORG 0030H

MAIN: ;主程序

0030 75A886 MOV IE,#86H ;外部中断0,t0,外部中断1使能

0033 7590F6 MOV P1,#0F6H ;键盘初值

0036 758C3C MOV TH0,#3CH ;t0赋初值

0039 758AB0 MOV TL0,#0B0H

003C 758901 MOV TMOD,#01H ;设置t0工作方式为方式1

003F D288 SETB IT0 ;打开中断0

0041 120048 LCALL XUEHAO ;调用显示学号子程序

0044 7C1E MOV R4,#30 ;设置t0延时次数,即任务中延时1.5s的功能选择,因为定时器最多计时65536us,所以需要多次计时累计

0046 80FE SJMP $ ;踏步命令

0048 9001A7 XUEHAO: MOV DPTR,#XUEHAOTAB ;学号显示子程程序

004B 7A03 MOV R2,#3 ;3次刷新

004D 7B05 XUEHAO2:MOV R3,#5 ;每次发送5个显示码进数码管004F 7400 XUEHAO1:MOV A,#0 ;a清零,dptr自加来选择需要显示的字型码

0051 93 MOVC A,@A+DPTR ;查表,给a赋值

0052 F599 MOV SBUF,A ;a发送到串行口

0054 3099FD JNB TI,$ ;查询串行口发送中断标志位

0057 C299 CLR TI ;清除中断标志位,准备进行下一次发送

0059 A3 INC DPTR ;dptr加1,指向下一个字型码地址005A DBF3 DJNZ R3,XUEHAO1 ;执行显示5个字型码

005C 12018D LCALL DELAY1S ;延迟1s

005F DAEC DJNZ R2,XUEHAO2 ;刷新3次

0061 22 RET

0062 12019E KEY: LCALL DELAY10MS ;键盘按键响应程序

0065 20B311 JB P3.3,KEY1 ;延迟10ms之后判断是否按键还是按下状态,为按下则返回

0068 9001B6 MOV DPTR,#SHUZITAB ;dptr指向数字表首地址

006B 1200B4 LCALL JUDGEKEY ;调用判断键值子程序

006E 04 INC A ;键值加1调用字型码(因为硬件显示的数字比键值大1)

006F 93 MOVC A,@A+DPTR ;查表得字型码

0070 F599 MOV SBUF,A ;发送a到串行口进行显示

0072 3099FD JNB TI,$ ;

0075 C299 CLR TI

0077 D28C SETB TR0 ;打开定时器t0

0079 32 KEY1: RETI ;中断返回

SELECT: ;长按1.5s功能选择程序

007A 20B319 JB P3.3,SELECTOUT ;判断按键是否按下,否则返回

007D DC17 DJNZ R4,SELECTOUT ;判断是否达到1.5s,否则r4减1返

回(r4记录中断次数)

007F 1200B4 LCALL JUDGEKEY ;调用判断键值子程序0082 B40003 CJNE A,#0,SELECT1 ;得到a的键值,判断功能0085 12009D LCALL D2A

0088 B40103 SELECT1: CJNE A,#1,SELECT2

008B 120048 LCALL XUEHAO

008E B40303 SELECT2: CJNE A,#3,SELECT3

0091 1200CA LCALL ATOD

0094 7C1E SELECT3: MOV R4,#30 ;r4重新赋初值

0096 758C3C SELECTOUT:MOV TH0,#3CH ;定时计数器重新赋初值0099 758A0B MOV TL0,#0BH

009C 32 RETI ;中断返回

009D 900FFF D2A: MOV DPTR,#0FFFH ;数模转换程序

00A0 74C8 MOV A,#200

00A2 7A64 MOV R2,#100

00A4 14 D2A1: DEC A

00A5 F0 MOVX @DPTR,A

00A6 B400FB CJNE A,#0,D2A1

00A9 120195 LCALL DELAY3MS

00AC 04 D2A2: INC A

00AD F0 MOVX @DPTR,A

00AE B4C8FB CJNE A,#200,D2A2

00B1 DAF1 DJNZ R2,D2A1

00B3 22 RET

00B4 7800 JUDGEKEY: MOV R0,#0 ;键值判断程序

00B6 7400 MOV A,#0

00B8 309402 JNB P1.4,JP1

00BB 7801 MOV R0,#1

00BD 7590A7 JP1:MOV P1,#0A7H

00C0 309002 JNB P1.0,JP2

00C3 7402 MOV A,#2

00C5 28 JP2:ADD A,R0

00C6 7590F6 MOV P1,#0F6H

00C9 22 RET

00CA E4 ATOD: CLR A ;模数转换程序

00CB D2A8 SETB EX0 ;打开中断0

00CD 90FFFE MOV DPTR,#0FFFEH ;dptr指向adc0808首地址00D0 F0 MOVX @DPTR,A ;启动adc0808

00D1 7814 MOV R0,#20 ;重新设定采样次数

00D3 22 RET ;返回

A2D: ;模数转换中断响应程序

00D4 90FFFE MOV DPTR,#0FFFEH

00D7 D2D4 A2D1: SETB RS1 ;打开第三组

00D9 E0 MOVX A,@DPTR ;取得adc0808反馈值

00DA F5F0 MOV B,A ;把a中的值倒置(因为采样的时候是从高位到低位倒置的)

00DC 7400 MOV A,#0

00DE 30F702 JNB B.7,SS1

00E1 D2E0 SETB ACC.0

00E3 30F602 SS1:JNB B.6,SS2

00E6 D2E1 SETB ACC.1

00E8 30F502 SS2:JNB B.5,SS3

00EB D2E2 SETB ACC.2

00ED 30F402 SS3:JNB B.4,SS4

00F0 D2E3 SETB ACC.3

00F2 30F302 SS4:JNB B.3,SS5

00F5 D2E4 SETB ACC.4

00F7 30F202 SS5:JNB B.2,SS6

00FA D2E5 SETB ACC.5

00FC 30F102 SS6:JNB B.1,SS7

00FF D2E6 SETB ACC.6

0101 30F002 SS7:JNB B.0,SS8

0104 D2E7 SETB ACC.7

0106 75F033 SS8:MOV B,#51 ;以下将得到数值转换成bcd码,因为a 的范围是0~255,电压范围是0~5,所以将得到值除以51得到最高位整数值

0109 84 DIV AB ;然后第二位再乘10,除以51,得到第二位,以此类推

010A FB MOV R3,A

010B E5F0 MOV A,B

010D 75F00A MOV B,#10

0110 A4 MUL AB

0111 FA MOV R2,A

0112 E5F0 MOV A,B

0114 B4000A CJNE A,#00,LP1

0117 EA MOV A,R2

0118 75F033 MOV B,#51

011B 84 DIV AB

011C FA MOV R2,A

011D E5F0 MOV A,B

011F 800B SJMP LP2

0121 EA LP1: MOV A,R2

0122 04 INC A

0123 75F033 MOV B,#51

0126 84 DIV AB

0129 FA MOV R2,A

012A E5F0 MOV A,B

012C 75F00A LP2:MOV B,#10

012F A4 MUL AB

0130 F9 MOV R1,A

0131 E5F0 MOV A,B

0133 B40008 CJNE A,#0,LP3

0136 E9 MOV A,R1

0137 75F033 MOV B,#51

013A 84 DIV AB

013B F9 MOV R1,A

013C 8009 SJMP LP4

013E E9 LP3:MOV A,R1

013F 04 INC A

0140 75F033 MOV B,#51

0143 84 DIV AB

0144 2405 ADD A,#5

0146 F9 MOV R1,A

0147 120157 LP4:LCALL DIANYA

014A C2D4 CLR RS1

014C 90FFFE MOV DPTR,#0FFFEH

014F F0 MOVX @DPTR,A ;转换完成,最高位,次高位,最低位分别放在r3,r2,r1

0150 D882 DJNZ R0,A2D

0152 7814 MOV R0,#20

0154 C2A8 CLR EX0

0156 32 RETI

0157 74FF DIANYA: MOV A,#0ffH ;显示电压程序

0159 F599 MOV SBUF,A ;显示黑

015B 3099FD JNB TI,$

015E C299 CLR TI

0160 74FF MOV A,#0FFH

0162 F599 MOV SBUF,A

0164 3099FD JNB TI,$

0167 C299 CLR TI

0169 9001B6 MOV DPTR,#SHUZITAB

016C EB MOV A,R3

016D 93 MOVC A,@A+DPTR

016E 547F ANL A,#7FH

0170 F599 MOV SBUF,A

0172 3099FD JNB TI,$

0175 C299 CLR TI

0178 93 MOVC A,@A+DPTR

0179 F599 MOV SBUF,A

017B 3099FD JNB TI,$

017E C299 CLR TI

0180 E9 MOV A,R1

0181 93 MOVC A,@A+DPTR

0182 F599 MOV SBUF,A

0184 3099FD JNB TI,$

0187 C299 CLR TI

0189 12018D LCALL DELAY1S

018C 22 RET

018D 7D64 DELAY1S: MOV R5,#100 ;延时一秒子程序

018F 12019E DELAY1S1: LCALL DELAY10MS

0192 DDFB DJNZ R5,DELAY1S1

0194 22 RET

0195 7E06 DELAY3MS: MOV R6,#6 ;延时一秒子程序

0197 7FFA DELAY3MS1:MOV R7,#250

0199 DFFE DJNZ R7,$

019B DEFA DJNZ R6,DELAY3MS1

019D 22 RET

019E 7E14 DELAY10MS: MOV R6,#20 ;延时一秒子程序

01A0 7FFA DELAY10MS1:MOV R7,#250

01A2 DFFE DJNZ R7,$

01A4 DEFA DJNZ R6,DELAY10MS1

01A6 22 RET

01A7 FFFFF7

01AA F7F7 XUEHAOTAB:DB 0FFH,0FFH,0F7H,0F7H,0F7H ;学号显示表01AC FBFBAB

01AF A7B3 DB 0FBH,0FBH,0ABH,0A7H,0B3H

01B1 F9F9C0

01B4 82B0 DB 0F9H,0F9H,0C0H,82H,0B0H

01B6 C0F9A4

01B9 B09992

01BC 82F880

01BF 90 SHUZITAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;数字表

符号值类型

A2D = 00D4H CODE 标号

A2D1 = 00D7H CODE 标号

AC = 00D6H CONST 常量

ACC = 00E0H CONST 常量

ATOD = 00CAH CODE 标号

B = 00F0H CONST 常量

CY = 00D7H CONST 常量

D2A = 009DH CODE 标号

D2A1 = 00A4H CODE 标号

D2A2 = 00ACH CODE 标号

DELAY10MS = 019EH CODE 标号

DELAY10MS1 = 01A0H CODE 标号

DELAY1S = 018DH CODE 标号

DELAY1S1 = 018FH CODE 标号

DELAY3MS = 0195H CODE 标号

DELAY3MS1 = 0197H CODE 标号

DIANYA = 0157H 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 常量

IE = 00A8H CONST 常量

IE0 = 0089H CONST 常量

IE1 = 008BH CONST 常量

IP = 00B8H CONST 常量

IT0 = 0088H CONST 常量

IT1 = 008AH CONST 常量

JP1 = 00BDH CODE 标号

JP2 = 00C5H CODE 标号

KEY = 0062H CODE 标号KEY1 = 0079H CODE 标号LP1 = 0121H CODE 标号LP2 = 012CH CODE 标号LP3 = 013EH CODE 标号LP4 = 0147H CODE 标号MAIN = 0030H 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 常量SELECT = 007AH CODE 标号SELECT1 = 0088H CODE 标号SELECT2 = 008EH CODE 标号SELECT3 = 0094H CODE 标号SELECTOUT = 0096H CODE 标号SHUZITAB = 01B6H CODE 标号SM0 = 009FH CONST 常量SM1 = 009EH CONST 常量SM2 = 009DH CONST 常量SP = 0081H CONST 常量SS1 = 00E3H CODE 标号SS2 = 00E8H CODE 标号SS3 = 00EDH CODE 标号SS4 = 00F2H CODE 标号SS5 = 00F7H CODE 标号SS6 = 00FCH CODE 标号

SS8 = 0106H CODE 标号

TB8 = 009BH CONST 常量

TCON = 0088H CONST 常量

TF0 = 008DH CONST 常量

TF1 = 008FH CONST 常量

TH0 = 008CH CONST 常量

TH1 = 008DH CONST 常量

TI = 0099H CONST 常量

TL0 = 008AH CONST 常量

TL1 = 008BH CONST 常量

TMOD = 0089H CONST 常量

TR0 = 008CH CONST 常量

TR1 = 008EH CONST 常量

XUEHAO = 0048H CODE 标号

XUEHAO1 = 004FH CODE 标号

XUEHAO2 = 004DH CODE 标号

XUEHAOTAB = 01A7H CODE 标号

公有符号: 97

私有符号: 0

以下程序为wave输入源程序,不带机器码,方便同学复制粘贴体验神奇效果~

ORG 0000H ;主程序入口

LJMP MAIN

ORG 0003H ;外部中断0入口

LJMP A2D

ORG 000BH ;t0入口

LJMP SELECT

ORG 0013H ;外部中断1入口

LJMP KEY

ORG 0030H

MAIN: ;主程序

MOV IE,#86H ;外部中断0,t0,外部中断1使能

MOV P1,#0F6H ;键盘初值

MOV TH0,#3CH ;t0赋初值

MOV TL0,#0B0H

MOV TMOD,#01H ;设置t0工作方式为方式1

SETB IT0 ;打开中断0

LCALL XUEHAO ;调用显示学号子程序

MOV R4,#30 ;设置t0延时次数,即任务中延时1.5s的功能选择,因为定时器最多计时65536us,所以需要多次计时累计

SJMP $ ;踏步命令

XUEHAO: MOV DPTR,#XUEHAOTAB ;学号显示子程程序

MOV R2,#3 ;3次刷新

XUEHAO2:MOV R3,#5 ;每次发送5个显示码进数码管

XUEHAO1:MOV A,#0 ;a清零,dptr自加来选择需要显示的字型码MOVC A,@A+DPTR ;查表,给a赋值

MOV SBUF,A ;a发送到串行口

JNB TI,$ ;查询串行口发送中断标志位

CLR TI ;清除中断标志位,准备进行下一次发送

INC DPTR ;dptr加1,指向下一个字型码地址

DJNZ R3,XUEHAO1 ;执行显示5个字型码

LCALL DELAY1S ;延迟1s

DJNZ R2,XUEHAO2 ;刷新3次

RET

KEY: LCALL DELAY10MS ;键盘按键响应程序

JB P3.3,KEY1 ;延迟10ms之后判断是否按键还是按下状态,为按下则返回

MOV DPTR,#SHUZITAB ;dptr指向数字表首地址

LCALL JUDGEKEY ;调用判断键值子程序

INC A ;键值加1调用字型码(因为硬件显示的数字比键值大1)

MOVC A,@A+DPTR ;查表得字型码

MOV SBUF,A ;发送a到串行口进行显示

JNB TI,$ ;

CLR TI

SETB TR0 ;打开定时器t0

KEY1: RETI ;中断返回

SELECT: ;长按1.5s功能选择程序

JB P3.3,SELECTOUT ;判断按键是否按下,否则返回

DJNZ R4,SELECTOUT ;判断是否达到1.5s,否则r4减1返回(r4记录中断次数)

LCALL JUDGEKEY ;调用判断键值子程序

CJNE A,#0,SELECT1 ;得到a的键值,判断功能

LCALL D2A

SELECT1: CJNE A,#1,SELECT2

LCALL XUEHAO

SELECT2: CJNE A,#3,SELECT3

LCALL ATOD

SELECT3: MOV R4,#30 ;r4重新赋初值

SELECTOUT:MOV TH0,#3CH ;定时计数器重新赋初值

MOV TL0,#0BH

RETI ;中断返回

D2A: MOV DPTR,#0FFFH ;数模转换程序

MOV A,#200

MOV R2,#100

D2A1: DEC A

MOVX @DPTR,A

CJNE A,#0,D2A1

LCALL DELAY3MS

D2A2: INC A

MOVX @DPTR,A

CJNE A,#200,D2A2

DJNZ R2,D2A1

RET

JUDGEKEY: MOV R0,#0 ;键值判断程序

MOV A,#0

JNB P1.4,JP1

MOV R0,#1

JP1:MOV P1,#0A7H

JNB P1.0,JP2

MOV A,#2

JP2:ADD A,R0

MOV P1,#0F6H

ATOD: CLR A ;模数转换程序

SETB EX0 ;打开中断0

MOV DPTR,#0FFFEH ;dptr指向adc0808首地址

MOVX @DPTR,A ;启动adc0808

MOV R0,#20 ;重新设定采样次数

RET ;返回

A2D: ;模数转换中断响应程序

MOV DPTR,#0FFFEH

A2D1: SETB RS1 ;打开第三组

MOVX A,@DPTR ;取得adc0808反馈值

MOV B,A ;把a中的值倒置(因为采样的时候是从高位到低位倒置的)

MOV A,#0

JNB B.7,SS1

SETB ACC.0

SS1:JNB B.6,SS2

SETB ACC.1

SS2:JNB B.5,SS3

SETB ACC.2

SS3:JNB B.4,SS4

SETB ACC.3

SS4:JNB B.3,SS5

SETB ACC.4

SS5:JNB B.2,SS6

SETB ACC.5

SS6:JNB B.1,SS7

SETB ACC.6

SS7:JNB B.0,SS8

SETB ACC.7

SS8:MOV B,#51 ;以下将得到数值转换成bcd码,因为a的范围是0~255,电压范围是0~5,所以将得到值除以51得到最高位整数值

DIV AB ;然后第二位再乘10,除以51,得到第二位,以此类推MOV R3,A

MOV A,B

MOV B,#10

MUL AB

MOV R2,A

MOV A,B

CJNE A,#00,LP1

MOV A,R2

MOV B,#51

MOV R2,A

MOV A,B

SJMP LP2

LP1: MOV A,R2

INC A

MOV B,#51

DIV AB

ADD A,#5

MOV R2,A

MOV A,B

LP2:MOV B,#10

MUL AB

MOV R1,A

MOV A,B

CJNE A,#0,LP3

MOV A,R1

MOV B,#51

DIV AB

MOV R1,A

SJMP LP4

LP3:MOV A,R1

INC A

MOV B,#51

DIV AB

ADD A,#5

MOV R1,A

LP4:LCALL DIANYA

CLR RS1

MOV DPTR,#0FFFEH

MOVX @DPTR,A ;转换完成,最高位,次高位,最低位分别放在r3,r2,r1

DJNZ R0,A2D

MOV R0,#20

CLR EX0

RETI

DIANYA: MOV A,#0ffH ;显示电压程序

MOV SBUF,A ;显示黑

JNB TI,$

CLR TI

MOV A,#0FFH

MOV SBUF,A

JNB TI,$

MOV DPTR,#SHUZITAB

MOV A,R3

MOVC A,@A+DPTR

ANL A,#7FH

MOV SBUF,A

JNB TI,$

CLR TI

MOV A,R2

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI,$

CLR TI

MOV A,R1

MOVC A,@A+DPTR

MOV SBUF,A

JNB TI,$

CLR TI

LCALL DELAY1S

RET

DELAY1S: MOV R5,#100 ;延时一秒子程序DELAY1S1: LCALL DELAY10MS

DJNZ R5,DELAY1S1

RET

DELAY3MS: MOV R6,#6 ;延时一秒子程序DELAY3MS1:MOV R7,#250

DJNZ R7,$

DJNZ R6,DELAY3MS1

RET

DELAY10MS: MOV R6,#20 ;延时一秒子程序DELAY10MS1:MOV R7,#250

DJNZ R7,$

DJNZ R6,DELAY10MS1

RET

XUEHAOTAB:DB 0FFH,0FFH,0F7H,0F7H,0F7H ;学号显示表DB 0FBH,0FBH,0ABH,0A7H,0B3H

DB 0F9H,0F9H,0C0H,82H,0B0H

SHUZITAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;数字表

相关主题
相关文档
最新文档