单片机实验指导.docx
《单片机实验指导.docx》由会员分享,可在线阅读,更多相关《单片机实验指导.docx(30页珍藏版)》请在冰豆网上搜索。
![单片机实验指导.docx](https://file1.bdocx.com/fileroot1/2023-2/7/3cf6ffdc-45ae-4bc8-b4bf-aef36ad427b6/3cf6ffdc-45ae-4bc8-b4bf-aef36ad427b61.gif)
单片机实验指导
实验一定时器实验
一、实验目的
1.掌握定时器使用方法
2.了解定时器控制字的含义
二、实验内容
本实验使用定时器,定时为一秒钟。
CPU运用定时中断方式,实现每一秒钟输出状态发生一次反转,即发光管每隔一秒钟亮一次。
三、实验原理
内部计数器用作定时器时,是对机器周期计数。
每个机器周期的长度是12个振荡器周期。
因为实验系统的晶振是12MHZ,本程序工作于方式2,即8位自动重装方式定时器,定时器100uS中断一次,所以定时常数的设置可按以下方法计算:
机器周期=12÷12MHz=1uS
(256-定时常数)×1uS=100uS
定时常数=156。
TH1←156,TL1←156
求T0的方式控制字TMOD:
#20h
然后对100uS中断次数计数10000次(十六进制为3E8h),就是1秒钟。
四、单片机编程代码
ORG0000H
AJMPSTART
START:
MOVTMOD,#20H
SETBEA
SETBET1
MOVTH1,#9CH
MOVTL1,#9CH
MOVR0,#0
SETBTR1
SJMP$
ORG001BH
AJMPBRA
BRA:
CJNER0,#1000,LOOP
MOVR0,#0
CLPP1.0
RETI
LOOP:
INCR0
RETI
实验二窜行静态显示实验
一、实验目的
1.掌握数字、字符转换成显示段码的软件译码方法
2.静态显示的原理和相关程序的编写
二、实验内容
利用89C51串行口和8个串行输入并行输出移位寄存器74LS164,扩展8个8位输出通道,用于驱动8个LED数码显示器。
8LED显示“89C52”。
三、实验原理
74LS164为8位串入并出移位寄存器,1、2为串行输入端,QA~QH为并行输出端,CLK为移位时钟脉冲,上升沿移入一位;CLR为清零端,低电平时并行输出为零。
8段数码显示管原理如下图所示,分为共阴极和共阳极。
数字和字母显示由前面七段管决定,最后一段管决定右下角的小数点。
各个段管编号分别为a,b,c,d,e,f,g,h,a为最低位,h为最高位。
四、单片机编程代码
;P3.0--DINP3.1--CLK
DBUF0EQU30H
TEMPEQU40H
DINBITP3.0
CLKBITP3.1
ORG0000H
LJMPSTART
ORG0100H
START:
MOV30H,#10h
MOV31H,#10H
MOV32H,#10h
MOV33H,#8
MOV34H,#9
MOV35H,#0cH
MOV36H,#5
MOV37H,#2
DISP:
MOVR0,#DBUF0
MOVR1,#TEMP
MOVR2,#8
DP10:
MOVDPTR,#SEGTAB
MOVA,@R0
MOVCA,@A+DPTR
MOV@R1,A
INCR0
INCR1
DJNZR2,DP10
MOVR0,#TEMP
MOVR1,#8
DP12:
MOVR2,#8
MOVA,@R0
DP13:
RLCA
MOVDIN,C
CLRCLK
SETBCLK
DJNZR2,DP13
INCR0
DJNZR1,DP12
OK:
SJMPOK
SEGTAB:
DB3FH,06H,5BH,4FH,66H,6DH
DB7DH,07H,7FH,6FH,77H,7CH
DB39H,5EH,7BH,71H,00H,40H
END
实验三窜行A/D转换实验
一、实验目的
1.掌握单片机I/O模拟I2C总线的编程方法
2.掌握16位串行A/D转换芯片ADS1100使用方法
二、实验内容
利用ads1100将滑动变阻器的输出电压转换为数字信号,并在数码显示管显示出数字量。
三、实验原理
引脚号
引脚名称
功能
1
VIN+
输入正
2
GND
地
3
SCL
时钟线
4
SDA
数据线
5
VDD
电源
6
VIN-
输入负
ADS1100有两种工作模式:
连续转换模式和单次转换模式,连续转换模式下,当一次转换结束后,ADS1100将结果放入输出寄存器并立刻开始下一次转换,ST/BSY位在控制字寄存器中始终读到的是1。
如果是单次转换模式,则在ST/BSY位被置1后,ADS1100上电并执行一次转换,转换结束后,ADS1100会把结果放入输出寄存器,并复位ST/BSY成0,关断电源。
在转换中,ST/BSY置1无效,如果要从连续模式切换到单次模式,ADS1100可在执行完当前转换后ST/BSY置0,然后断电。
ADS1100的输出寄存器和控制字寄存器的内容是可读的。
要读ADS1100,可将其设为读状态(7位的ADS1100地址后加1位高电平有效的读信号,高位在前,如ADS1100A0则是10010001),以读取三个字节的内容,其中前两个字节是输出寄存器的内容(高位在前),第三个字节是控制字寄存器的内容(高位在前,从第四个字节开始起均为FFH。
如果只想知道输出寄存器的内容是否合理,可仅读取前两个字节而忽略其后的字节。
ADS1100的输出寄存器是只读的,只能向控制字寄存器写内容,写的方法是将ADS1100设置为写(在ADS1100地址后加1位低电平有效的写信号,高位在前),然后写入一个字节(高位在前)。
ADS1100忽略在第一个字节以后的内容。
四、单片机编程代码
DAT0BITP1.0
CLK0BITP1.1
CSBITP1.2
ADHEXDATA050H
DBUFDATA060H
BIT_COUNTDATA070H
TIMERDATA072H
TIMER1DATA073H
TIMER2DATA074H
DTA_INDATA020H
DATA_OUTDATA021H
CLKBITP1.6
DATBITP1.7
ORG0000H
LJMPMAIN
ORG0100H
main:
ACALLTLC549_ADC
MOVR7,#0
DJNZR7,$
ACALLTLC549_ADC
MOVR7,A;存转换结果
MOVADHEX,A
CALLMUL500;ADHEX*500/256
CALLHB2
CALLTODISP;拆开显示
NOP
CALLDISPLAY
CALLdelay
LJMPMAIN
TLC549_ADC:
;串行显示处理程序,结果存在A中
CLRA
CLRCLK0
CLRCS
MOVR6,#8
ADLOOP:
SETBCLK0
NOP
NOP
MOVC,DAT0
RLCA
CLRCLK0
NOP
DJNZR6,ADLOOP
SETBCS
SETBCLK0
RET
DISPLAY:
ANLP2,#00H;CS7279有效
MOVDATA_OUT,#10100100B;A4H,复位命令
CALLSEND
MOVDATA_OUT,#11001000B;译码方式0,0位显示
CALLSEND
MOVDATA_OUT,DBUF
CALLSEND
MOVDATA_OUT,#11001001B;译码方式0,1位显示
CALLSEND
MOVDATA_OUT,DBUF+1
CALLSEND
MOVDATA_OUT,#11001010B;译码方式0,2位显示
CALLSEND
MOVDATA_OUT,DBUF+2
CALLSEND
MOVP2,#0FFH;CS7279无效
RET
SEND:
MOVBIT_COUNT,#8;发送字符子程序
ANLP2,#00H
CALLLONG_DELAY
SEND_LOOP:
MOVC,DATA_OUT.7
MOVDAT,C
SETBCLK
MOVA,DATA_OUT
RLA
MOVDATA_OUT,A
CALLSHORT_DELAY
CLRCLK
CALLSHORT_DELAY
DJNZBIT_COUNT,SEND_LOOP
CLRDAT
RET
LONG_DELAY:
MOVTIMER,#150;延时约200US
DELAY_LOOP:
DJNZTIMER,DELAY_LOOP
RET
SHORT_DELAY:
MOVTIMER,#20;延时约20US
SHORT_LP:
DJNZTIMER,SHORT_LP
RET
DELAY:
MOVTIMER,#4
AA0:
MOVTIMER1,#0
AA1:
MOVTIMER2,#0
AA2:
DJNZTIMER2,AA2
DJNZTIMER1,AA1
DJNZTIMER,AA0
RET
;功能:
单字节二进制无符号数乘500(1f4H=100H+0f4H)
;入口条件:
被乘数在R7中。
;出口信息:
乘积在R4、R5、R6中(R6低八位)。
MUL500:
MOVA,#0f4H;计算R3乘R7
MOVB,R7
MULAB
MOVR5,B;暂存部分积
MOVR6,A
MOVA,R7
ADDA,B
MOVR5,A
CLRA
RLCA
MOVR4,A
CLRC
MOVA,R6
SUBBA,#80H
JCRETURN
CLRC
MOVA,R5
ADDA,#1
MOVR5,A
MOVA,R4
ADDCA,#0
MOVR4,A
RETURN:
RET
;功能:
双字节十六进制整数转换成双字节BCD码整数
;入口条件:
待转换的双字节十六进制整数在R6、R7中。
;出口信息:
转换后的三字节BCD码整数在R3、R4、R5中。
HB2:
MOVA,R4
MOVR6,A
MOVA,R5
MOVR7,A
CLRA;BCD码初始化
MOVR3,A
MOVR4,A
MOVR5,A
MOVR2,#10H;转换双字节十六进制整数
HB3:
MOVA,R7;从高端移出待转换数的一位到CY中
RLCA
MOVR7,A
MOVA,R6
RLCA
MOVR6,A
MOVA,R5;bcd码带进位自身相加,相当于乘2
ADDCA,R5
DAA;十进制调整
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
MOVA,R3
ADDCA,R3
MOVR3,A;双字节十六进制数的万位数不超过6,不用调整
DJNZR2,HB3;处理完16bit
RET
TODISP:
MOVA,R4
ORLA,#80H
MOVDBUF+2,A
MOVA,R5
SWAPA
ANLA,#0FH
MOVDBUF+1,A
MOVA,R5
ANLA,#0FH
MOVDBUF,A
RET
END
实验四温度传感器实验
一、实验目的
1.了解温度传感器电路的工作原理
2.了解温度控制的基本原理
3.掌握一线总线接口的使用
二、实验内容
利用DS18B20将温度在数码显示管显示出,以实现温度的测量和温度的控制。
三、实验原理
四、单片机编程代码
TEMPER_LEQU29H;用于保存读出温度的低8位
TEMPER_HEQU28H;用于保存读出温度的高8位
FLAG1EQU38H;是否检测到DS18B20标志位
A_BITEQU20H;数码管个位数存放内存位置
B_BITEQU21H;数码管十位数存放内存位置
LEDBufEQU30H
TEMPEQU55H
DINBITP1.0
CLKBITP1.1
ORG0000H
LJMPSTART
ORG0100H
start:
SETBP1.4
MAIN:
LCALLGET_TEMPER;调用读温度子程序
MOVA,29H
MOVC,40H;将28H中的最低位移入C
RRCA
MOVC,41H
RRCA
MOVC,42H
RRCA
MOVC,43H
RRCA
MOV29H,A
LCALLDisplayResult
LCALLDISPLAYLED;调用数码管显示子程序
LCALLDELAY1
AJMPMAIN
;这是DS18B20复位初始化子程序
INIT_1820:
SETBP2.0
NOP
CLRP2.0
;主机发出延时537微秒的复位低脉冲
MOVR1,#3
TSR1:
MOVR0,#107
DJNZR0,$
DJNZR1,TSR1
SETBP2.0;然后拉高数据线
NOP
NOP
NOP
MOVR0,#25H
TSR2:
JNBP2.0,TSR3;等待DS18B20回应
DJNZR0,TSR2
LJMPTSR4;延时
TSR3:
SETBFLAG1;置标志位,表示DS1820存在
LJMPTSR5
TSR4:
CLRFLAG1;清标志位,表示DS1820不存在
LJMPTSR7
TSR5:
MOVR0,#117
TSR6:
DJNZR0,TSR6;时序要求延时一段时间
TSR7:
SETBP2.0
RET
;读出转换后的温度值
GET_TEMPER:
SETBP2.0
LCALLINIT_1820;先复位DS18B20
JBFLAG1,TSS2
RET;判断DS1820是否存在?
若DS18B20不存在则返回
TSS2:
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
LCALLDELAY1
LCALLINIT_1820;准备读温度前先复位
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200;将读出的温度数据保存到35H/36H
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRP2.0
MOVR3,#6
DJNZR3,$
RRCA
MOVP2.0,C
MOVR3,#23
DJNZR3,$
SETBP2.0
NOP
DJNZR2,WR1
SETBP2.0
RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOVR4,#2;将温度高位和低位从DS18B20中读出
MOVR1,#29H;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOVR2,#8;数据一共有8位
RE01:
CLRC
SETBP2.0
NOP
NOP
CLRP2.0
NOP
NOP
NOP
SETBP2.0
MOVR3,#9
RE10:
DJNZR3,RE10
MOVC,P2.0
MOVR3,#23
RE20:
DJNZR3,RE20
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
DisplayLED:
;-----------显示子程序---------------
movLEDBUF+5,#10H
movLEDBUF+6,#10H
movLEDBUF+7,#10H
MOVR0,#LEDBUF
MOVR1,#TEMP
MOVR2,#8
DP10:
MOVDPTR,#LEDMAP
MOVA,@R0
MOVCA,@A+DPTR
MOV@R1,A
INCR0
INCR1
DJNZR2,DP10
MOVR0,#TEMP
MOVR1,#8
DP12:
MOVR2,#8
MOVA,@R0
DP13:
RLCA
MOVDIN,C
CLRCLK
SETBCLK
DJNZR2,DP13
INCR0
DJNZR1,DP12
RET
LEDMAP:
DB3FH,6,5BH,4FH,66H,6DH;0,1,2,3,4,5
DB7DH,7,7FH,6FH,77H,7CH;6,7,8,9,A,B
DB58h,63H,7BH,71H,00H,40H;C,o,E,F,,-
DB63H,39H,63h
DisplayResult:
;===================
MOVLEDBuf,#10H;''
MOVLEDBuf+3,#14H;
MOVLEDBuf+4,#13H;
Goon:
MOVA,29H;将29H中的十六进制数转换成10进制
MOVB,#10
DIVab
MOVLEDBuf+1,A;3
MOVA,B
MOVLEDBuf+2,A;4
MOVA,LEDBuf+1
CJNEA,#4,$+3
JNCWW
SETBP1.4
RET
WW:
CLRP1.4
D1MS:
MOVR7,#80
DJNZR7,$
RET
Delay:
MOVr7,#0
DelayLoop:
DJNZr7,DelayLoop
DJNZr6,DelayLoop
RET
DELAY1:
MOVR4,#020H
AA1:
MOVR5,#080H
AA:
NOP
NOP
DJNZR5,AA
DJNZR4,AA1
RET
END
实验五步进电机控制实验
一、实验目的
1.了解步进电机控制的基本原理
2.掌握控制步进电机转动的编程方法
3.了解单片机控制外部设备的常用电路
二、实验内容
用单片机实现步进电机的控制
三、实验原理
四、单片机编程代码
ORG0000
STOP:
ORLP1,#0FFH;步进电机停止
LOOP:
JNBP2.0,FOR2;如果p3.2按下正转
JNBP2.1,REV2;如果p3.3按下反转
JNBP2.2,STOP1;如果p3.4按下停止
JMPLOOP;反复监测键盘
FOR:
MOVR0,#00H;正转到tab取码指针初值
for1:
MOVA,R0;取码
MOVDPTR,#TABLE;
MOVCA,@A+DPTR
JZFOR;是否到了结束码00h
CPLA;把acc反向
MOVP1,A;输出到p1开始正转
JNBP2.2,STOP1;如果p3.4按下停止
JNBP2.1,REV2;如果p3.3按下正转
JNBP2.0,FOR2;如果p3.2按下反转
CALLDELAY;转动的速度
INCR0;取下一个码
JMPFOR1;继续正转
rev:
MOVR0,#05H;反转到tab取码指针初值
rev1:
MOVA,R0
MOVDPTR,#TABLE;取码
MOVCA,@A+DPTR
JZREV;是否到了结束码00h
CPLA;把acc反向
MOVP1,A;输出到p1开始反转
JNBP2.2,STOP1;如果p3.4按下停止
JNBP2.1,REV2;如果p3.3按下正转
JNBP2.0,FOR2;如果p3.2按下反转
CALLDELAY;转动的速度
INCR0;取下一个码
JMPREV1;继续反转
stop1:
CALLDELAY;按p3.4的消除抖动
JNBP2.2,$;p3.4放开否?
CALLDELAY;放开消除抖动
JMPSTOP
for2:
CALLDELAY;按p3.2的消除抖动
JNBP2.0,$;p3.2放开否?
CALLDELAY;放开消除抖动
JMPFOR
rev2:
CALLDELAY;按p3.3的消除抖动
JNBP2.1,$;p3.3放开否?
CALLDELAY;放开消除抖动
JMPREV
DELAY:
MOVR1,#150;步进电机的转速20ms
D1:
MOVR2,#248
DJNZR2,$
DJNZR1,D1
RET
TABLE:
db01h,02h,04h,08h;正转表
db00;正转结束
db01h,08h,04h,02h;反转
db00;反转结束
END
实验六128×64液晶显示屏实验
一、实验目的
1.了解点阵型液晶显示器的工作原理
2.了解点阵型液晶显示器控制方式
二、实验内容
用单片机和12864液晶显示屏实现动态图显示
三、实验原理
本实验箱采用内置控制器、不带字库的图形点阵液晶显示模块,点阵数为128×64。
它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成,可完成图形显示也可以显示8×4个(16×16点阵)汉字。
主要技术参数和性能:
1)电源VDD+5V模块内自带-10V负压用于LCD的驱动电压
2)显示内容128(列)64(行)点
3)全屏幕点阵
4)七种指令
5)与CPU接口采用8位数据总线并行输入输出和8条控制线
6)占空比1/64
7)工作温度-10+55存储温度-20+60
管脚号
管脚名称
LEVER
管脚功能描述
1
VSS
0
电源地
2
VDD
5.0V
电源电压
3
V0
5.0V-13V
液晶显示器驱动电压
4