1、步进电机控制实验实验十三 数字温度传感器实验实验十五 PWM输出实验实验十六 实时时钟实验单片机原理与接口技术实验十一步进电机控制实验实验十三数字温度传感器实验实验十五PWM输出实验实验十六实时时钟实验班级:学号:姓名:成绩:指导老师:日期:2017年12月11日实验十一步进电机控制实验一、实验目的了解步进电机控制的基本原理,掌握步进电机转动编程方法。二、实验原理步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。切换是通过单片机输出脉冲信号来实现的。所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转方向。步进电机的转速应由慢到快逐步
2、加速。电机驱动方式可以采用双四拍(ABBCCDDAAB)方式,也可以采用单四拍(ABCDA)方式,或单、双八拍(AABBBCCCDDDAA)方式。三、仪器设备:1、PC计算机一台。2、Dais-386PRO+实验系统一套。四、 实验内容:步进电机驱动原理是通过对它每组线圈中的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲信号为控制,所以调节脉冲信号的频率便可改变步进电机的转速。利用单片机的P1.0P1.3输出脉冲信号,驱动步进电机转动。实验电路:;步进电机控制;P1.0P1.3 - BA,BB,BC,BDorg 0mov a,#11001100bstart: mov p1,arr acal
3、l delaysjmp startdelay: mov r6,#8dlp: mov r7,#0djnz r7,$djnz r6,dlpretend实验步骤:1) 按图4-11连接实验电路,参考程序:A51STMOTOR.ASM;2) 编写实验程序,经编译、链接无语法错误后装载到实验系统;3) 全速运行程序,观察步进电机转动情况;4) 实验完毕后,应使用暂停命令中止程序的运行。五、 实验结果讨论:本实验程序通过右移循环延时11001100并给P1,从而控制步进电机的ABCD的正负来使其匀速转动。本次实验让我了解了步进电动机的工作原理,掌握了怎样用单片机编程来控制步进电机的转动。通过这次实验,我更
4、加深刻的认识到将单片机编程知识应用到实践中的重要性。同时,在理论知识方面,我还有很多欠缺。在以后的学习中要注意实践性,不能只满足于理论知识。实验十三数字温度传感器实验一、实验目的学习DS18B20数字温度传感器的编程方法。二、实验原理DS18B20的64位ROM的结构如下表。开始8位是DS18B20的产品类型编号10H,接着是每一个器件的唯一的序号,共有48位,最后8位是前56位的CRC 校验码,这也是多个DS18B20可以采用一根线进行通信的原因。8 bit检验 CRC48 bit 序列号8 bit 工厂代码(10H)主机操作ROM的命令有五种如下表:指令说明读ROM(33H)读DS18B2
5、0的序列号匹配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存储控制命令
6、指令说明温度转换(44H)启动在线DS18B20 作温度A/D转换读数据(BEH)从高速暂存器读9位温度值和CRC值写数据(4EH)将数据写入高速暂存器的第3和第4字节中复制(48H)将高速暂存器中第3和第4字节复制到EERAM读EERAM(88H)将EERAM内容写入高速暂存器中第3和第4字节读电源供电方式(B4H)了解DS18B20的供电方式在正常情况下,DS18B20的测温分辩率为0.5 0C,可采用下述方法获得高分辩率的温度测量结果:首先用DS18B20提供的读暂存器指令(BEH)读出以0.5 0C为分辩率的温度测量结果;其次切去测量结果中的低有效位(LSB),得到所测实际温度的整数部
7、分Tz;然后,再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。当18B20完成温度转换后,就把测得的温度值与TH、TL 作比较。若TTH 或TTL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令作出响应。因此可用多只DS18B20同时测量温度,主机进行告警搜索。一旦某测温点越限,主机利用告警搜索命令即可识别正在告警的器件,并读出序列号,而不必考虑非告警器件。三、仪器设备:1、PC计算机一台。2、 Dais-386PRO+实验系统一套。四、实验内容:1、温度测量使用单片机的P3.3连接DS18B20的DQ管脚,完成对DS18B20的初始化及温度的读取。实验步骤:1) 按图4-1
8、3-1连接实验电路,参考程序:A51DS18B20.ASM;2) 编写实验程序,经编译、链接无语法错误后装载到实验系统;3) 全速运行程序,数码管显示当前环境温度值;4) 实验完毕后,应使用暂停命令中止程序的运行。2、温度控制单片机的P3.3连接DS18B20的DQ管脚,完成对DS18B20的初始化及温度的读取;单片机的P3.2通过继电器控制功率电阻进行加温。编写程序,通用对P3.2的控制,将温度恒定在某一固定值。实验步骤:1) 按图4-13-2连接实验电路,参考程序:A51DS18B20C.ASM;2) 编写实验程序,经编译、链接无语法错误后装载到实验系统;3) 全速运行程序,数码管第1、2
9、位显示设定温度,第5、6位显示实测温度;4) 当实测温度小于设定温度时,开始加温;当实测温度大于等于设定温度时,停止加温。5) 实验完毕后,应使用暂停命令中止程序的运行。;DS18B20数字温度传感器DS18B20.ASM;实验连线; 单片机的P3.3连接18B20单元的测温(DQ)端CS8279C equ 0fff1hCS8279D equ 0fff0hledbufequ 70h ;显示缓冲TEMPER_L EQU 36H ;存放读出温度低位数据TEMPER_H EQU 35H ;存放读出温度高位数据TEMPER_NUM EQU 60H ;存放转换后的温度值FLAG1 BIT 00HDQ B
10、IT P3.3 ;一线总线控制端口 ORG 0000H MOV SP,#60H call I8279 ;8279初始化 MOV LedBuf+0,#10h MOV LedBuf+1,#10h MOV LedBuf+2,#10h MOV LedBuf+3,#10h MOV LedBuf+4,#10h MOV LedBuf+5,#10hLCALL DISPmloop: LCALL GET_TEMPER ;从DS18B20读出温度数据 LCALL TEMPER_COV ;转换读出的温度数据并保存mova,TEMPER_NUMmovb,a;拆送显示缓冲区swap aanl a,#0fhanl b,#0
11、fh MOV LedBuf+4,a MOV LedBuf+5,b LCALL DISP SJMP mloop ;完成一次数字温度采集;读出转换后的温度值GET_TEMPER: SETB DQ ;定时入口BCD: LCALL INIT_1820 JB FLAG1,S22 LJMP BCD ;若DS18B20不存在则返回S22: LCALL DISP MOV A,#0CCH ;跳过ROM匹配-0CCRRC A MOV DQ,C MOV R3,#11 DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET;读DS18B20的程序,从DS18B20中读出两个字节的温
12、度数据READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出 MOV R1,#36H ;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)RE00: MOV R2,#8RE01: CLR C SETB DQ NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#3 DJNZ R3,$ MOV C,DQ MOV R3,#11 DJNZ R3,$ RRC A DJNZ R2,RE01 MOV R1,A DEC R1 DJNZ R4,RE00 RET;将从DS18B20中读出的温度数据进行转换TEMPER_COV: M
13、OV A,#0F0H ANL A,TEMPER_L ;舍去温度低位中小数点后的四位温度数值LCALL WRITE_1820 MOV A,#44H ;发出温度转换命令 LCALL WRITE_1820 NOP LCALL DISPCBA: LCALL INIT_1820 JB FLAG1,ABC LJMP CBAABC: LCALL DISP MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ;发出读温度命令 LCALL WRITE_1820 LCALL READ_18200 RET;读DS18B20的程序,从DS18B20中读出一个字节的数据R
14、EAD_1820: MOV R2,#8RE1: CLR C SETB DQ NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#3 DJNZ R3,$ MOV C,DQ MOV R3,#11 DJNZ R3,$ RRC A DJNZ R2,RE1 RET;写DS18B20的程序WRITE_1820: MOV R2,#8 CLR CWR1: CLR DQ MOV R3,#3 DJNZ R3,$SWAP A MOV TEMPER_NUM,A MOV A,TEMPER_L JNB ACC.3,TEMPER_COV1 ;四舍五入去温度值 INC TEMPER_NUMT
15、EMPER_COV1: MOV A,TEMPER_H ANL A,#07H SWAP A ADD A,TEMPER_NUM MOV TEMPER_NUM,A ; 保存变换后的温度数据 LCALL BIN_BCD RET;将16进制的温度数据转换成压缩BCD码BIN_BCD:MOV DPTR,#TEMP_TAB MOV A,TEMPER_NUM MOVC A,A+DPTR MOV TEMPER_NUM,A RETTEMP_TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H DB 08H,09H,10H,11H,12H,13H,14H,15H DB 16H,17H,18
16、H,19H,20H,21H,22H,23H DB 24H,25H,26H,27H,28H,29H,30H,31H DB 32H,33H,34H,35H,36H,37H,38H,39H DB 40H,41H,42H,43H,44H,45H,46H,47H DB 48H,49H,50H,51H,52H,53H,54H,55HDB 56H,57H,58H,59H,60H,61H,62H,63H DB 64H,65H,66H,67H,68H,69H,70H,71H DB 72H,73H,74H,75H,76H,77H,78H,79H DB 80H,81H,82H,83H,84H,85H,86H,87H
17、 DB DB 88H,89H,90H,91H,92H,93H,94H,95H DB 96H,97H,98H,99H;DS18B20初始化程序INIT_1820: SETB DQ NOP CLR DQ MOV R0,#80hTSR1: DJNZ R0,TSR1 ;延时 SETB DQ MOV R0,#25h ;96usTSR2: DJNZ R0,TSR2 JNB DQ,TSR3 LJMP TSR4 ;延时TSR3: SETB FLAG1 ;置标志位,表示DS1820存在 LJMP TSR5TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在 LJMP TSR7TSR5: MOV R
18、0,#6Bh ;200usTSR6: DJNZ R0,TSR6 ;延时TSR7: SETB DQ RET;重新写DS18B20暂存存储器设定值RE_CONFIG: JB FLAG1,RE_CONFIG1 ;若DS18B20存在,转RE_CONFIG1 RETRE_CONFIG1: MOV A,#0CCH ;发SKIP ROM命令 LCALL WRITE_1820 MOV A,#4EH ;发写暂存存储器命令 LCALL WRITE_1820LCALL WRITE_1820 MOV A,#00H ;TH(报警上限)中写入00H LCALL WRITE_1820;DS18B20数字温度传感器DS18
19、B20C.ASM;实验连线; 单片机的P3.3连接DS18B20单元的 DQ; 单片机的P3.2连接继电器单元的 JIN; 继电器单元的JZ连接GND; 继电器单元的JK连接DS18B20单元的 HOTSetTempequ 35 ;设定温度值CS8279C equ 0fff1hCS8279D equ 0fff0hledbufequ 70h ;显示缓冲TEMPER_L EQU 36H ;存放读出温度低位数据TEMPER_H EQU 35H ;存放读出温度高位数据TEMPER_SET EQU 5FH ;存放设定的温度值TEMPER_NUM EQU 60H ;存放转换后的温度值FLAG1 BIT 0
20、0HDQ BIT P3.3 ;单总线控制端口HOT BIT P3.2 ;温度控制 ORG 0000H MOV SP,#60H call I8279 ;8279初始化 MOV DPTR,#TEMP_TABmov a,#SetTemp ;取设定温度值 MOVC A,A+DPTRmovTEMPER_SET,amovb,a ;拆送显示缓冲区disp: PUSH DPL PUSH DPHmov r2,#85hmov r0,#ledbufdisp1: mov dptr,#CS8279Cmov a,r2movx dptr,amovdptr,#ledmap;指字形表首mov a,r0 ;取送显数据movc a
21、,a+dptr ;索字形代码mov dptr,#CS8279D ;指向字形口movx dptr,a ;送当前字形dec r2inc r0cjne r0,#ledbuf+6,disp1 POP DPH POP DPLret;字形表ledmap: db 0ch,9fh,4ah,0bh,99h,29h,28h,8fhdb 08h,09h,88h,38h,6ch,1ah,68h,0e8h,0ffh ENDMOV A,#00H ;TL(报警下限)中写入00H LCALL WRITE_1820 MOV A,#7FH ;选择12位温度分辨率 LCALL WRITE_1820 RET;8279初始化I8279
22、: PUSH DPL PUSH DPH MOV dptr,#CS8279C ;指向命令口 MOV A,#00H ;8个8位显示 MOVX dptr,a ;方式字写入 MOV A,#32H ;设分频初值 MOVX dptr,a;分频字写入 MOV A,#0DFH ;定义清显字 MOVX dptr,a;关闭显示器x90s: movx a,dptr JB ACC.7,x90s ;检测8279 POP DPH POP DPLret;显示子程序MOV A,#44H ;发出温度转换命令 LCALL WRITE_1820 NOP LCALL DISPCBA: LCALL INIT_1820 JB FLAG1
23、,ABC LJMP CBAABC: LCALL DISP MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ;发出读温度命令 LCALL WRITE_1820 LCALL READ_18200 RET;读DS18B20的程序,从DS18B20中读出一个字节的数据READ_1820: MOV R2,#8RE1: CLR C SETB DQ NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#3 DJNZ R3,$ MOV C,DQ MOV R3,#11 DJNZ R3,$ RRC A DJNZ R2,RE1 RE
24、T;写DS18B20的程序WRITE_1820: MOV R2,#8 CLR CWR1: CLR DQ MOV R3,#3swap aanl a,#0fhanl b,#0fh MOV LedBuf+0,a MOV LedBuf+1,b MOV LedBuf+2,#10h MOV LedBuf+3,#10h MOV LedBuf+4,#10h MOV LedBuf+5,#10h LCALL DISP ;清显示mloop: LCALL GET_TEMPER ;从DS18B20读出温度数据 LCALL TEMPER_COV ;转换读出的温度数据并保存mova,TEMPER_NUMcjne a,TEM
25、PER_SET,ML2ML2: JNC ML3 CLR HOT ;开始加温 SJMP MLPML3: SETB HOT ;停止加温MLP: movb,a ;拆送显示缓冲区swap aanl a,#0fhanl b,#0fh MOV LedBuf+4,a MOV LedBuf+5,b LCALL DISP SJMP mloop ;完成一次数字温度采集;读出转换后的温度值GET_TEMPER: SETB DQ ;定时入口BCD: LCALL INIT_1820 JB FLAG1,S22 LJMP BCD ;若DS18B20不存在则返回S22: LCALL DISP MOV A,#0CCH ;跳过R
26、OM匹配-0CCLCALL WRITE_1820MOV TEMPER_NUM,A MOV A,TEMPER_L JNB ACC.3,TEMPER_COV1 ;四舍五入去温度值 INC TEMPER_NUMTEMPER_COV1: MOV A,TEMPER_H ANL A,#07H SWAP A ADD A,TEMPER_NUM MOV TEMPER_NUM,A ; 保存变换后的温度数据 LCALL BIN_BCD RET;将16进制的温度数据转换成压缩BCD码BIN_BCD:MOV DPTR,#TEMP_TAB MOV A,TEMPER_NUM MOVC A,A+DPTR MOV TEMPER
27、_NUM,A RETTEMP_TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H DB 08H,09H,10H,11H,12H,13H,14H,15H DB 16H,17H,18H,19H,20H,21H,22H,23H DB 24H,25H,26H,27H,28H,29H,30H,31H DB 32H,33H,34H,35H,36H,37H,38H,39H DB 40H,41H,42H,43H,44H,45H,46H,47HDB 48H,49H,50H,51H,52H,53H,54H,55H DB 56H,57H,58H,59H,60H,61H,62H,63H D
28、B 64H,65H,66H,67H,68H,69H,70H,71H DB 72H,73H,74H,75H,76H,77H,78H,79H DB 80H,81H,82H,83H,84H,85H,86H,87HRRC A MOV DQ,C MOV R3,#11 DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET;读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出 MOV R1,#36H ;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)RE
29、00: MOV R2,#8RE01: CLR C SETB DQ NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#3 DJNZ R3,$ MOV C,DQ MOV R3,#11 DJNZ R3,$ RRC A DJNZ R2,RE01 MOV R1,A DEC R1 DJNZ R4,RE00 RET;将从DS18B20中读出的温度数据进行转换TEMPER_COV: MOV A,#0F0H ANL A,TEMPER_L ;舍去温度低位中小数点后的四位温度数值 SWAP A RET;8279初始化I8279: PUSH DPL PUSH DPH MOV dptr,#CS8279C ;指向命令口 MOV A,#00H ;8个8位显示 MOVX dptr,a;方式字写入 MOV A,#32H ;设分频初值 MOVX dptr,a ;分频字写入 MOV A,#0DFH ;定义清显字 MOVX dptr,a ;关闭显示器x90s: movx a,dptr JB A