西南科技大学 单片机实验 程序代码.docx

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

西南科技大学 单片机实验 程序代码.docx

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

西南科技大学 单片机实验 程序代码.docx

西南科技大学单片机实验程序代码

实验一功能:

使连接在MCS-51单片机P1.0引脚的LED闪烁。

设计思路:

点亮LED需要约10mA电流,此时LED两端电压差约2V。

因此,将LED的阴极通过一个电阻连接到P1.0引脚(电阻阻值约为200),阳极连接到电源VCC(5V)。

为便于观察,交替的时间间隔不应太小(建议选择在0.5s左右),由于该时间不要求严格精确,所以,可采用软件延时的方法实现。

程序可采用图2.1中的流程结构。

ORG0000H

AJMPSTART

ORG0030H

START:

MOVP1,#0FFH

LOOP:

CPLP1.0

ACALLDELAY

AJMPLOOP

DELAY:

MOVR0,#99

DL2:

MOVR1,#99

DL1:

NOP

NOP

DJNZR1,DL1

DJNZR0,DL2

RET

END

实验二设计并调试一个双字节无符号数乘法子程序。

功能:

双字节无符号数乘法子程序。

入口参数:

被乘数放在R7(高)和R6(低);

乘数放在R5(高)和R4(低);

积(片内RAM中的连续4字节)的首地址放在R0中。

设计思路:

由于MCS-51指令集中只有单字节无符号数乘法指令,因此需要将双字节无符号数相乘变换成4次单字节无符号数相乘,才能利用乘法指令实现双字节无符号数乘法计算。

变换方法如图2.1所示。

MCS-51指令集中乘法指令的结果是固定存放在A和B中的,因此每次乘法操作后都须将结果保存在积中。

所以应首先将积的初值置0且在每次乘法指令结束后需要进行2次加操作,分别将A和B加到积的对应位置(注意:

在两次加法之间要考虑进位)。

ORG0000H

AJMPSTART

ADREQU20H

ORG0030H

START:

MOVR0,#ADR

MOVR4,#14H

MOVR5,#05H

MOVR6,#35H

MOVR7,#21H

ACALLDW_MUL

AJMP$

DW_MUL:

MOVR1,#04H

CLE:

MOV@R0,#00H

INCR0

DJNZR1,CLE

MOVR0,#ADR

MU:

MOVA,R4

MOVB,R6

MULAB

MOV@R0,A

MOVA,B

INCR0

ADDCA,@R0

MOV@R0,A

MOVA,R4

MOVB,R7

MULAB

ADDCA,@R0

MOV@R0,A

MOVA,B

INCR0

ADDCA,@R0

MOV@R0,A

MOVA,R5

MOVB,R6

MULAB

DECR0

ADDCA,@R0

MOV@R0,A

MOVA,B

INCR0

ADDCA,@R0

MOV@R0,A

MOVA,R5

MOVB,R7

MULAB

ADDCA,@R0

MOV@R0,A

MOVA,B

INCR0

ADDCA,@R0

MOV@R0,A

RET

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。

ORG0000H

AJMPSTART

ORG0030H

START:

MOVSP,#60H

MOVR1,#25H

MOVR0,#20H

MOV@R0,#43H

INCR0

MOV@R0,#4AH

ACALLDW_BCD

AJMP$

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

MOV@R0,A

INCR0

MOVA,@R0

RLCA

MOV@R0,A

MOVR2,#3

MOVA,R7

MOVR1,A

FANG:

MOVA,@R1

ADDCA,@R1

DAA

MOV@R1,A

INCR1

DJNZR2,FANG

DJNZR3,YIWEI

RET

END

 

MOVR1,#25H

MOVR0,#20H

MOV@R0,#0FFH

INCR0

MOV@R0,#0FFH;20H21H=FFH

 

mov@r1,#0efh

ACALLDW_BCD

AJMP$

 

DW_BCD:

DECR0

MOVA,R0

MOVR6,A

MOVA,R1

MOVR7,A;R7=25hR6=20H

MOVR2,#3

CLEAR:

CLRA

MOV@R1,A

INCR1

DJNZR2,CLEAR;25H26H27H==00

MOVR3,#16

CLRC

YIWEI:

MOVA,R6

MOVR0,A

MOVA,@R0

RLCA

MOV@R0,A

INCR0

MOVA,@R0

RLCA

MOV@R0,A

MOVA,R7

MOVR1,A

MOVR2,#3

FANG:

MOVA,@R1

ADDCA,@R1

DAA;16进制到10进制的转化

MOV@R1,A

INCR1

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溢出中断服务程序入口

RETI

ORG0023H;串行口中断服务程序入口

RETI

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中断服务程序控制步进电机反向步进

PUSHACC

MOVA,30H

RLA;累加器A的内容向左循环移位一位

MOV30H,A

MOVP1,A

POPACC

RETI

END

另一种实验方法:

ORG0000H;复位入口

LJMPRESET

ORG0003H;外部中断0服务程序入口

LJMPINT_EX0

ORG000BH;定时器/计数器0溢出中断服务程序入口

RETI

ORG0013H;外部中断1服务程序入口

LJMPINT_EX1

ORG001BH;定时器/计数器1溢出中断服务程序入口

RETI

ORG0023H;串行口中断服务程序入口

RETI

ORG040H;复位处理程序

RESET:

MOVSP,#67H

SETBIT0

SETBIT1

SETBEX0

SETBEX1

MOV30H,#11110111B

CLRA

SETBEA

MAIN:

SJMPMAIN

;----------------------------------------使用INT0的中断服务程序控制步进电机正向步进

INT_EX0:

MOVR0,#00H;正转至TABLE取码指针初值

ABC:

MOVA,R0;至TABLE取码

MOVDPTR,#TABLE;存表

MOVCA,@A+DPTR;取表代码

JZINT_EX0;是否取到结束码(00H)?

MOVP0,A;输出至P0,正转

INCR0;取下一个码

JMPABC;转至Z_M处,循环

RETI

;----------------------------------------使用INT1中断服务程序控制步进电机反向步进

INT_EX1:

MOVR0,#05;反转至TABLE取码指针初值

ABC1:

MOVA,R0;至TABLE取码

MOVDPTR,#TABLE;存表

MOVCA,@A+DPTR;取表代码

JZINT_EX1;是否取到结束码(00H)?

MOVP0,A;输出至P0,反转

INCR0;取下一个码

JMPABC1;转至F_M1处,循环

RETI;反转子程序

TABLE:

DB0FCH,0F9H,0F3H,0F6H;正转

DB00H;正转结束码

DB0F7H,0F3H,0FBH,0F9H;反转

DB0FDH,0FCH,0FEH,0F6H

DB00H;反转结束码

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;外部中断0服务程序入口

RETI

ORG000BH;定时器/计数器0溢出中断服务程序入口

RETI

ORG0013H;外部中断1服务程序入口

RETI

ORG001BH;定时器/计数器1溢出中断服务程序入口

LJMPINT_T1

ORG0023H;串行口中断服务程序入口

RETI

ORG040H;复位处理程序

RESET:

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;开中断

MAIN:

JNBREFRESHDISP,$;判断是否需要刷新显示

CLRREFRESHDISP;清刷新显示标志

MOVR7,#01H;从第2行第8列开始显示速度值(5位数值)

MOVR5,#07H

MOVR2,SPEED_CNTH

MOVR3,SPEED_CNTL

CALL_LCM_DispUIntXY

SJMPMAIN

;内部定时中断服务程序**************************

INT_T1:

MOVTH1,#3CH;此处添加重置定时常数的指令

MOVTL1,#0B0H

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口。

ORG0000H

AJMPMAIN

ORG0030H

MAIN:

MOVDPTR,#7F00H

MOVA,#11110000B

MOVX@DPTR,A

LOOP:

MOVDPTR,#07F01H

MOVXA,@DPTR

MOVP1,A

SJMPLOOP

END

程序二:

先将单片机内部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显示器上(显示子程序/函数由实验库文件提供)。

本次实验程序需要使用实验库文件(LCMDRV_12864.LIB)。

该库中的子程序/函数占用单片机片内RAM中地址为18H~20H的单元,因此实验程序不能使用这些单元。

如果用汇编编写实验程序,必须先用$INCLUDE(LCMDRV_12864.INC)指令加载实验库头文件

设计思路:

主程序在完成对INT1和T1的设置后,可进入死循环(等待中断请求)。

在T1的中断服务程序中需要使用一存储单元对T1的中断次数进行计数,当计数次数达20次时,意味着定时1秒时间到(参见实验五),此时才启动一次AD转换(通过向ADC0809的一次写操作实现)。

AD转换的结束信号作为中断请求(INT1)。

在对该中断的响应和服务时,才读出本次AD转换的结果值,该值又作为DA转换的值(向DAC0832写)。

为便于理解,数值在显示前应进行BCD转换(库文件自动完成转换)。

$INCLUDE(LCMDRV_12864.INC);包含库程序定义

REFRESHDISPEQU08H;刷新显示标志

AD_VALEQU30H;AD转换结果值

SECOND_CNTEQU31H;秒计数

VAR_ENDEQU31H;最后一个字节变量的位置,

STACK_INIEQUVAR_END+1;须保证足够的空间

ORG0000H;复位入口

LJMPRESET

ORG0003H;外部中断0服务程序入口

RETI

ORG000BH;定时器/计数器0溢出中断服务程序入口

RETI

ORG0013H;外部中断1服务程序入口

LJMPINT_INT1

ORG001BH;定时器/计数器1溢出中断服务程序入口

LJMPINT_T1

ORG0023H;串行口中断服务程序入口

RETI

ORG0040H;复位处理程序

RESET:

MOVSP,#STACK_INI;设置栈底指针

MOVR7,#00H;初始化显示器(不显示光标)

LCALL_LCM_Init

SETBIT1;脉冲触发方式

SETBET1

SETBEX1

SETBPT1;定时/计数器高级中断

CLRPX1

MOVTMOD,#00010000B

MOVTH1,#3CH

MOVTL1,#0B0H;设置定时/计数器的指令(TMOD,TH1,TL1)

MOVR6,#0

CLRREFRESHDISP;清刷新显示标志

MOVSECOND_CNT,#20

SETBTR1

SETBEA

MAIN:

JNBREFRESHDISP,$;判断是否需要刷新显示

CLRREFRESHDISP;清刷新显示标志

MOVR7,#01H;从第2行第8列开始显示转换值(5位数值)

MOVR5,#07H

MOVR2,#00H;转换值扩展成16位

MOVR3,AD_VAL

CALL_LCM_DispUIntXY

SJMPMAIN

INT_INT1:

PUSHACC

MOVDPTR,#3C00H;此处添加读A/D转换结果的指令

MOVXA,@DPTR

MOVAD_VAL,A;保存转换结果(供主程序显示用)

MOVDPTR,#3800H

MOVX@DPTR,A;此处添加启动D/A转换的指令

SETBREFRESHDISP;设置刷新显示标志(刷新显示由主程序完成)

POPACC

RETI

INT_T1:

MOVTH1,#3CH

MOVTL1,#0B0H;此处添加重置定时常数的指令

INCR6

CJNER6,#20,LL1;判断一秒钟时间到的指令,没到恢复现场,

MOVR6,#0

MOVDPTR,#3C00H

MOVX@DPTR,A;此处添加启动A/D转换的指令

LL1:

RETI

END

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

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

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

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