51单片机课程设计源程序.docx
- 文档编号:27354871
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:19
- 大小:20.79KB
51单片机课程设计源程序.docx
《51单片机课程设计源程序.docx》由会员分享,可在线阅读,更多相关《51单片机课程设计源程序.docx(19页珍藏版)》请在冰豆网上搜索。
51单片机课程设计源程序
TIME0_DOWNEQUF0;将F0设置为定时器0定时到标志
FINISH_IDEQU30H;学号发送标志
KEY_FLAGBIT00H;有键按下标志
KEY_LONGBIT01H;键长按
KEY_DEQU31H;键值存放地址
ADC0809_ADEQU8000H;设置ADC0809地址
DAC0832_ADEQU0000H;设置DAC0832地址
ADC_FLAGBIT02H;设置ADC0809读数据标志
ADC_DATEEQU32H;设置ADC0809数据地址
ADC_0EQU33H;ADC0809转化为BCD码后个位存放地址
ADC_1EQU34H;十分位存放地址
ADC_2EQU35H;百分位存放地址
ADC_3EQU36H;千分位存放地址
ORG0000H;程序开始,跳转至主程序
0000020030LJMPMAIN
ORG0003H;外部中断0入口
0003020141LJMPINT0_IN
ORG000BH;设置定时器0中断入口地址
000B020132LJMPTIME0
ORG0013H;外部中断1入口
0013020151LJMPINT1_IN
ORG0030H;主程序开始地址
0030758169MAIN:
MOVSP,#69H;初始化堆栈指针
0033C292CLRP1.2;显示器清零
0035D292SETBP1.2
0037753000MOVFINISH_ID,#0;将标志位清零
003AC2D5CLRTIME0_DOWN
003CC200CLRKEY_FLAG
003EC201CLRKEY_LONG
0040753100MOVKEY_D,#0
0043C202CLRADC_FLAG
0045753200MOVADC_DATE,#0
0048753300MOVADC_0,#0
004B753400MOVADC_1,#0
004E753500MOVADC_2,#0
0051753600MOVADC_3,#0
0054C291CLRP1.1;初始化键盘,行线置零,有键按下触发中断
0056C293CLRP1.3
0058D2B8SETBPX0;设置键盘中断为高级中断
005AD28ASETBIT1;设置外部中断1为下降沿触发方式
005C758901MOVTMOD,#01H;设置定时器0工作方式
005F75A887MOVIE,#10000111B;开中断
;*************显示学号******************
00627A05MOVR2,#5;显示学号程序,设置发送数据的个数
0064EADIS_ID:
MOVA,R2
0065C3CLRC
00669401SUBBA,#1
0068900232MOVDPTR,#TAB_ID;查断码表表得到发送的数据值
006B93MOVCA,@A+DPTR
006CF599MOVSBUF,A;发送数据
006E109902CONT:
JBCTI,NEXT;等待数据发完,发完清除中断标志继续发送
007180FBSJMPCONT
0073DAEFNEXT:
DJNZR2,DIS_ID;判断第一段发完没有,发完后继续发送下一段
00757A05MOVR2,#5;重赋发送数据的个数
00770530INCFINISH_ID;递增学号显示标志,判断是否发送完成
0079E530MOVA,FINISH_ID
007BB40306CJNEA,#3,NEXT1;没有完成则先延时后继续发送
007E753000MOVFINISH_ID,#0
008102009FLJMPOTHER;发送完成后执行其他程序
0084758C3CNEXT1:
MOVTH0,#3CH;定时器0定时初值,延时50ms,计算方法:
0087758AB0MOVTL0,#0B0H;TH0=(65536-50000)/256,TL0=(65536-50000)%256
008A7B1EMOVR3,#30;设置软件计数器,计30次,即1.5s
008CD28CSETBTR0;启动定时器0
008EE582MOVA,DPL;发完一次后DPTR加5,指向下一页数据
00902405ADDA,#5
0092F582MOVDPL,A
0094E583MOVA,DPH
00963400ADDCA,#0
0098F583MOVDPH,A
009A10D5C7L1:
JBCTIME0_DOWN,DIS_ID;等待计时时间到,时间到继续下步显示
009D80FBSJMPL1
;************判断按键执行其他功能**************
009F3000C2OTHER:
JNBKEY_FLAG,DIS_ID;判断是否有键按下,没有则继续显示学号
00A2C2A8CLREX0;如果有键按下,则关闭键盘中断,以免再次中断导致键值读错
00A4758C3CMOVTH0,#3CH;开启定时器0,计算是否为长按键
00A7758AB0MOVTL0,#0B0H
00AA7B1EMOVR3,#30
00ACD28CSETBTR0
00AE1200D0LCALLKEYSCAN;键盘扫描,以确定按键值和长按键
00B1200103JBKEY_LONG,SEC_FUN;判断是否为长按键,若是,则调用第二功能
00B4020064LJMPDIS_ID;否则继续显示学号
00B7C201SEC_FUN:
CLRKEY_LONG;清楚长按键标志
00B9900252MOVDPTR,#TAB_FUN;利用查转向地址表法执行对应第二功能程序
00BCE531MOVA,KEY_D
00BE2531ADDA,KEY_D
00C073JMP@A+DPTR
;*********delay10ms子程序**************
00C1D2D3DELAY_10MS:
SETBPSW.3;10MS延时子程序
00C3780ADL0:
MOVR0,#10
00C5797DDL1:
MOVR1,#7DH
00C700NOP
00C800NOP
00C9D9FADJNZR1,DL1
00CBD8F6DJNZR0,DL0
00CDC2D3CLRPSW.3
00CF22RET
;**********键盘扫描子程序**************
00D05390FDKEYSCAN:
ANLP1,#11111101B;键盘扫描子程序,先将P1.1赋0,P1.3赋1
00D3439008ORLP1,#00001000B
00D6E590MOVA,P1;读回P1.5,P1.7的值,若P1.5为0,则键值为0
00D820E506JBACC.5,K1
00DB753100MOVKEY_D,#0
00DE020104LJMPOUT_KS1;若P1.7为1,则键值为1
00E120E706K1:
JBACC.7,KS
00E4753101MOVKEY_D,#1
00E7020104LJMPOUT_KS1
00EA5390F7KS:
ANLP1,#11110111B;再将P1.3赋0,P1.1赋1
00ED439042ORLP1,#01000010B
00F0E590MOVA,P1;读回P1.5,P1.7的值,若P1.5为0,则键值为2
00F220E506JBACC.5,K2
00F5753102MOVKEY_D,#2
00F8020104LJMPOUT_KS1
00FB20E706K2:
JBACC.7,OUT_KS1;若P1.7为0,则键值为3
00FE753103MOVKEY_D,#3
0101020104LJMPOUT_KS1;读出键值后判断松手
0104E590OUT_KS1:
MOVA,P1;读回P1值
0106445FORLA,#5FH;屏蔽不相干位
0108F4CPLA;变0有效为1有效
0109600BJZOUT_KS2;判断是否继续为0,若为0,则说明松手了,继续判断是否为长按键
010BE531MOVA,KEY_D;若不为0,则显示键值
010D900241MOVDPTR,#TAB_NUM;查表法显示键值
011093MOVCA,@A+DPTR
0111120126LCALLDIS_NUM;调用显示键值程序
011480EESJMPOUT_KS1;循环判断是否松手
011630D504OUT_KS2:
JNBTIME0_DOWN,OUT_KS3;判断定时器0是否定时完,若完,则置长按键标志
0119C2D5CLRTIME0_DOWN;否则,直接返回
011BD201SETBKEY_LONG
011DC200OUT_KS3:
CLRKEY_FLAG;先清除按键标志,关闭蜂鸣器,关闭定时器0,再返回
011FC28CCLRTR0
0121D2A8SETBEX0
0123D290SETBP1.0
012522RET
;************显示键值子程序***************
01267C05DIS_NUM:
MOVR4,#5
0128F599DIS_NUM1:
MOVSBUF,A
012A109902LP:
JBCTI,DIS_NUM2
012D80FBSJMPLP
012FDCF7DIS_NUM2:
DJNZR4,DIS_NUM1
013122RET
;*********定时器0中断服务程序*************
0132758C3CTIME0:
MOVTH0,#3CH;重复初值
0135758AB0MOVTL0,#0B0H
0138DB06DJNZR3,OUT_TIME0;递减软件计数器,若减为0,说明计数时间到
013A7B1EMOVR3,#30;否则,直接返回
013CC28CCLRTR0;计数时间到后,重赋软件计数器初值,关闭计数器
013ED2D5SETBTIME0_DOWN;设定计数时间到标志
014032OUT_TIME0:
RETI
;*********外部中断0中断服务程序**********
0141C0D0INT0_IN:
PUSHPSW;保护现场
01431200C1LCALLDELAY_10MS;出现中断信号后,先延时10ms
0146A2B2MOVC,P3.2;读回P3.2引脚状态
01484006JCOUT_INT0;若继续为低电平,则确定有键按下,置按键标志,开启蜂鸣器后返回
014AD200SETBKEY_FLAG;若为高电平,说明为干扰信号,标志位不置位直接返回
014CC290CLRP1.0
014ED0D0POPPSW;恢复现场
015032OUT_INT0:
RETI
;*********外部中断1中断服务程序**********
0151C0E0INT1_IN:
PUSHACC;保护现场
0153908000MOVDPTR,#ADC0809_AD;给ADC0809地址,读回AD转换值
0156E0MOVXA,@DPTR
0157F532MOVADC_DATE,A
0159D202SETBADC_FLAG;AD读完数据标志置位
015BD0E0POPACC;恢复现场
015D32RETI
;*********AD功能程序*********************
015E908000FUN_AD:
MOVDPTR,#ADC0809_AD;DPTR赋值为ADC0809地址
0161F0MOVX@DPTR,A;打开AD
0162100202L3:
JBCADC_FLAG,NEXT2;等待AD是读数完成
016580FBSJMPL3
0167E532NEXT2:
MOVA,ADC_DATE;将AD读数送A
016975F013MOVB,#19;将读到的值乘以19得到应该显示的读数值
016CA4MULAB
016DD2D4SETBPSW.4;保护第0组工作寄存器
016FFAMOVR2,A;先把该显示的值暂存
0170ABF0MOVR3,B
0172C3AD0:
CLRC;把暂存的值转化为4位BCD码
0173EAMOVA,R2;利用减法,先减1000,够减则相应位加1,否则,恢复原值
017494E8SUBBA,#0E8H;继续减100,得到百位值,同上的方法
0176FAMOVR2,A;十位和个位利用除法得到
0177EBMOVA,R3
01789403SUBBA,#03H
017AFBMOVR3,A
017B4004JCAD01
017D0533INCADC_0
017F80F1SJMPAD0
0181EAAD01:
MOVA,R2
018224E8ADDA,#0E8H
0184FAMOVR2,A
0185EBMOVA,R3
01863403ADDCA,#03H
0188FBMOVR3,A
0189EAAD1:
MOVA,R2
018AC3CLRC
018B9464SUBBA,#64H
018DFAMOVR2,A
018EEBMOVA,R3
018F9400SUBBA,#0
0191FBMOVR3,A
01924004JCAD11
01940534INCADC_1
019680F1SJMPAD1
0198EAAD11:
MOVA,R2
01992464ADDA,#64H
019B75F00AMOVB,#10
019E84DIVAB
019FF535MOVADC_2,A
01A185F036MOVADC_3,B
01A4E536MOVA,ADC_3;判断最后一位的值大小,若小于5,舍掉
01A6B40500CJNEA,#5,AD2;否则,向高位进1
01A9401CAD2:
JCSHE
01ABE535MOVA,ADC_2
01AD2401ADDA,#1
01AFD4DAA
01B0FCMOVR4,A
01B1540FANLA,#0FH
01B3F535MOVADC_2,A
01B5ECMOVA,R4
01B6C4SWAPA
01B7540FANLA,#0FH
01B92534ADDA,ADC_1
01BBD4DAA
01BCFCMOVR4,A
01BD540FANLA,#0FH
01BFF534MOVADC_1,A
01C1ECMOVA,R4
01C2C4SWAPA
01C3540FANLA,#0FH
01C52433ADDA,#ADC_0
01C7753600SHE:
MOVADC_3,#0
01CA1201D8LCALLDIS_AD;转换后显示转换值
01CDC2D4CLRPSW.4;恢复第0组工作寄存器
01CF200003JBKEY_FLAG,AD_OUT;等待其他键按下
01D202015ELJMPFUN_AD
01D502009FAD_OUT:
LJMPOTHER
;***********AD显示功能********************
01D8E535DIS_AD:
MOVA,ADC_2;先发送最后一位
01DA900241MOVDPTR,#TAB_NUM;查表得到段码
01DD93MOVCA,@A+DPTR
01DEF599MOVSBUF,A;发送段码
01E0109902A_0:
JBCTI,DIS_AD0;等待发完,未完继续等待,完成后发送下一个
01E380FBSJMPA_0
01E5E534DIS_AD0:
MOVA,ADC_1
01E7900241MOVDPTR,#TAB_NUM
01EA93MOVCA,@A+DPTR
01EBF599MOVSBUF,A
01ED109902A_1:
JBCTI,DIS_AD1
01F080FBSJMPA_1
01F2E533DIS_AD1:
MOVA,ADC_0
01F490024CMOVDPTR,#TAB_DOT
01F793MOVCA,@A+DPTR
01F8F599MOVSBUF,A
01FA109902A_2:
JBCTI,DIS_AD2
01FD80FBSJMPA_2
01FF7400DIS_AD2:
MOVA,#00H
0201F599MOVSBUF,A
0203109902A_3:
JBCTI,DIS_AD3
020680FBSJMPA_3
02087400DIS_AD3:
MOVA,#00H
020AF599MOVSBUF,A
020C109902A_4:
JBCTI,OUT_DIS_AD
020F80FBSJMPA_4
021122OUT_DIS_AD:
RET
;************DA功能************************
0212900000FUN_DA:
MOVDPTR,#DAC0832_AD;赋DA地址
02157400MOVA,#00H;发送数据给DAC0832
0217F0UP:
MOVX@DPTR,A
021804INCA;A加1后继续传
021900NOP;等待时间到
021A00NOP
021B00NOP
021C00NOP
021D00NOP
021E70F7JNZUP
022014DOWN:
DECA;A加完后开始减1
0221F0MOVX@DPTR,A;传送数据给DAC0832
022200NOP
022300NOP
022400NOP
022500NOP
022600NOP
022770F7JNZDOWN
0229200003JBKEY_FLAG,DA_OUT;判断是否有其他键按下,有即跳出DA功能,无则继续跳回DA功能
022C04INCA
022D80E8SJMPUP
022F02009FDA_OUT:
LJMPOTHER
0232000080
02358080TAB_ID:
DB00H,00H,80H,80H,80H;学号显示断码表
0237404046
023AC686DB40H,40H,46H,0C6H,86H
023C6060FC
023FFEDADB60H,60H,0FCH,0FEH,0DAH
0241FC60DA
0244F266B6
0247BEE0FE
024AF600TAB_NUM:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,00H;数字断码表
024CFD61DB
024FF367B7TAB_DOT:
DB0FDH,61H,0DBH,0F3H,67H,0B7H;带小数点数字断码表
02520164TAB_FUN:
AJMPDIS_ID;第二功能转向地址表
02540164AJMPDIS_ID
0256215EAJMPFUN_AD
02584112AJMPFUN_DA
END
符号值类型
AC=00D6HCONST常量
ACC=00E0HCONST常量
AD0=0172HCODE标号
AD01=0181HCODE标号
AD1=0189HCODE标号
AD11=0198HCODE标号
AD2=01A9HCODE标号
ADC0809_AD=8000HCONST常量
ADC_0=0033HCONST常量
ADC_1=0034HCONST常量
ADC_2=0035HCONST常量
ADC_3=0036HCONST常量
ADC_DATE=0032HCONST常量
ADC_FLAG=0002HCONST常量
AD_OUT=01D5HCODE标号
A_0=01E0HCODE标号
A_1=01EDHCODE标号
A_2=01FAHCODE标号
A_3=0203HCODE标号
A_4=020CHCODE标号
B=00F0HCONST常量
CONT=006EHCODE标号
CY=00D7HCONST常量
DAC0832_AD=0000HCONST常量
DA_OUT=022FHCODE标号
DELAY_10MS=00C1HCODE标号
DIS_AD=01D8H
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 课程设计 源程序