《单片微机原理及应用》
实验指导书
课程中文名称:单片微机原理及应用 课程代码:36607
课程英文名称: Principles and Applications of Micro-controller 课程性质:学科基础必修课
总学时:48学时(其中讲课36学时,实验12学时)
实验地点:15号楼202室
实验课时间:11月10日(第9、11、13、15周)
浙江理工大学 机控学院
概述
实验设备:深圳市学林电子有限公司XL600单片机实验仪
(http://www.51c51.com)
实验一 定时器、中断、IO口综合实验—LED灯闪烁实验
一、实验目的
熟悉MCS-51定时器、中断初始化编程方法; 了解定时器应用实时程序的设计与调试技巧; 二、实验内容
实现4个LED按一定规律闪烁 三、程序框图
四、实验步骤
1、 硬件连接:8PIN数据排线把CPU部份的P1口(JP44)连接到八路指示灯部份的
JP32。
2、 输入源程序,编译
3、 在中断入口矢量处设置断点,来观察中断时PC、堆栈指针SP的值。 4、 全速执行,观察LED灯的变化情况 五、实验报告
1、进入中断程序时,SP及(SP-1)两单元内的值代表什么? 2、上机实验程序。 汇编语言参考程序 ORG 0 LJMP STA ORG 000BH LJMP TIME0T ORG 0030H
STA: MOV SP,#70H
MOV TMOD,#01H LOOP: TIME0T: TT1: TT2: MOV TH0,#00H MOV TL0,#01H SETB EA SETB ET0 SETB TR0 MOV P1,#08H INC R1 LJMP LOOP MOV TH0,#00H MOV TL0,#01H MOV A,P1 JB ACC.0, TT1 RR A LJMP TT2 MOV A,#08H MOV P1,A RETI END
实验二 并口实验-数码管动态扫描显示
一、实验目的
1.学习并口的应用
2.掌握数码管动态扫描显示的硬件接线和编程方法 二、实验内容
1、硬件接线;
原理图:8个数码管(共阳)它的数据线并联接到JP5, 位控制由8个PNP型三级管驱动后由JP8引出。
(1) 接8位数码管的数据线:将数码管部份的数据口 JP5接到CPU部份的P0口JP51. (2) 接8位数码管的显示位线:将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.
0010 1000
2、编程与调试
数码管动态扫描显示01234567的参考程序
汇编语言参考程序: ORG 0000H AJMP MAIN ORG 0080H MAIN:
CLR P2.0 ;选中第一个数码管 MOV P0,#28H ;显示0 LCALL DELAY ; 调用延时 MOV P0,#0FFH ;关显示 SETB P2.0
CLR P2.1 ;选中第二个数码管 MOV P0,#7EH ;显示1 LCALL DELAY MOV P0,#0FFH SETB P2.1
CLR P2.2 ;选中第三个数码管 MOV P0,#0A2H ;显示2 LCALL DELAY MOV P0,#0FFH SETB P2.2
CLR P2.3 ;选中第四个数码管 MOV P0,#62H ;显示3 LCALL DELAY MOV P0,#0FFH SETB P2.3
CLR P2.4 ;选中第五个数码管 MOV P0,#74H ;显示4 LCALL DELAY MOV P0,#0FFH SETB P2.4
CLR P2.5 ;选中第六个数码管 MOV P0,#61H ; 显示5 LCALL DELAY MOV P0,#0FFH SETB P2.5
CLR P2.6 ;选中第七个数码管 MOV P0,#21H ; 显示6 LCALL DELAY MOV P0,#0FFH SETB P2.6
CLR P2.7 ;选中第八个数码管 MOV P0,#7AH ; 显示7 LCALL DELAY SETB P2.7 MOV P0,#0FFH AJMP MAIN ;重新开始 DELAY: ;延时子程序 MOV R7,#2 D1: MOV R6,#25 D2: DJNZ R6,D2 DJNZ R7,D1 RET END
c语言参考程序:
#include //头文件
#define uchar unsigned char //宏定义,为方便编程 #define uint unsigned int
#define DIGI P0 //宏定义,将P1口定义为数码管 #define SELECT P0 //宏定义,将P2定义为数码管选择口
uchar digivalue[]={0x28,0x7e,0x0a2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; //显示的数字数组,依次为0,1,..,9
uchar select[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //选择数码管数组,依次选择1,2,..,8
void delay() //延迟函数,决定数码管跳变的间隔时间 {
uchar ii=200; //若发现数码管闪烁,调节这里即可
while(ii--); }
char code SST516[3] _at_ 0x003b; //仿真器插入代码 main() //主函数 {
uchar i=0; while(1) {
for(i=0;i
SELECT=select[i]; //选择第i个数码管 DIGI=digivalue[i]; //显示i delay(); } } }
三、实验报告
1.如何使LED显示自己的学号?写出操作过程。
实验三(1) 模拟/数字转换器实验
一、实验目的
1.学习接口芯片的扩展方法
2.掌握模拟量数字量接口芯片的应用方法 二、实验内容
2、ADC芯片的编程与调试 把输入的电压值读入到A中去
-----------------------参考程序------------------- ;//定义ADC的连接端口 ad_cs equ P3.6 ad_wr equ P2.0 ad_rd equ P3.7
ad_input_port equ p1 ORG 0000h LJMP main org 0030h main:
LCALL adc_demo AJMP main
;// 启动AD转换 Adc_Start: CLR ad_cs NOP
CLR ad_wr NOP
SETB ad_wr NOP
SETB ad_cs NOP RET
Adc_Read: ;// 读AD转换 mov ad_input_port,#0ffh clr ad_cs nop
clr ad_rd nop nop
mov a,AD_INPUT_PORT nop
setb ad_rd nop
setb ad_cs ret
;// AD转换读取延时程序,显示读到的数值 Adc_Demo:
lcall Adc_Start lcall delay1ms lcall adc_read clr p2.0 clr p2.3 mov p0,a ret
delay1ms: mov r7,#10 tt1:
mov r6,#50
djnz r6,$ ;2us djnz r7,tt1 ret end
三、实验步骤
1.ADC0804硬件连接:
(1)数据线:用一根8PIN的数据排线, 一端插入ADC0804部分的数据输入端JP35, 另一端插入CPU部分JP44(P1口);
(2)控制线:用一个2PIN数据线插入CPU部分JP53(P3口)的P3.6,P3.7另一端插入ADC0804部分的输入端J3. 2.LED指示灯连接:
3用一根8PIN的数据排线,一端插入八路指示灯部分的JP32, 另一端插入CPU部分JP51(P0口) 3.编程及程序调试 4.观察及记录 (1)用一个小螺丝刀调整AD转换部分的ADJ3 可以看到P0口引出的8个LED逐次变化。
(2)用压,通过小螺丝刀调整出10种输入电压(用万用表测量),分别运行程序记录读入的数字量,并列表格,计算与理论分析的误差。
三、实验报告
1、根据10种输入电压及对应读入的数字量,列表格,计算与理论数字量之间的误差。
实验三(2) DA转换与拨码和指示灯综合实验
一、实验目的
1.学习接口芯片的扩展方法
2.掌握数字量模拟量接口芯片的应用方法 3.综合人机接口对模拟量输出的控制 4.示波器的使用 二、实验内容
2. 8路拨动开关一端接地,另外一端8路通过JP40引出。
3.参考程序
产生周期可以通过拨码值改变的方波(或另外的波形)
#include unsigned char led;
char code SST516[3] _at_ 0x003b; sbit cs1=P2^7; sbit wr1=P2^6;
/////////////////////////// //函数声明
void delay(unsigned char m); void DA(unsigned char d);
void main() { unsigned char pwm; pwm=0x0; while(1) { led=P3; //读取P3口的拨码开关值 P1=led; //仅对低位有效 delay(led); DA(pwm); pwm=~pwm;
}
}
void delay(unsigned char m) {
while(m--) {
unsigned char i=255; while(i--); } } //DA转换
void DA(unsigned char d) { wr1=1; cs1=0;
P0=d; wr1=0; wr1=0; wr1=0;
wr1=0; //后面几个用于延时
}
wr1=1; cs1=0;
三、实验步骤
1.拨码开关和指示灯的连接
把八路拨动开关的JP40用一条8PIN的数据排线引入到CPU的P3口JP53,然后用一条8PIN的数据排线把CPU部份的P1口(JP44)连接到八路指示灯部份的JP32。
2.DAC0832连接
(1) 用一个1PIN数据线一端插入CPU部分JP52(P2口)的P2.6,另外一端插入DAC0832部分的输入端JP24的WR端。
(2) 用一个1PIN数据线一端插入CPU部分JP52(P2口)的P2.7,另外一端插入DAC0832部分的输入端JP24的CS端。
(3) 用一根8PIN的数据排线, 一端插入DAC0832部分的数据输入端JP27, 另一端插入CPU部分JP51(P0口)
3.用一台示波器,在J2口观察DA转换后的输出信号。 建议调整到Y轴0.2V/格 X轴1MS/格
.
三、实验报告
1.记录二张不同拨码值时的示波器输出图
2.编写输出方波的高低电压分别为2.5V和0时的程序。
实验四 综合实验-步进电机
一、实验目的
1.学习步进电机的工作原理
2.掌握步进电机速度和位移的控制 二、实验内容
1.了解步进电机的工作原理和特性
(1)步进电机必须加驱动才可以运转, 驱动型号必须为脉冲信号,没有脉冲的时候, 步进
电机静止, 如果加入适当的脉冲信号, 就会以一定的角度(称为步角)转动。转动的速度和脉冲的频率成正比。
(2)本实验中步进电机的步进角度为7.5度,一圈360度, 需要48个脉冲完成。 (3)改变脉冲的顺序, 可以改变转动的方向。
2.硬件连线
(1)本套件采用的是12v步进电机,为了演示的方便, 实验套件为他提供了5v的电源,
此时转动力矩较小,读者也可自行把他应用为12v。
(2)该步进电机的耗电流为200ma左右, 采用 uln2003驱动,驱动端口为
p1.0,p1.1,p1.2,p1.3. 由于uln2003本身是一个反向器,因此在实际应用中我们在他前面设计了一个74ls14的反向器。使他最终的结果还是同相。
相关原理:
汇编语言参考程序: ORG 0080H
X1: MOV R3,#250 start: MOV R0,#00H start1:MOV P1,#0FFH MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR JZ START CPL A MOV P1,A LCALL DELAY INC R0
DJNZ R3, START1 MOV R3,#250
start2: MOV P1,#0FFH
MOV R0,#05
start3:MOV A,R0
MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START2 CPL A
MOV P1,A LCALL DELAY INC R0
DJNZ R3,START3 LJMP X1
DELAY: MOV R5,#40;延时。 D1: MOV R6,#10 D2: MOV R7,#18
DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET
TABLE:
DB 03h,09h,0ch,06h DB 00
DB 06h,0ch,09h,03h DB 00 end
c语言参考程序:
#include //头文件
#define uchar unsigned int //宏定义,为方便编程 #define uint unsigned int
#define MOTORSTEP P1 //宏定义,定义P1口为步进电机驱动端口 uchar code step[]={0x03,0x09,0x0c,0x06}; //步进电机驱动值数组 void delay() //步进电机每一步间延迟函数 {
uchar i=4000; while(i--); }
char code SST516[3] _at_ 0x003b; //仿真插入代码 main() //主函数 {
uchar i=0; while(1) {
for(i=0;i
MOTORSTEP=step[i]; //取值赋给P1驱动口 delay(); //延迟 } } }
三、实验报告
1.编写程序,使步进电机旋转一转后,回到原来的位置。 2.步进电机的速度如何进行调整
《单片微机原理及应用》
实验指导书
课程中文名称:单片微机原理及应用 课程代码:36607
课程英文名称: Principles and Applications of Micro-controller 课程性质:学科基础必修课
总学时:48学时(其中讲课36学时,实验12学时)
实验地点:15号楼202室
实验课时间:11月10日(第9、11、13、15周)
浙江理工大学 机控学院
概述
实验设备:深圳市学林电子有限公司XL600单片机实验仪
(http://www.51c51.com)
实验一 定时器、中断、IO口综合实验—LED灯闪烁实验
一、实验目的
熟悉MCS-51定时器、中断初始化编程方法; 了解定时器应用实时程序的设计与调试技巧; 二、实验内容
实现4个LED按一定规律闪烁 三、程序框图
四、实验步骤
1、 硬件连接:8PIN数据排线把CPU部份的P1口(JP44)连接到八路指示灯部份的
JP32。
2、 输入源程序,编译
3、 在中断入口矢量处设置断点,来观察中断时PC、堆栈指针SP的值。 4、 全速执行,观察LED灯的变化情况 五、实验报告
1、进入中断程序时,SP及(SP-1)两单元内的值代表什么? 2、上机实验程序。 汇编语言参考程序 ORG 0 LJMP STA ORG 000BH LJMP TIME0T ORG 0030H
STA: MOV SP,#70H
MOV TMOD,#01H LOOP: TIME0T: TT1: TT2: MOV TH0,#00H MOV TL0,#01H SETB EA SETB ET0 SETB TR0 MOV P1,#08H INC R1 LJMP LOOP MOV TH0,#00H MOV TL0,#01H MOV A,P1 JB ACC.0, TT1 RR A LJMP TT2 MOV A,#08H MOV P1,A RETI END
实验二 并口实验-数码管动态扫描显示
一、实验目的
1.学习并口的应用
2.掌握数码管动态扫描显示的硬件接线和编程方法 二、实验内容
1、硬件接线;
原理图:8个数码管(共阳)它的数据线并联接到JP5, 位控制由8个PNP型三级管驱动后由JP8引出。
(1) 接8位数码管的数据线:将数码管部份的数据口 JP5接到CPU部份的P0口JP51. (2) 接8位数码管的显示位线:将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.
0010 1000
2、编程与调试
数码管动态扫描显示01234567的参考程序
汇编语言参考程序: ORG 0000H AJMP MAIN ORG 0080H MAIN:
CLR P2.0 ;选中第一个数码管 MOV P0,#28H ;显示0 LCALL DELAY ; 调用延时 MOV P0,#0FFH ;关显示 SETB P2.0
CLR P2.1 ;选中第二个数码管 MOV P0,#7EH ;显示1 LCALL DELAY MOV P0,#0FFH SETB P2.1
CLR P2.2 ;选中第三个数码管 MOV P0,#0A2H ;显示2 LCALL DELAY MOV P0,#0FFH SETB P2.2
CLR P2.3 ;选中第四个数码管 MOV P0,#62H ;显示3 LCALL DELAY MOV P0,#0FFH SETB P2.3
CLR P2.4 ;选中第五个数码管 MOV P0,#74H ;显示4 LCALL DELAY MOV P0,#0FFH SETB P2.4
CLR P2.5 ;选中第六个数码管 MOV P0,#61H ; 显示5 LCALL DELAY MOV P0,#0FFH SETB P2.5
CLR P2.6 ;选中第七个数码管 MOV P0,#21H ; 显示6 LCALL DELAY MOV P0,#0FFH SETB P2.6
CLR P2.7 ;选中第八个数码管 MOV P0,#7AH ; 显示7 LCALL DELAY SETB P2.7 MOV P0,#0FFH AJMP MAIN ;重新开始 DELAY: ;延时子程序 MOV R7,#2 D1: MOV R6,#25 D2: DJNZ R6,D2 DJNZ R7,D1 RET END
c语言参考程序:
#include //头文件
#define uchar unsigned char //宏定义,为方便编程 #define uint unsigned int
#define DIGI P0 //宏定义,将P1口定义为数码管 #define SELECT P0 //宏定义,将P2定义为数码管选择口
uchar digivalue[]={0x28,0x7e,0x0a2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; //显示的数字数组,依次为0,1,..,9
uchar select[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //选择数码管数组,依次选择1,2,..,8
void delay() //延迟函数,决定数码管跳变的间隔时间 {
uchar ii=200; //若发现数码管闪烁,调节这里即可
while(ii--); }
char code SST516[3] _at_ 0x003b; //仿真器插入代码 main() //主函数 {
uchar i=0; while(1) {
for(i=0;i
SELECT=select[i]; //选择第i个数码管 DIGI=digivalue[i]; //显示i delay(); } } }
三、实验报告
1.如何使LED显示自己的学号?写出操作过程。
实验三(1) 模拟/数字转换器实验
一、实验目的
1.学习接口芯片的扩展方法
2.掌握模拟量数字量接口芯片的应用方法 二、实验内容
2、ADC芯片的编程与调试 把输入的电压值读入到A中去
-----------------------参考程序------------------- ;//定义ADC的连接端口 ad_cs equ P3.6 ad_wr equ P2.0 ad_rd equ P3.7
ad_input_port equ p1 ORG 0000h LJMP main org 0030h main:
LCALL adc_demo AJMP main
;// 启动AD转换 Adc_Start: CLR ad_cs NOP
CLR ad_wr NOP
SETB ad_wr NOP
SETB ad_cs NOP RET
Adc_Read: ;// 读AD转换 mov ad_input_port,#0ffh clr ad_cs nop
clr ad_rd nop nop
mov a,AD_INPUT_PORT nop
setb ad_rd nop
setb ad_cs ret
;// AD转换读取延时程序,显示读到的数值 Adc_Demo:
lcall Adc_Start lcall delay1ms lcall adc_read clr p2.0 clr p2.3 mov p0,a ret
delay1ms: mov r7,#10 tt1:
mov r6,#50
djnz r6,$ ;2us djnz r7,tt1 ret end
三、实验步骤
1.ADC0804硬件连接:
(1)数据线:用一根8PIN的数据排线, 一端插入ADC0804部分的数据输入端JP35, 另一端插入CPU部分JP44(P1口);
(2)控制线:用一个2PIN数据线插入CPU部分JP53(P3口)的P3.6,P3.7另一端插入ADC0804部分的输入端J3. 2.LED指示灯连接:
3用一根8PIN的数据排线,一端插入八路指示灯部分的JP32, 另一端插入CPU部分JP51(P0口) 3.编程及程序调试 4.观察及记录 (1)用一个小螺丝刀调整AD转换部分的ADJ3 可以看到P0口引出的8个LED逐次变化。
(2)用压,通过小螺丝刀调整出10种输入电压(用万用表测量),分别运行程序记录读入的数字量,并列表格,计算与理论分析的误差。
三、实验报告
1、根据10种输入电压及对应读入的数字量,列表格,计算与理论数字量之间的误差。
实验三(2) DA转换与拨码和指示灯综合实验
一、实验目的
1.学习接口芯片的扩展方法
2.掌握数字量模拟量接口芯片的应用方法 3.综合人机接口对模拟量输出的控制 4.示波器的使用 二、实验内容
2. 8路拨动开关一端接地,另外一端8路通过JP40引出。
3.参考程序
产生周期可以通过拨码值改变的方波(或另外的波形)
#include unsigned char led;
char code SST516[3] _at_ 0x003b; sbit cs1=P2^7; sbit wr1=P2^6;
/////////////////////////// //函数声明
void delay(unsigned char m); void DA(unsigned char d);
void main() { unsigned char pwm; pwm=0x0; while(1) { led=P3; //读取P3口的拨码开关值 P1=led; //仅对低位有效 delay(led); DA(pwm); pwm=~pwm;
}
}
void delay(unsigned char m) {
while(m--) {
unsigned char i=255; while(i--); } } //DA转换
void DA(unsigned char d) { wr1=1; cs1=0;
P0=d; wr1=0; wr1=0; wr1=0;
wr1=0; //后面几个用于延时
}
wr1=1; cs1=0;
三、实验步骤
1.拨码开关和指示灯的连接
把八路拨动开关的JP40用一条8PIN的数据排线引入到CPU的P3口JP53,然后用一条8PIN的数据排线把CPU部份的P1口(JP44)连接到八路指示灯部份的JP32。
2.DAC0832连接
(1) 用一个1PIN数据线一端插入CPU部分JP52(P2口)的P2.6,另外一端插入DAC0832部分的输入端JP24的WR端。
(2) 用一个1PIN数据线一端插入CPU部分JP52(P2口)的P2.7,另外一端插入DAC0832部分的输入端JP24的CS端。
(3) 用一根8PIN的数据排线, 一端插入DAC0832部分的数据输入端JP27, 另一端插入CPU部分JP51(P0口)
3.用一台示波器,在J2口观察DA转换后的输出信号。 建议调整到Y轴0.2V/格 X轴1MS/格
.
三、实验报告
1.记录二张不同拨码值时的示波器输出图
2.编写输出方波的高低电压分别为2.5V和0时的程序。
实验四 综合实验-步进电机
一、实验目的
1.学习步进电机的工作原理
2.掌握步进电机速度和位移的控制 二、实验内容
1.了解步进电机的工作原理和特性
(1)步进电机必须加驱动才可以运转, 驱动型号必须为脉冲信号,没有脉冲的时候, 步进
电机静止, 如果加入适当的脉冲信号, 就会以一定的角度(称为步角)转动。转动的速度和脉冲的频率成正比。
(2)本实验中步进电机的步进角度为7.5度,一圈360度, 需要48个脉冲完成。 (3)改变脉冲的顺序, 可以改变转动的方向。
2.硬件连线
(1)本套件采用的是12v步进电机,为了演示的方便, 实验套件为他提供了5v的电源,
此时转动力矩较小,读者也可自行把他应用为12v。
(2)该步进电机的耗电流为200ma左右, 采用 uln2003驱动,驱动端口为
p1.0,p1.1,p1.2,p1.3. 由于uln2003本身是一个反向器,因此在实际应用中我们在他前面设计了一个74ls14的反向器。使他最终的结果还是同相。
相关原理:
汇编语言参考程序: ORG 0080H
X1: MOV R3,#250 start: MOV R0,#00H start1:MOV P1,#0FFH MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR JZ START CPL A MOV P1,A LCALL DELAY INC R0
DJNZ R3, START1 MOV R3,#250
start2: MOV P1,#0FFH
MOV R0,#05
start3:MOV A,R0
MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START2 CPL A
MOV P1,A LCALL DELAY INC R0
DJNZ R3,START3 LJMP X1
DELAY: MOV R5,#40;延时。 D1: MOV R6,#10 D2: MOV R7,#18
DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET
TABLE:
DB 03h,09h,0ch,06h DB 00
DB 06h,0ch,09h,03h DB 00 end
c语言参考程序:
#include //头文件
#define uchar unsigned int //宏定义,为方便编程 #define uint unsigned int
#define MOTORSTEP P1 //宏定义,定义P1口为步进电机驱动端口 uchar code step[]={0x03,0x09,0x0c,0x06}; //步进电机驱动值数组 void delay() //步进电机每一步间延迟函数 {
uchar i=4000; while(i--); }
char code SST516[3] _at_ 0x003b; //仿真插入代码 main() //主函数 {
uchar i=0; while(1) {
for(i=0;i
MOTORSTEP=step[i]; //取值赋给P1驱动口 delay(); //延迟 } } }
三、实验报告
1.编写程序,使步进电机旋转一转后,回到原来的位置。 2.步进电机的速度如何进行调整