步进电机控制实验实验十三 数字温度传感器实验实验十五 PWM输出实验实验十六 实时时钟实验.docx
《步进电机控制实验实验十三 数字温度传感器实验实验十五 PWM输出实验实验十六 实时时钟实验.docx》由会员分享,可在线阅读,更多相关《步进电机控制实验实验十三 数字温度传感器实验实验十五 PWM输出实验实验十六 实时时钟实验.docx(47页珍藏版)》请在冰豆网上搜索。
步进电机控制实验实验十三数字温度传感器实验实验十五PWM输出实验实验十六实时时钟实验
《单片机原理与接口技术》
实验十一 步进电机控制实验
实验十三 数字温度传感器实验
实验十五 PWM输出实验
实验十六 实时时钟实验
班级:
学号:
姓名:
成绩:
指导老师:
日期:
2017年12月11日
实验十一 步进电机控制实验
一、实验目的
了解步进电机控制的基本原理,掌握步进电机转动编程方法。
二、实验原理
步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。
切换是通过单片机输出脉冲信号来实现的。
所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转方向。
步进电机的转速应由慢到快逐步加速。
电机驱动方式可以采用双四拍(AB→BC→CD→DA→AB)方式,也可以采用单四拍(A→B→C→D→A)方式,或单、双八拍(A→AB→B→BC→C→CD→D→DA→A)方式。
三、仪器设备:
1、PC计算机一台。
2、Dais-386PRO+实验系统一套。
四、实验内容:
步进电机驱动原理是通过对它每组线圈中的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲信号为控制,所以调节脉冲信号的频率便可改变步进电机的转速。
利用单片机的P1.0~P1.3输出脉冲信号,驱动步进电机转动。
实验电路:
;步进电机控制
;P1.0~P1.3----BA,BB,BC,BD
org0
mova,#11001100b
start:
movp1,a
rra
calldelay
sjmpstart
delay:
movr6,#8
dlp:
movr7,#0
djnzr7,$
djnzr6,dlp
ret
end
实验步骤:
1)按图4-11连接实验电路,参考程序:
A51\STMOTOR.ASM;
2)编写实验程序,经编译、链接无语法错误后装载到实验系统;
3)全速运行程序,观察步进电机转动情况;
4)实验完毕后,应使用暂停命令中止程序的运行。
五、实验结果讨论:
本实验程序通过右移循环延时11001100并给P1,从而控制步进电机的ABCD的正负来使其匀速转动。
本次实验让我了解了步进电动机的工作原理,掌握了怎样用单片机编程来控制步进电机的转动。
通过这次实验,我更加深刻的认识到将单片机编程知识应用到实践中的重要性。
同时,在理论知识方面,我还有很多欠缺。
在以后的学习中要注意实践性,不能只满足于理论知识。
实验十三 数字温度传感器实验
一、实验目的
学习DS18B20数字温度传感器的编程方法。
二、实验原理
DS18B20的64位ROM的结构如下表。
开始8位是DS18B20的产品类型编号10H,接着是每一个器件的唯一的序号,共有48位,最后8位是前56位的CRC校验码,这也是多个DS18B20可以采用一根线进行通信的原因。
8bit检验CRC
48bit序列号
8bit工厂代码(10H)
主机操作ROM的命令有五种如下表:
指令
说明
读ROM(33H)
读DS18B20的序列号
匹配ROM(55H)
继续读完64位序列号的命令,用于多个DS18B20时定位
跳过ROM(CCH)
此命令执行后的存储器操作将针对在线的所有DS18B20
搜ROM(F0H)
识别总线上各器件的编码,为操作各器件作好准备
报警搜索(ECH)
仅温度越限的器件对此命令作出响应
DS18B20的高速暂存器由便笺式RAM和非易失性电擦写EERAM组成,后者用于存储TH、TL值。
数据先写入便笺式RAM,经校验后再传给EERAM。
便笺式RAM占9个字节,包括温度信息(第0、1字节)、TH和TL值(2、3字节)、配置寄存器数据(4字节)、CRC(第8字节)等,第5、6、7字节不用。
DS18B20存储控制命令
指令
说明
温度转换(44H)
启动在线DS18B20作温度A/D转换
读数据(BEH)
从高速暂存器读9位温度值和CRC值
写数据(4EH)
将数据写入高速暂存器的第3和第4字节中
复制(48H)
将高速暂存器中第3和第4字节复制到EERAM
读EERAM(88H)
将EERAM内容写入高速暂存器中第3和第4字节
读电源供电方式(B4H)
了解DS18B20的供电方式
在正常情况下,DS18B20的测温分辩率为0.50C,可采用下述方法获得高分辩率的温度测量结果:
首先用DS18B20提供的读暂存器指令(BEH)读出以0.50C为分辩率的温度测量结果;其次切去测量结果中的低有效位(LSB),得到所测实际温度的整数部分Tz;然后,再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。
当18B20完成温度转换后,就把测得的温度值与TH、TL作比较。
若T>TH或T因此可用多只DS18B20同时测量温度,主机进行告警搜索。
一旦某测温点越限,主机利用告警搜索命令即可识别正在告警的器件,并读出序列号,而不必考虑非告警器件。
三、仪器设备:
1、PC计算机一台。
2、Dais-386PRO+实验系统一套。
四、实验内容:
1、温度测量
使用单片机的P3.3连接DS18B20的DQ管脚,完成对DS18B20的初始化及温度的读取。
实验步骤:
1)按图4-13-1连接实验电路,参考程序:
A51\DS18B20.ASM;
2)编写实验程序,经编译、链接无语法错误后装载到实验系统;
3)全速运行程序,数码管显示当前环境温度值;
4)实验完毕后,应使用暂停命令中止程序的运行。
2、温度控制
单片机的P3.3连接DS18B20的DQ管脚,完成对DS18B20的初始化及温度的读取;单片机的P3.2通过继电器控制功率电阻进行加温。
编写程序,通用对P3.2的控制,将温度恒定在某一固定值。
实验步骤:
1)按图4-13-2连接实验电路,参考程序:
A51\DS18B20C.ASM;
2)编写实验程序,经编译、链接无语法错误后装载到实验系统;
3)全速运行程序,数码管第1、2位显示设定温度,第5、6位显示实测温度;
4)当实测温度小于设定温度时,开始加温;当实测温度大于等于设定温度时,停止加温。
5)实验完毕后,应使用暂停命令中止程序的运行。
;DS18B20数字温度传感器DS18B20.ASM
;实验连线
;单片机的P3.3连接18B20单元的"测温(DQ)"端
CS8279Cequ0fff1h
CS8279Dequ0fff0h
ledbufequ70h;显示缓冲
TEMPER_LEQU36H;存放读出温度低位数据
TEMPER_HEQU35H;存放读出温度高位数据
TEMPER_NUMEQU60H;存放转换后的温度值
FLAG1BIT00H
DQBITP3.3;一线总线控制端口
ORG0000H
MOVSP,#60H
callI8279;8279初始化
MOVLedBuf+0,#10h
MOVLedBuf+1,#10h
MOVLedBuf+2,#10h
MOVLedBuf+3,#10h
MOVLedBuf+4,#10h
MOVLedBuf+5,#10h
LCALLDISP
mloop:
LCALLGET_TEMPER;从DS18B20读出温度数据
LCALLTEMPER_COV;转换读出的温度数据并保存
mova,TEMPER_NUM
movb,a;拆送显示缓冲区
swapa
anla,#0fh
anlb,#0fh
MOVLedBuf+4,a
MOVLedBuf+5,b
LCALLDISP
SJMPmloop;完成一次数字温度采集
;读出转换后的温度值
GET_TEMPER:
SETBDQ;定时入口
BCD:
LCALLINIT_1820
JBFLAG1,S22
LJMPBCD;若DS18B20不存在则返回
S22:
LCALLDISP
MOVA,#0CCH;跳过ROM匹配------0CC
RRCA
MOVDQ,C
MOVR3,#11
DJNZR3,$
SETBDQ
NOP
DJNZR2,WR1
SETBDQ
RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOVR4,#2;将温度高位和低位从DS18B20中读出
MOVR1,#36H;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOVR2,#8
RE01:
CLRC
SETBDQ
NOP
NOP
CLRDQ
NOP
NOP
NOP
SETBDQ
MOVR3,#3
DJNZR3,$
MOVC,DQ
MOVR3,#11
DJNZR3,$
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
;将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOVA,#0F0H
ANLA,TEMPER_L;舍去温度低位中小数点后的四位温度数值
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
NOP
LCALLDISP
CBA:
LCALLINIT_1820
JBFLAG1,ABC
LJMPCBA
ABC:
LCALLDISP
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200
RET
;读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
MOVR2,#8
RE1:
CLRC
SETBDQ
NOP
NOP
CLRDQ
NOP
NOP
NOP
SETBDQ
MOVR3,#3
DJNZR3,$
MOVC,DQ
MOVR3,#11
DJNZR3,$
RRCA
DJNZR2,RE1
RET
;写DS18B20的程序
WRITE_1820:
MOVR2,#8
CLRC
WR1:
CLRDQ
MOVR3,#3
DJNZR3,$
SWAPA
MOVTEMPER_NUM,A
MOVA,TEMPER_L
JNBACC.3,TEMPER_COV1;四舍五入去温度值
INCTEMPER_NUM
TEMPER_COV1:
MOVA,TEMPER_H
ANLA,#07H
SWAPA
ADDA,TEMPER_NUM
MOVTEMPER_NUM,A;保存变换后的温度数据
LCALLBIN_BCD
RET
;将16进制的温度数据转换成压缩BCD码
BIN_BCD:
MOVDPTR,#TEMP_TAB
MOVA,TEMPER_NUM
MOVCA,@A+DPTR
MOVTEMPER_NUM,A
RET
TEMP_TAB:
DB00H,01H,02H,03H,04H,05H,06H,07H
DB08H,09H,10H,11H,12H,13H,14H,15H
DB16H,17H,18H,19H,20H,21H,22H,23H
DB24H,25H,26H,27H,28H,29H,30H,31H
DB32H,33H,34H,35H,36H,37H,38H,39H
DB40H,41H,42H,43H,44H,45H,46H,47H
DB48H,49H,50H,51H,52H,53H,54H,55H
DB56H,57H,58H,59H,60H,61H,62H,63H
DB64H,65H,66H,67H,68H,69H,70H,71H
DB72H,73H,74H,75H,76H,77H,78H,79H
DB80H,81H,82H,83H,84H,85H,86H,87H
DB
DB88H,89H,90H,91H,92H,93H,94H,95H
DB96H,97H,98H,99H
;DS18B20初始化程序
INIT_1820:
SETBDQ
NOP
CLRDQ
MOVR0,#80h
TSR1:
DJNZR0,TSR1;延时
SETBDQ
MOVR0,#25h;96us
TSR2:
DJNZR0,TSR2
JNBDQ,TSR3
LJMPTSR4;延时
TSR3:
SETBFLAG1;置标志位,表示DS1820存在
LJMPTSR5
TSR4:
CLRFLAG1;清标志位,表示DS1820不存在
LJMPTSR7
TSR5:
MOVR0,#6Bh;200us
TSR6:
DJNZR0,TSR6;延时
TSR7:
SETBDQ
RET
;重新写DS18B20暂存存储器设定值
RE_CONFIG:
JBFLAG1,RE_CONFIG1;若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOVA,#0CCH;发SKIPROM命令
LCALLWRITE_1820
MOVA,#4EH;发写暂存存储器命令
LCALLWRITE_1820
LCALLWRITE_1820
MOVA,#00H;TH(报警上限)中写入00H
LCALLWRITE_1820
;DS18B20数字温度传感器DS18B20C.ASM
;实验连线
;单片机的P3.3连接DS18B20单元的DQ
;单片机的P3.2连接继电器单元的JIN
;继电器单元的JZ连接GND
;继电器单元的JK连接DS18B20单元的HOT
SetTempequ35;设定温度值
CS8279Cequ0fff1h
CS8279Dequ0fff0h
ledbufequ70h;显示缓冲
TEMPER_LEQU36H;存放读出温度低位数据
TEMPER_HEQU35H;存放读出温度高位数据
TEMPER_SETEQU5FH;存放设定的温度值
TEMPER_NUMEQU60H;存放转换后的温度值
FLAG1BIT00H
DQBITP3.3;单总线控制端口
HOTBITP3.2;温度控制
ORG0000H
MOVSP,#60H
callI8279;8279初始化
MOVDPTR,#TEMP_TAB
mova,#SetTemp;取设定温度值
MOVCA,@A+DPTR
movTEMPER_SET,a
movb,a;拆送显示缓冲区
disp:
PUSHDPL
PUSHDPH
movr2,#85h
movr0,#ledbuf
disp1:
movdptr,#CS8279C
mova,r2
movx@dptr,a
movdptr,#ledmap;指字形表首
mova,@r0;取送显数据
movca,@a+dptr;索字形代码
movdptr,#CS8279D;指向字形口
movx@dptr,a;送当前字形
decr2
incr0
cjner0,#ledbuf+6,disp1
POPDPH
POPDPL
ret
;字形表
ledmap:
db0ch,9fh,4ah,0bh,99h,29h,28h,8fh
db08h,09h,88h,38h,6ch,1ah,68h,0e8h,0ffh
END
MOVA,#00H;TL(报警下限)中写入00H
LCALLWRITE_1820
MOVA,#7FH;选择12位温度分辨率
LCALLWRITE_1820
RET
;8279初始化
I8279:
PUSHDPL
PUSHDPH
MOVdptr,#CS8279C;指向命令口
MOVA,#00H;8个8位显示
MOVX@dptr,a;方式字写入
MOVA,#32H;设分频初值
MOVX@dptr,a;分频字写入
MOVA,#0DFH;定义清显字
MOVX@dptr,a;关闭显示器
x90s:
movxa,@dptr
JBACC.7,x90s;检测8279
POPDPH
POPDPL
ret
;显示子程序
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
NOP
LCALLDISP
CBA:
LCALLINIT_1820
JBFLAG1,ABC
LJMPCBA
ABC:
LCALLDISP
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200
RET
;读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
MOVR2,#8
RE1:
CLRC
SETBDQ
NOP
NOP
CLRDQ
NOP
NOP
NOP
SETBDQ
MOVR3,#3
DJNZR3,$
MOVC,DQ
MOVR3,#11
DJNZR3,$
RRCA
DJNZR2,RE1
RET
;写DS18B20的程序
WRITE_1820:
MOVR2,#8
CLRC
WR1:
CLRDQ
MOVR3,#3
swapa
anla,#0fh
anlb,#0fh
MOVLedBuf+0,a
MOVLedBuf+1,b
MOVLedBuf+2,#10h
MOVLedBuf+3,#10h
MOVLedBuf+4,#10h
MOVLedBuf+5,#10h
LCALLDISP;清显示
mloop:
LCALLGET_TEMPER;从DS18B20读出温度数据
LCALLTEMPER_COV;转换读出的温度数据并保存
mova,TEMPER_NUM
cjnea,TEMPER_SET,ML2
ML2:
JNCML3
CLRHOT;开始加温
SJMPMLP
ML3:
SETBHOT;停止加温
MLP:
movb,a;拆送显示缓冲区
swapa
anla,#0fh
anlb,#0fh
MOVLedBuf+4,a
MOVLedBuf+5,b
LCALLDISP
SJMPmloop;完成一次数字温度采集
;读出转换后的温度值
GET_TEMPER:
SETBDQ;定时入口
BCD:
LCALLINIT_1820
JBFLAG1,S22
LJMPBCD;若DS18B20不存在则返回
S22:
LCALLDISP
MOVA,#0CCH;跳过ROM匹配------0CC
LCALLWRITE_1820
MOVTEMPER_NUM,A
MOVA,TEMPER_L
JNBACC.3,TEMPER_COV1;四舍五入去温度值
INCTEMPER_NUM
TEMPER_COV1:
MOVA,TEMPER_H
ANLA,#07H
SWAPA
ADDA,TEMPER_NUM
MOVTEMPER_NUM,A;保存变换后的温度数据
LCALLBIN_BCD
RET
;将16进制的温度数据转换成压缩BCD码
BIN_BCD:
MOVDPTR,#TEMP_TAB
MOVA,TEMPER_NUM
MOVCA,@A+DPTR
MOVTEMPER_NUM,A
RET
TEMP_TAB:
DB00H,01H,02H,03H,04H,05H,06H,07H
DB08H,09H,10H,11H,12H,13H,14H,15H
DB16H,17H,18H,19H,20H,21H,22H,23H
DB24H,25H,26H,27H,28H,29H,30H,31H
DB32H,33H,34H,35H,36H,37H,38H,39H
DB40H,41H,42H,43H,44H,45H,46H,47H
DB48H,49H,50H,51H,52H,53H,54H,55H
DB56H,57H,58H,59H,60H,61H,62H,63H
DB64H,65H,66H,67H,68H,69H,70H,71H
DB72H,73H,74H,75H,76H,77H,78H,79H
DB80H,81H,82H,83H,84H,85H,86H,87H
RRCA
MOVDQ,C
MOVR3,#11
DJNZR3,$
SETBDQ
NOP
DJNZR2,WR1
SETBDQ
RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOVR4,#2;将温度高位和低位从DS18B20中读出
MOVR1,#36H;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOVR2,#8
RE01:
CLRC
SETBDQ
NOP
NOP
CLRDQ
NOP
NOP
NOP
SETBDQ
MOVR3,#3
DJNZR3,$
MOVC,DQ
MOVR3,#11
DJNZR3,$
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
;将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOVA,#0F0H
ANLA,TEMPER_L;舍去温度低位中小数点后的四位温度数值
SWAPA
RET
;8279初始化
I8279:
PUSHDPL
PUSHDPH
MOVdptr,#CS8279C;指向命令口
MOVA,#00H;8个8位显示
MOVX@dptr,a;方式字写入
MOVA,#32H;设分频初值
MOVX@dptr,a;分频字写入
MOVA,#0DFH;定义清显字
MOVX@dptr,a;关闭显示器
x90s:
movxa,@dptr
JBA