实验一 Keil C51集成开发环境的使用练习仿真与调试.docx
《实验一 Keil C51集成开发环境的使用练习仿真与调试.docx》由会员分享,可在线阅读,更多相关《实验一 Keil C51集成开发环境的使用练习仿真与调试.docx(22页珍藏版)》请在冰点文库上搜索。
实验一KeilC51集成开发环境的使用练习仿真与调试
实验一KeilC51集成开发环境的使用练习、仿真与调试
一、实验目的
1、熟悉KeilC51集成开发环境的使用方法
2、熟悉KeilC51集成开发环境调试功能的使用和DP-51PROC单片机综合仿真实验仪的使用。
二、实验设备及器件
IBMPC机一台
DP-51PROC单片机综合仿真实验仪一台
三、实验内容
1、进行KeilC51集成开发环境的安装和使用练习。
然后按照以下内容建立文件并编译产生HEX文件。
ORG0000H
LJMPMain
ORG00F0H
Main:
MOVR7,#0
Loop:
MOVR6,#0
DJNZR6,$
DJNZR6,$
DJNZR6,$
DJNZR6,$
DJNZR7,Loop
CPLP1.0;P1.0取反
CPLP1.1;P1.1取反
CPLP1.2;P1.2取反
CPLP1.3;P1.3取反
CPLP1.4;P1.4取反
CPLP1.5;P1.5取反
CPLP1.6;P1.6取反
CPLP1.7;P1.7取反
SJMPMain
;
END
2、进行KeilC51集成开发环境的仿真调试练习。
然后按照以下内容建立文件并编译仿真调试。
ORG8000H
LJMPMain
ORG80F0H
Main:
MOVR7,#0
Loop:
MOVR6,#0
DJNZR6,$
DJNZR6,$
DJNZR6,$
DJNZR6,$
DJNZR7,Loop
CPLP1.0;P1.0取反
CPLP1.1;P1.1取反
CPLP1.2;P1.2取反
CPLP1.3;P1.3取反
CPLP1.4;P1.4取反
CPLP1.5;P1.5取反
CPLP1.6;P1.6取反
CPLP1.7;P1.7取反
SJMPMain
END
四、实验要求
1、熟练掌握KeilC51集成开发环境的工程建立、编辑与编译功能。
2、熟练掌握结合DP-51PROC单片机综合仿真实验仪和KeilC51集成开发环境进行仿真调试。
五、实验步骤
(1)用40针排线把DP-51PROC实验仪上的A1区J76接口和A2区J79接口相连,然后使用排线把A2区的J61接口与D1区的J52接口相连。
如右图所示。
(2)对DP-51PROC实验仪上电,然后设置TKSMonitor5仿真器和使用软件DPFLASH把MON51监控程序下载到TKSMonitor5仿真器。
(3)关闭DPFLASH软件。
把TKSMonitor5仿真器的工作模式选择开关切换到RUN处,然后按一下复位键(RST),MON51程序就开始运行了。
此时,TKSMonitor5仿真器进入调试状态。
(4)用户使用KeilC51集成开发环境建立工程、编辑与编译“实验内容”所列的程序。
然后按照(软件调试环境的设置)设置好,然后在编译一次。
(5)此时用户就可以进行仿真调试。
如果用户在退出仿真调试模式后想再进入仿真调试,可以先按一下TKSMonitor5仿真器的复位键(RST)。
用户可以在仿真调试环境下设置断点,单步,全速运行等。
在调试过程中用户可以看见D1区LED的亮灭是由用户程序来控制的。
六、实验思考题
(1)试写一条把片内RAM50H~59H单元清零的程序。
(2)试写一条把片内RAM50H~59H单元写入01H的程序。
(3)如何仿真和调试C51程序呢?
(用户可以把上面的例子改为C51程序然后在编译调试)
实验二蜂鸣器驱动实验
一、实验目的
利用单片机的P1口作IO口,使用户学会蜂鸣器的使用。
二、实验设备及器件
IBMPC机一台
DP-51PROC单片机综合仿真实验仪一台
频率计一台
三、实验内容
1、编写一段程序,用P1.3口控制(输出3K到4K频率的方波),使B5区的蜂鸣器发出嘹亮的响声。
2、按照例程输入一段程序,用P1.3口控制,使B5区的蜂鸣器发出“生日快乐”的音乐。
四、实验步骤
1、使用导线把A2区的P13与B5区的BUZZ接线柱相连。
2、先编写一个延时程序(120`200us)。
3、再编写一个循环程序,改变P1.3脚的电平,然后延时。
这样,这个循环就使P1.3口输出一个频率为2.5KHZ-4KHZ的方波。
在DP-51PROC单片机综合仿真实验仪上运行该程序时,B5区的蜂鸣器将发出嘹亮的响声。
4、按以下例程序输入,然后运行,蜂鸣器发出“生日快乐”的音乐。
五、实验参考程序
ORG8000H
JMPMAIN
ORG800BH
JMPINTT0
ORG8100H
MAIN:
MOVSP,#60H
MOVTMOD,#01H;初始化定时器及其中断
SETBET0;开定时器0中断
SETBEA
SETBTR0;启动定时器0
START0:
SETBP1.3
MOV30H,#00H
NEXT:
MOVA,30H
MOVDPTR,#TABLE;从TABLE中读取数据--响声时间
MOVCA,@A+DPTR
MOVR2,A
JZENDD
ANLA,#0FH
MOVR5,A
MOVA,R2
SWAPA
ANLA,#0FH
JNZSING
CLRTR0
JMPD1
SING:
DECA
MOV22H,A
RLA
MOVDPTR,#TABLE1;从TABLE中读取数据—声调
MOVCA,@A+DPTR
MOVTH0,A
MOV21H,A
MOVA,22H
RLA
INCA
MOVCA,@A+DPTR
MOVTL0,A
MOV20H,A
SETBTR0
D1:
CALLDELAY;声音延时
INC30H
JMPNEXT
ENDD:
CLRTR0
JMPSTART0
INTT0:
;定时器0中断服务程序
PUSHPSW
PUSHACC
MOVTL0,20H
MOVTH0,21H
CPLP1.3
POPACC
POPPSW
RETI
DELAY:
;R5的值就是声响持续时间
MOVR7,#02
DELAY0:
MOVR4,#187
DELAY1:
MOVR3,#248
DJNZR3,$
DJNZR4,DELAY1
DJNZR7,DELAY0
DJNZR5,DELAY
RET
TABLE:
DB82H,01H,81H,94H,84H,0B4H,0A4H,04H
DB82H,01H,81H,94H,84H,0C4H,0B4H,04H
DB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
DB82H,01H,81H,94H,84H,0B4H,0A4H,04H
DB82H,01H,81H,94H,84H,0C4H,0B4H,04H
DB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00H
TABLE1:
DW64260,64400,64524,64580,64684,64777,64820,64898
DW64968,65030,65058,65110,65157,65178,65217
END
六、实验思考题
请用户思考,如何通过程序来编写出音乐。
实验三电子琴实验
一、实验目的
利用实验仪上提供的按键K1~K7作为电子琴按键,控制蜂鸣器发声,使用户了解计算机发声原理,熟悉定时器和键盘扫描电路的工作原理及编程方法。
二、实验设备及器件
IBMPC机一台
DP-51PROC单片机综合仿真实验仪一台
频率计一台
三、实验内容
1、编写一段程序,用P3.3口控制(输出7种音阶标称频率的方波),使B5区的蜂鸣器发出对应的音调。
2、按照歌曲的音调,使用D1区的按键K1~K7,弹奏一首简单的音乐。
四、实验步骤
1、用导线将A2区P3.3口(INT1)和B5区的BUZZ接口相连,然后将D1区的J53接口和A2区的J61接口一一对应相连。
如右图所示。
2、编写按键的动态键盘扫描程序,根据不同音阶的频率编写蜂鸣器的音调控制程序,然后完成电子琴的主程序设计。
3、调试编写好的程序,使用频率计校准音阶的频率,然后使用键盘演奏一段好听的音乐。
五、实验参考程序
BUZZEQUP3.3
ORG8000H
LJMPMAIN
ORG800BH
LJMPINT_T0
ORG8100H
MAIN:
MOVSP,#60H;初始化堆栈向量
MOV30H,#00;定时器初值清零
MOV31H,#00
MOVP1,#0FFH;设置P1口为输入模式
MOVTMOD,#01H;设置定时器0为工作模式1
SETBET0;开定时器0中断
SETBEA;开总中断
CLRTR0;关闭定时器0
START:
MOVR0,P1
CJNER0,#0FFH,KEY1;键盘扫描
CLRTR0
SJMPSTART
KEY1:
CJNER0,#0FEH,KEY2;K1键按下
MOV30H,#0FBH;设置音阶1
MOV31H,#0E9H
LJMPSET_TIMER
KEY2:
CJNER0,#0FDH,KEY3;K2键按下
MOV30H,#0FCH;设置音阶2
MOV31H,#5CH
LJMPSET_TIMER
KEY3:
CJNER0,#0FBH,KEY4;K3键按下
MOV30H,#0FCH;设置音阶3
MOV31H,#0C1H
LJMPSET_TIMER
KEY4:
CJNER0,#0F7H,KEY5;K4键按下
MOV30H,#0FCH;设置音阶4
MOV31H,#0EFH
LJMPSET_TIMER
KEY5:
CJNER0,#0EFH,KEY6;K5键按下
MOV30H,#0FDH;设置音阶5
MOV31H,#045H
LJMPSET_TIMER
KEY6:
CJNER0,#0DFH,KEY7;K6键按下
MOV30H,#0FDH;设置音阶6
MOV31H,#92H
LJMPSET_TIMER
KEY7:
CJNER0,#0BFH,NOKEY;K7键按下
MOV30H,#0FDH;设置音阶7
MOV31H,#0D6H
SET_TIMER:
SETBTR0;发声
SJMPSTART
NOKEY:
CLRTR0;无键按下
SJMPSTART
INT_T0:
;T0中断服务程序
MOVTH0,30H;定时器附初值
MOVTL0,31H
CPLBUZZ;输出方波
RETI
END
六、实验思考题
结合实验仪上的硬件,设计一个可以任意选曲播放的电子音乐盒。
实验四串转并的I/O口实验
一、实验目的
熟悉并掌握串转并的I/O口扩展方法。
二、实验设备及器件
IBMPC机一台
DP-51PROC单片机综合仿真实验仪一台
三、实验内容
1、写程序,通过单片机的P1口控制74HC164的输入端口,实现串并转换。
2、验证串并转换数据的正确性。
四、实验要求
熟悉串并转换芯片的工作原理,学会使用串并转换芯片扩展单片机的I/O口资源。
五、实验步骤
1、短接A5区JP10接口,将A5区的CLK164、DINA164、DINB164、CLR164与A2区的P10~013对应相连(CLK对P10等等)。
如下图所示。
2、运行编写好的软件程序,完成一次串并转换。
3、使用C2区的逻辑笔或D1区的LED指示灯测试并行输出数据Q0~Q7数据的正确性。
六、实验参考程序
CLKEQUP1.0
DINAEQUP1.1
DINBEQUP1.2
CLR164EQUP1.3
ORG8000H
LJMPMAIN
ORG8100H
MAIN:
MOVSP,#60H;设置堆栈向量
NOP;设置以下端口初始化
CLRCLK;CLK=0
SETBDINB;DINB=1
CLRCLR164;CLR=0输出端口清零
SETBCLR164;CLR=1
MOVA,#0AAH;用户输出数据初始化
MOVR4,#08H
SLCHG:
RLCA
MOVDINA,C;串行输出一位数据
SETBCLK;移位时钟
NOP
CLRCLK
NOP
DJNZR4,SLCHG
SJMP$;程序结束,完成一次串并转换
END
实验五定时器输出PWM实验
一、实验目的
利用定时器控制产生占空比可变的PWM波。
二、实验设备及器件
IBMPC机一台
DP-51PROC单片机综合仿真实验仪一台
频率计一台
三、实验内容
编写好一段程序,用P1.0口输出PWM波,用D1区的按键KEY1和KEY2实现占空比的增加和降低。
用示波器查看P1.0口的输出波形。
四、实验要求
学会事业能够单片机的定时器产生250HZ的PWM波。
五、实验步骤
1、用导线连接A2区的P11与D1区的KEY1。
2、用导线连接A2区的P12与D1区的KEY2。
3、将示波器的探针连接到A2区的P10。
4、用示波器观测P1.0口的PWM波形。
六、实验参考程序
PWMHDATA30H;高电平脉冲的个数
PWMDATA31H;PWM周期
COUNTERDATA32H
TEMPDATA33H
ORG8000H
AJMPMAIN
ORG800BH
AJMPINTT0
ORG8100H
MAIN:
MOVSP,#60H;给堆栈指针赋初值
MOVPWMH,#02H;
MOVCOUNTER,#01H
MOVPWM,#15H
MOVTMOD,#02H;定时器0在模式2下工作
MOVTL0,#38H;定时器每200us产生一次溢出
MOVTH0,#38H;自动重装的值
SETBET0;使能定时器0中断
SETBEA;使能总中断
SETBTR0;开始计时
KSCAN:
JNBP1.1,K1CHECK;扫描KEY1,
JNBP1.2,K2CHECK;扫描KEY2,如果按下KEY2,跳转到KEY2处理程序
SJMPKSCAN
K1CHECK:
JBP1.1,K1HANDLE;去抖动,如果按下KEY1,跳转到KEY1处理程序
SJMPK1CHECK
K1HANDLE:
MOVA,PWMH
CJNEA,PWM,K1H0;判断是否到达上边界
SJMPKSCAN;是,则不进行任何操作
K1H0:
MOVA,PWMH
INCA
CJNEA,PWM,K1H1;如果在加1后到达最大值
CLRTR0;定时器停止
SETBP1.0;P1.0为高电平
SJMPK1H2
K1H1:
CJNEA,#02H,K1H2;如果加1后到达下边界
SETBTR0;重开定时器
K1H2:
INCPWMH;增加占空比
SJMPKSCAN
K2CHECK:
JBP1.2,K2HANDLE;去抖动,如果按下KEY2,跳转到KEY2处理程序
SJMPK2CHECK
K2HANDLE:
MOVA,PWMH
CJNEA,#01H,K2H0;判断是否到达下边界
SJMPKSCAN;是,则不进行任何操作
K2H0:
MOVA,PWMH
MOVTEMP,PWM
DECA
CJNEA,#01H,K2H1;如果在减1后到达下边界
CLRTR0;定时器停止
CLRP1.0;P1.0为低电平
SJMPK2H2
K2H1:
DECTEMP
CJNEA,TEMP,K2H2;如果到达上边界
SETBTR0;启动定时器
K2H2:
DECPWMH;降低占空比
SJMPKSCAN
INTT0:
PUSHPSW;现场保护
PUSHACC
INCCOUNTER;计数值加1
MOVA,COUNTER
CJNEA,PWMH,INTT01;如果等于高电平脉冲数
CLRP1.0;P1.0变为低电平
INTT01:
CJNEA,PWM,INTT02;如果等于周期数
MOVCOUNTER,#01H;计数器复位
SETBP1.0;P1.0为高电平
INTT02:
POPACC;出栈
POPPSW
RETI
END
七、实验思考题
请用另一种方式实现定时器产生PWM波。
实验六万年历时钟实验
一、实验目的
进行一次实际开发的经验,提高实际开发的能力。
二、实验设备及器件
IBMPC机一台
DP-51PROC单片机综合仿真实验仪一台
三、实验内容
结合I2C总线控制的实时时钟、ZLG7290键盘LED控制器进行万年历时钟的设计。
四、实验要求
熟练掌握I2C总线的控制,灵活运用I2C主控器软件包,深刻理解实际实时时钟、ZLG7290键盘LED控制的各种功能,并能把它们相结合,组成具有实际功能的万年历时钟。
五、实验步骤
1、用导线连接D5区的SCL、SDA到A2区的P16、P17(SCL~P16、SDA~P17),连接D5区的RST-L、INT-KEY到A2区的P10、INT0(/RST~P10、INT-KEY~INT0),短接D5区的JP1跳线。
2、模拟I2C软件包“VIIC-C51.C”文件加入到KeilC51的项目中,开头包含“VIIC-C51.H”头文件。
修改VIIC-C51.C文件中的sbitSDA=P1^7;和sbitSCL=P1^6;。
另外还要增加ZLG7290软件包“ZLG7290.C”文件加入到KeilC51的项目中,开头包含“ZLG7290.H”头文件。
3、先编写显示的子函数,可以分别显示日期和显示时间。
用按键来切换显示的内容(初步设计用D5区的S1按键来切换)。
4、然后再进行整体编程,如果还有困难可以先画流程图,再编写程序。
5、显示结果为:
上电运行时,8位数码管显示时间,时分秒;按一下S1切换到显示年月日,再按一下S1又切换回时分秒。
六、实验预习要求
认真阅读PCF8563T、ZLG7290的数据手册和模拟I2C软件包使用手册,理解硬件结构,还可以先把程序编好,然后在KeilC51环境下进行软件仿真。
七、实验参考程序
#include"reg52.h"
#include"VIiC_C51.H"//包含VI2C软件包
#include"zlg7290.h"
#definePCF85630xA2//定义器件地址
#defineWRADDR0x00//定义写单元首地址
#defineRDADDR0x02//定义读单元首地址
sbitKEY_INT=P3^2;
sbitRST=P1^0;
unsignedchardisp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存
unsignedcharKEY;//保存键值
bitswich_date=0;
unsignedchardisplay_time(unsignedchar*sd)
{
sd[0]=sd[0]&0x7f;//秒屏蔽保留位
sd[1]=sd[1]&0x7f;//分屏蔽保留位
sd[2]=sd[2]&0x3f;//时屏蔽保留位
disp_buf[0]=(sd[0]%16);
disp_buf[1]=(sd[0]/16);
disp_buf[2]=31;
disp_buf[3]=(sd[1]%16);
disp_buf[4]=(sd[1]/16);
disp_buf[5]=31;
disp_buf[6]=(sd[2]%16);
disp_buf[7]=(sd[2]/16);
ZLG7290_SendBuf(disp_buf,8);
return0;
}
unsignedchardisplay_date(unsignedchar*sd)
{
sd[0]=sd[0]&0x3f;//日屏蔽保留位
sd[2]=sd[2]&0x1f;//月屏蔽保留位
disp_buf[0]=(sd[0]%16);
disp_buf[1]=(sd[0]/16);
disp_buf[2]=(sd[2]%16)+0x80;//后面加小数点
disp_buf[3]=(sd[2]/16);
disp_buf[4]=(sd[3]%16)+0x80;//后面加小数点
disp_buf[5]=(sd[3]/16);
disp_buf[6]=0;
disp_buf[7]=2;
ZLG7290_SendBuf(disp_buf,8);
return0;
}
unsignedcharDelayNS(unsignedcharno)
{
unsignedchari,j;