西南科技大学 单片机实验 程序代码Word格式文档下载.docx

上传人:b****6 文档编号:20321246 上传时间:2023-01-22 格式:DOCX 页数:17 大小:44.18KB
下载 相关 举报
西南科技大学 单片机实验 程序代码Word格式文档下载.docx_第1页
第1页 / 共17页
西南科技大学 单片机实验 程序代码Word格式文档下载.docx_第2页
第2页 / 共17页
西南科技大学 单片机实验 程序代码Word格式文档下载.docx_第3页
第3页 / 共17页
西南科技大学 单片机实验 程序代码Word格式文档下载.docx_第4页
第4页 / 共17页
西南科技大学 单片机实验 程序代码Word格式文档下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

西南科技大学 单片机实验 程序代码Word格式文档下载.docx

《西南科技大学 单片机实验 程序代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《西南科技大学 单片机实验 程序代码Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。

西南科技大学 单片机实验 程序代码Word格式文档下载.docx

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:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1