西南科技大学 单片机实验 程序代码Word格式文档下载.docx
- 文档编号:20321246
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:17
- 大小:44.18KB
西南科技大学 单片机实验 程序代码Word格式文档下载.docx
《西南科技大学 单片机实验 程序代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《西南科技大学 单片机实验 程序代码Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
MOVR5,#05H
MOVR6,#35H
MOVR7,#21H
ACALLDW_MUL
AJMP$
DW_MUL:
MOVR1,#04H
CLE:
MOV@R0,#00H
INCR0
DJNZR1,CLE
MU:
MOVA,R4
MOVB,R6
MULAB
MOV@R0,A
MOVA,B
ADDCA,@R0
MOVB,R7
MOVA,R5
DECR0
END
实验三:
设计并调试一个将双字节无符号二进制数转换为压缩BCD数的子程序。
双字节无符号二进制数转换为压缩BCD数子程序
双字节无符号二进制数的地址放在R0中;
存放转换结果(BCD数)的地址放在R1中。
双字节无符号二进制数最大值为0FFFFH,对应的十进制数为65535,其压缩BCD编码表示为06H,55H,35H,所以转换结果应用3个字节存放。
Y=(D15D14…D1D0)2=(((…(((02)+D15)2+D14)2+…)2+D1)2+D0)2。
Y0=(02)+D15,Y1=Y0+D14,Y2=Y1+D13,…,Y15=Y14+D0,Y=Y15。
Y0|BCD=((02)+D15)|BCD,Y1|BCD=(Y0+D14)|BCD,…,Y15|BCD=(Y14+D0)|BCD
Y|BCD=Y15|BCD
算法:
1、Y=0
2、Y=Y2+Di(i=15,14,…,2,1,0)
3、对Y进行十进制调整
4、重复2、3步16次
Y=Y2+Di可用Y=Y+Y+C实现(Di首先放在C中),考虑到Y存放在3个字节,应分别加3次,且要考虑每次加法产生的C。
MOVSP,#60H
MOVR1,#25H
MOVR0,#20H
MOV@R0,#43H
MOV@R0,#4AH
ACALLDW_BCD
DW_BCD:
DECR0
MOVA,R0
MOVR6,A
MOVA,R1
MOVR7,A
MOVR2,#3
CLEAR:
CLRA
MOV@R1,A
INCR1
DJNZR2,CLEAR
MOVR3,#16
CLRC
YIWEI:
MOVA,R6
MOVR0,A
MOVA,@R0
RLCA
MOVA,R7
MOVR1,A
FANG:
MOVA,@R1
ADDCA,@R1
DAA
DJNZR2,FANG
DJNZR3,YIWEI
MOVR1,#25H
MOVR0,#20H
MOV@R0,#0FFH
INCR0
MOV@R0,#0FFH;
20H21H=FFH
mov@r1,#0efh
ACALLDW_BCD
AJMP$
DECR0
MOVA,R0
MOVR6,A
MOVA,R1
MOVR7,A;
R7=25hR6=20H
MOVR2,#3
CLRA
MOV@R1,A
INCR1
DJNZR2,CLEAR;
25H26H27H==00
MOVR3,#16
CLRC
MOVA,R6
MOVR0,A
MOVA,@R0
RLCA
MOV@R0,A
MOVA,R7
MOVR1,A
ADDCA,@R1
DAA;
16进制到10进制的转化
DJNZR2,FANG
DJNZR3,YIWEI
RET
END
实验四:
利用外部中断输入引脚(中断方式)控制步进电机的转动。
要求:
每产生1次中断,步进电机只能步进1步。
使用INT0的中断服务程序控制步进电机正向步进;
使用INT1中断服务程序控制步进电机反向步进。
主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。
为便于实验观察和操作,设INT0和INT1中断触发方式为边沿。
步进电机的转动控制由外部中断的服务程序来实现。
当前步进电机的相位通电状态信息可以使用片内RAM中的一个字节单元来存储。
ORG0000H
LJMPRESET
ORG0003H;
外部中断0服务程序入口
LJMPINT_EX0
ORG000BH;
定时器/计数器0溢出中断服务程序入口
RETI
ORG0013H;
外部中断1服务程序入口
LJMPINT_EX1
ORG001BH;
定时器/计数器1溢出中断服务程序入口
ORG0023H;
串行口中断服务程序入口
ORG0040H;
复位处理程序
RESET:
MOVSP,#67H
SETBIT0
SETBIT1
SETBEX0
SETBEX1
MOV30H,#11110111B
CLRA;
累加器A清零
SETBEA
MAIN:
SJMPMAIN
INT_EX0:
;
使用INT0的中断服务程序控制步进电机正向步进
PUSHACC
MOVA,30H
RRA;
累加器A的内容向右循环移位一位
MOV30H,A
MOVP1,A
POPACC
RETI
INT_EX1:
使用INT1中断服务程序控制步进电机反向步进
RLA;
累加器A的内容向左循环移位一位
另一种实验方法:
ORG0000H;
复位入口
ORG0003H;
外部中断0服务程序入口
ORG000BH;
ORG0013H;
外部中断1服务程序入口
ORG001BH;
ORG0023H;
串行口中断服务程序入口
ORG040H;
复位处理程序
MOVSP,#67H
CLRA
;
----------------------------------------使用INT0的中断服务程序控制步进电机正向步进
MOVR0,#00H;
正转至TABLE取码指针初值
ABC:
MOVA,R0;
至TABLE取码
MOVDPTR,#TABLE;
存表
MOVCA,@A+DPTR;
取表代码
JZINT_EX0;
是否取到结束码(00H)?
MOVP0,A;
输出至P0,正转
INCR0;
取下一个码
JMPABC;
转至Z_M处,循环
----------------------------------------使用INT1中断服务程序控制步进电机反向步进
MOVR0,#05;
反转至TABLE取码指针初值
ABC1:
MOVCA,@A+DPTR;
JZINT_EX1;
MOVP0,A;
输出至P0,反转
INCR0;
JMPABC1;
转至F_M1处,循环
RETI;
反转子程序
TABLE:
DB0FCH,0F9H,0F3H,0F6H;
正转
DB00H;
正转结束码
DB0F7H,0F3H,0FBH,0F9H;
反转
DB0FDH,0FCH,0FEH,0F6H
反转结束码
END;
程序结束
实验五:
利用定时/计数器测量电动机的转速。
使用T1作为定时器(定时时间为50毫秒),T0作为计数器(计数由电机测速电路产生的脉冲个数,每转4个脉冲),每1秒时间后,读出T0的值(读出后须将T0清0),将该值(速度值*4)显示到LCM显示器上(显示子程序/函数由实验库文件提供)。
本次实验程序需要使用实验库文件(LCMDRV_12864.LIB)。
该库中的子程序/函数占用单片机片内RAM中地址为18H~20H的单元,因此实验程序不能使用这些单元。
如果用汇编编写实验程序,必须先用$INCLUDE(LCMDRV_12864.INC)指令加载实验库头文件
REFRESHDISPEQU08H;
刷新显示标志
SPEED_CNTHEQU30H;
速度脉冲计数高8位
SPEED_CNTLEQU31H;
速度脉冲计数低8位
SECOND_CNTEQU32H;
秒计数
VAR_ENDEQU32H;
最后一个字节变量的位置,
STACK_INIEQUVAR_END+1;
须保证足够的空间实验程序架构(汇编):
$INCLUDE(LCMDRV_12864.INC);
包含库程序定义
ORG0000H;
LJMPRESET
ORG0003H;
RETI
ORG000BH;
ORG0013H;
ORG001BH;
LJMPINT_T1
ORG0023H;
ORG040H;
MOVSP,#60H;
设置栈底指针
MOVR7,#00H;
初始化显示器(不显示光标)
LCALL_LCM_Init
SETBET1;
此处添加设置中断许可和优先的指令(ET1,PT1)
SETBPT1
MOVTMOD,#00010110B;
定时/计数设置
MOVTH1,#3CH;
此处添加设置定时/计数器的指令(TMOD,THx,TLx)
MOVTL1,#0B0H
MOVTH0,#0
MOVTL0,#0
CLRREFRESHDISP;
清刷新显示标志
MOVSECOND_CNT,#20;
启动内部定时
SETBTR1
SETBTR0;
此处添加启动定时/计数的指令(TRx)
SETBEA;
开中断
JNBREFRESHDISP,$;
判断是否需要刷新显示
MOVR7,#01H;
从第2行第8列开始显示速度值(5位数值)
MOVR5,#07H
MOVR2,SPEED_CNTH
MOVR3,SPEED_CNTL
CALL_LCM_DispUIntXY
内部定时中断服务程序**************************
INT_T1:
MOVTH1,#3CH;
此处添加重置定时常数的指令
MOVA,R7;
此处添加保护现场内容的指令(如果有的话)
PUSHACC
INCR7
CJNER7,#20,LLEND;
判断一秒钟时间到的指令,没到时间则跳转恢复现场,
MOVSPEED_CNTL,TL0;
记录速度检测计数(供主程序显示用)
MOVSPEED_CNTH,TH0
MOVTL0,#00;
速度检测计数归零
MOVTH0,#00
SETBREFRESHDISP;
设置刷新显示标志(控制主程序刷新显示)
LLEND:
POPACC;
此处添加恢复现场内容的指令(如果有的话)
MOVR7,A
RETI
END
实验六:
利用8155实现并行I/O扩展。
利用P1端口访问CAT24WC02(兼容AT24C02)。
程序一:
使用8155实现对并行接口的扩展。
利用8155的PA口输入D1区KEY组各按键的状态信息,然后将该状态信息通过单片机的P1口输出到D1区LED组显示。
主程序在完成各项初始化设置后,可进入一死循环,在该循环里面不断的读取8155PA口的信息并将其输出到单片机的P1口。
AJMPMAIN
MOVDPTR,#7F00H
MOVA,#11110000B
MOVX@DPTR,A
MOVDPTR,#07F01H
MOVXA,@DPTR
MOVP1,A
SJMPLOOP
程序二:
先将单片机内部RAM中30H~37H单元的值复制到CAT24WC02中的00H~07H单元。
然后又将这8个数从CAT24WC02中复制到单片机内部RAM的40H~47H单元中
CAT24WC02的器件地址:
0A0H
CAT24WC02芯片手册CAT24WCxxx.pdf
实验七:
利用ADC0809/DAC0832实现模拟电压信号的采集与输出。
使用T1作为定时器(定时时间为50毫秒),每1秒时间后,启动ADC0809转换,在转换结束后(触发外部中断)读出A/D转换值,将该值输出到DAC0832,并同时显示到LCM显示器上(显示子程序/函数由实验库文件提供)。
主程序在完成对INT1和T1的设置后,可进入死循环(等待中断请求)。
在T1的中断服务程序中需要使用一存储单元对T1的中断次数进行计数,当计数次数达20次时,意味着定时1秒时间到(参见实验五),此时才启动一次AD转换(通过向ADC0809的一次写操作实现)。
AD转换的结束信号作为中断请求(INT1)。
在对该中断的响应和服务时,才读出本次AD转换的结果值,该值又作为DA转换的值(向DAC0832写)。
为便于理解,数值在显示前应进行BCD转换(库文件自动完成转换)。
$INCLUDE(LCMDRV_12864.INC);
AD_VALEQU30H;
AD转换结果值
SECOND_CNTEQU31H;
VAR_ENDEQU31H;
STACK_INIEQUVAR_END+1;
须保证足够的空间
ORG0000H;
ORG0003H;
ORG000BH;
ORG0013H;
LJMPINT_INT1
ORG001BH;
LJMPINT_T1
ORG0023H;
ORG0040H;
MOVSP,#STACK_INI;
设置栈底指针
LCALL_LCM_Init
SETBIT1;
脉冲触发方式
SETBET1
SETBEX1
SETBPT1;
定时/计数器高级中断
CLRPX1
MOVTMOD,#00010000B
MOVTH1,#3CH
MOVTL1,#0B0H;
设置定时/计数器的指令(TMOD,TH1,TL1)
MOVR6,#0
CLRREFRESHDISP;
MOVSECOND_CNT,#20
SETBTR1
JNBREFRESHDISP,$;
MOVR7,#01H;
从第2行第8列开始显示转换值(5位数值)
MOVR2,#00H;
转换值扩展成16位
MOVR3,AD_VAL
INT_INT1:
PUSHACC
MOVDPTR,#3C00H;
此处添加读A/D转换结果的指令
MOVAD_VAL,A;
保存转换结果(供主程序显示用)
MOVDPTR,#3800H
MOVX@DPTR,A;
此处添加启动D/A转换的指令
设置刷新显示标志(刷新显示由主程序完成)
POPACC
此处添加重置定时常数的指令
INCR6
CJNER6,#20,LL1;
判断一秒钟时间到的指令,没到恢复现场,
MOVDPTR,#3C00H
此处添加启动A/D转换的指令
LL1:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西南科技大学 单片机实验 程序代码 西南 科技大学 单片机 实验