51单片机基础综合实验板_实验指导书ok(C和汇编程序综合版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MCS-51
单片机基础合实验板实验指导书
李家庆
2009年11月
目录
第1章实验箱功能简介
1.1 实验箱外观 (1)
1.2 实验箱配置 (2)
1.3 仿真下载使用说明 (3)
1.4 电路图 (4)
第2章实验箱使用快速入门
2.1 KEIL C51 简介 (5)
2.2 uVision使用入门 (5)
2.3 实验箱的仿真 (10)
2.4 实验箱的下载 (13)
第3章单片机实验
3.1 基本实验 (23)
实验一熟悉Keil C51开发环境 (23)
实验二熟悉实验箱的仿真与下载 (26)
实验三 I/O口延时实现流水灯 (27)
实验四蜂鸣器驱动实验 (29)
实验五定时器中断实验 (32)
实验六外部中断实验 (33)
实验七数码管显示123456 (34)
实验八 8155扩展实验 (35)
实验九 ADC0809实验 (37)
实验十 DAC0832实验 (41)
实验十一串口通信实验 (42)
3.2 高级实验 (51)
实验十二 100位计数器实验 (51)
实验十三矩阵键盘实验 (53)
实验十四实时时钟实验 (56)
实验十五数字温度计实验 (64)
实验十六 I2C总线实验 (68)
实验十七单片机实钟实验 (74)
注:实验书只是提供了部分参考实验,供用户初次使用时熟悉各模块电路,更多实验源代码详见光盘,另外,您也可根据自己的思路编写各种各样的实验代码,均可以非常方便的在此实验箱上运行。
其它相关资料,请参考光盘
第1章 实验板功能简介
1.1 单片机实验板概览
实物图如图1.1所示:
1.2 实验箱配置 基础板配置:
1、STC89C51支持在线下载程序。
.
2、8位LED 发光二极管(可做流水灯实验)。
3、4位数码管(可做动态扫描及静态显示实验)。
图1.1 单片机实验板实物图 8155 8LED 数码管 外扩256 DA0832 AD0809 单片机 IIC IIC Beep 矩阵 键盘
下载 图1.2 单片机实验板功能组成
4、4 *4矩阵键盘。
(也可将其中的行或列接地,将独立按键实验)。
5、MAX232芯片RS232通讯接口(可以做为与计算机通迅的接口,同时也可
做为STC单片机下载程序的接口,SST单片机仿真接口)
6、USB供电系统,直接插接到电脑USB口即可提供电源,此时不需另接直流
电源。
7、蜂鸣器(可做单片机发声实验)。
8、ADC0809芯片(可做模数转换实验)。
9、DAC0832芯片(可做数模转换实验)。
10、DS18B20温度传感器接口
11、单片机32个IO口全部引出,方便自己进行自由扩展。
12、AT24C02 EEROM(可做IIC串行总线实验)。
13.DS1302实时时钟(可做IIC串行总线实验)。
14、SM0038一体化红外接收头(可做红外遥控器解码实验)。
15、8155电路,可做扩展I/O口使用。
16、外扩32K RAM 62256芯片电路。
17、1602液晶接口。
仿真配置:
可选配SST89E516仿真芯片,代替STC89C51,实现在线仿真功能。
1.3仿真下载使用说明
单片机综合创新实验板的单片机仿真与下载分成由不同的单片机完成。
仿真由单片机SST89E516芯片来完成仿真,具体的仿真电路就是相关串口通讯电路,仿真的实现可见第二章相关内容。
单片机的下载由基础板的单片机STC89C51完成。
两种单片机引脚完全相同,直接代换。
32个IO都由排针引出,方便用户做不同的实验。
1.4电路图
第2单实验箱使用快速入门
2.1 KEIL C51 简介
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
2.2 uVision 使用入门
KEIL是51单片机开发的最常见的开发软件。
成功安装好KEIL软件后,即可看到电脑桌面上Keil软件图标,如图2.1。
图2.1
1.双击图标,打开软件,出现如下界面。
在打开的窗口中,选择“Project”
菜单:
图2.2
2.点击“New Project”出现一个创建工程对话框,选择工程所建路径,并输
入工程的文件名(建议用英文),点击“保存”:
图2.3
3.之后出现芯片选择界面,如下图:
图2.4
4.这里,选取常用51芯片即可,选择“Philips”下的“8Xc51RC+”芯片:
图2.5
5.点击“确定”,在出现如下对话框时,选择“否”:
图2.6
6.至此,已成功建立工程。
界面如下图所示:
图2.7
7.点击“Project”菜单下面的“options for Target‘Target 1’”选项,出现如下选项框:
图2.8
8.选择“output”页面,选中“create Hex File”,并可在“Name of Executable:”输入框中,重新输入生成HEX文件的文件名,然后点“确定”,以在程序编译时,实时生成需下载到单片机中的HEX文件。
图2.9
9.点击“File”菜单下面的“New”选项,再点击“File”菜单下面的“Save”选项,保存文件。
输入文件名(C文件扩展名为“.c”,汇编文件扩展名为“.asm”),如下图:取名为main.c:
图2.10
10.在新建的文件里,进行程序编制,如图:
图2.11
11.程序编制完成后,保存文件。
将源程序文件加载到工程中。
加载方法为:右击“Source Group”,在出现的选项列表中,选择“Add Files to Group ‘source Group 1’”,如下图所示:
图2.12
12.在出现的对话框中,选择刚编辑的源文件(main.c),点击“Add”,如图:
图2.13
13.添加成功后,点击“Project”菜单下面的“Rebuild all target files”
选项。
当编译通过之后HEX文件才能生成,如下图。
如果程序有错误,编译结果框中会有提示错误。
双击对应的错误列表,可定位到源程序的位置,以便快速寻找错误。
图2.14
2.3 实验箱的仿真
SST89E516RD是8位集成存储器的51系列兼容单片机,和51系列单片机软件兼容、开发工具兼容、管脚也兼容。
SST89E516RD片内有两块SuperFlash EEPROM,分为64K主块(Block0)和8K 次块(Block1)。
Block0的地址范围是0000h~ffffh;Block1的地址范围是10000h~11fffh。
做仿真器时Block1存储区烧写SoftICE仿真监控程序。
SST89E516RD具有在应用可编程(IAP)和在系统可编程(ISP)的功能,其中IAP是通过串口实现的。
仿真器就是利用了SST89E516RD的IAP功能。
由于SST89E516RD具有两块独立的SuperFlash程序存储区,当监控程序在Block1存储区中运行时可以改写Block0程序存储区中的程序,这就是仿真器的基本特性。
SL-51HP实验箱仿真板中的仿真芯片SST89E516RD在出厂前已烧有监控程序,因为直接仿真即可.
仿真步骤为:
1.设置KEIL C51的DEBUG 调试参数环境。
使用KEIL C51打开你的Project 用户程序更改调试仿真选项。
见图
2.15:
图2.15 Options for Target ‘Target 1’
2.在Debug选择中,选择为“KEIL MONITOR-51”的硬件仿真。
见图2.16所示。
图2.16 硬件仿真功能设置
3.设置仿真的通讯参数点击SETTING按钮去掉CACHE选项。
见图2.17。
4.打下“仿真板电源”,仿真调试按
DEBUG —START/STOP DEBUGSESSION 按钮。
见图2.18所示。
5.进入调试的仿真画面,并进行单步、连续、断点调试。
见图2.19所示。
6.仿真实例:
功能:I/O 口控制8位LED ,实现流水灯控制。
编成后通过SST 单片机的试验程序来验证其来运用SST 的Soft-ICE 在线仿真仿真功能。
建立工程,输入以下程序代码: #include "reg51.h" #include "intrins.h"
图2.17 参数通讯设定
图2.18 点击开始进行硬件仿真
图2.19 单步、连续、断点调试
#define uchar unsigned char
#define uint unsigned int
/****延时程序由Delay 参数确定延迟时间****/
void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<50;i++)
{;}
}
}
void main()
{ unsigned char OutData=0xfe;
while(1)
{
P0=OutData;
OutData=_crol_(OutData,1); //循环左移函数
mDelay(1000); /*延时1000 毫秒*/
} }
配置好相关选项,打开仿真板电源(仿真板红色指示灯旁边),直接点击DEBUG—START/STOP DEBUGSESSION按钮,环境界面自动跳到图2.19所视界面,使用全部运行或者单片调试均达到了流水灯的效果。
调试成功!
2.4 实验箱的下载
实验箱的下载主要是指将工程生成的HEX文件下载到基础板单片机STC89C51的过程。
安装光盘中的STC-ISP软件。
具体步骤如下:
1.双击STC-ISP图标:
图2.30
2.然后在“MCU Type”列表中选择单片机型号(应选择单片机板中的CPU 型号),如下图:
图2.31
3.点击“Open File”按钮,找到所要下载的HEX文件,并选中,选择“打开”,如下图:
图2.32
4.选择串口的对应端口号,(根据自己的硬件连接端口)(如COM1)。
图2.33
5.然后选“MaxBuad”中的波特率,也可以选默认值。
图2.34
6.点击”Download/下载”,然后打开基础板电源(基础板绿色指示灯旁边的白色按键),如图:
图2.35
7.稍等几秒,即可下载完成,如图:
图2.36
第3章单片机实验
3.1 基本实验
实验一熟悉Keil C51开发环境
1.实验目的
掌握keil的基本操作
2.实验设备及器件
PC机一台;实验箱一台
Keil c软件
3.实验内容
以一个简单的加减法程序来练习keil软件的应用以及相关调试方法。
4.实验步骤
①首先打开Keil uVision2。
新建一个工程文件(假设该工程名为add,存储在桌面上)如下图所示。
点击“Project->New Project...”出现一个对话框,要求给新建立的工程起一个文件名,输入add(不需要扩展名),点击保存出现下一个对话,如图 3.1所示,这个对话框要求选择目标CPU(即你所用芯片的型号),我们选择Atmel 公司的89S52芯片,
点击Atmel前面的“+号”展开,选定其中的AT89S52并确定,回到主界面。
至此我们就完成工程项目的建立。
②源文件的建立:使用菜单“File->New”或者点击工具栏的新建文件即可在项目窗口的右侧打开一个新的文本编辑窗口,在该窗口中输入“加减法指令”
以扩展名asm或a51保存该文件。
③添加文件到项目中去。
如图3.2所示鼠标右键点击“File”窗口的“Source Group 1”,选择“Add Files To Group‘Source Group 1’”出现一个对话框,在工程目录下添加“.asm”文件。
图 3.2 添加文件
④点击“Project->Options For Target’Target 1’”出现如图3.3所示对话框,在“Outout”栏下选中“Create HEX Fi”复选框,其功能用于生成可执行代码文件(可以用汇编器写入单片机芯片的HEX格式文件,文件的扩展名为.HEX),默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项,这一点是初学者容易疏忽的,在此特别提醒注意。
⑤编译、连接。
在设置好工程后,即可进行编译、连接。
选择菜单“Project->Build Target”,对当前工程进行连接,如果当前文件已修改,软件会先对该文件进行编译,然后再连接以产生目标代码;如果选择“Rebuild All Target Files”将会对当前工程中的所有文件重新进行编译然后再连接,确保最终产生的目标代码是最新的,而“Translate...”项则仅对该文件进行编译,不进行连接。
以上操作也可以通过工具栏按钮直接进行,图3.4是有关编译、设置的工具栏按钮,从左到右分别是:编译、编译连接、全部重建、停止编译和对工程进行设置。
图 3.4 有关编译、连接、项目设置的工具条
编译过程中的信息将出现在输出窗口中的Build页中,如果源程序中有语法错误,会有错误报告出现,双击该行,可以定位到出错的位置,对源程序反复修改后,最终会得到图3.5所示的结果,提示获得了名为“12.HEX”的文件,该文件即可被编程器读入并写到芯片中,同时还产生了一些其他相关的文件,可被用于Keil
更多关于Keil C51开发环境的设置请详见第二章。
5.参考例程
ORG 0000H
AJMP main
RG 0030H
main: MOV R0,#05H ;将立即数25送寄存器R0
MOV A,#06H ;将立即数36送累加器A
ADD A,R0 ;将R0与A的内容相加,结果在A
NOP ;空操作
MOV p1,A ;将累加器A的值送P1口
LJMP $
END
C实验:
Keil操作步骤与上述汇编过程基本相同,只是操作③(以扩展名asm或a51保存该文件),要改成以扩展名.C保存!
#include "reg51.h"
sbit P1_0=P1^0; //定义P2.0
void main()
{ P1_0=0;
P1_0=1;
}
注意:
⏹一定要单步运行该C程序!(或在P1_0=0处设置断点)
⏹同时可把P10口连接到LED指示灯上(J6-1)。
实验二熟悉实验箱的仿真与下载
1.实验目的
熟悉Keil C51开发环境的调试及实验箱的仿真与下载方法。
2.实验设备及器件
PC机一台
SL-51HP单片机综合创新实验箱一台
杜邦线一根
3.实验内容
按照本书第2章2.4与2.5节内容进行实验箱的仿真及下载练习。
4.实验步骤
将单片机P1.0口用杜邦线连接到一位指示灯上,单步运行程序,观察运行结果。
5.参考例程
按照以下内容建立工程并编译仿真调试和下载脱机运行。
ORG 0000H
LJMP Main
ORG 00F0H
Main:
CLR P1.0
NOP
NOP
NOP
SETB P1.0
SJMP $
END
C实验:可全速运行程序,如单步调试适合设置断点;
/*单灯闪烁程序
*************************************************/
#include <REGX52.H>
sbit P2_0=P2^0; //定义P2.0
/*****延时程序由Delay 参数确定延迟时间*****/
void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
void main()
{ while(1)
{ P2_0=!P2_0; //取反P2.0 引脚mDelay(1000);
}
}
实验三 I/O口延时实现流水灯
1.实验目的
利用单片机的P2口作为I/O口,使用户学会利用P1口作为输入和输出口。
2.实验设备及器件
PC机一台
SL-51HP单片机综合创新实验箱一台
8孔排线一根
3.实验内容
编写一段程序,用P2口作为控制端口,使D1~D8的8位指示灯如流水灯般点亮。
4.实验步骤
①用排线将P2口与基本板的LED输入端J6相连,如原理图3.6所示。
②先编写一个延时程序。
③将LED流水灯的程序编写完整并调试运行。
④仿真的方法连续运行程序,查看运行结果。
5.参考例程
ORG 0000H
LJMP START
ORG 0030H
START:MOV R1,#00H
DJNZ R1,$
MOV SP,#60H
LOOP:MOV A,#0FEH
LOOP_1:MOV P2,A
CALL DELAY
RL A
CJNE A,#7FH,LOOP_1 ;0111 1111
LOOP_2: MOV P2,A
CALL DELAY
RR A
CJNE A,#0FEH,LOOP_2 ; 1111 1110
SJMP LOOP
DELAY: MOV R0,#00H
L1: MOV R1,#00H
L2: DJNZ R1,L2 DJNZ R0,L1 RET
END
(C实验源码1)
#include"reg52.h"
void delay(int x); main()
{
while(1)
{
P2=0xff;
delay(200);
P2=0x7f;
delay(200);
P2=0xbf;
delay(200);
P2=0xdf;
delay(200);
P2=0xef;
delay(200);
P2=0xf7;
delay(200);
P2=0xfb;
delay(200);
P2=0xfd;
delay(200);
P2=0xfe;
delay(200);
}
}
void delay(int x)
{
int a,b;
for(a=0;a<=x;a++)
for(b=0;b<200;b++);
}
(C实验源码2)
/******流水灯程序**************/
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
/****延时程序由Delay 参数确定延迟时间****/ void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<50;i++)
{;}
}
}
void main()
{ unsigned char OutData=0xfe;
while(1)
{
P0=OutData;
OutData=_crol_(OutData,1); //循环左移函数mDelay(1000); /*延时1000 毫秒*/
}
}
(C实验源码3)
/*****键控流水灯的程序*******/
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
void mDelay(unsigned int DelayTime)
{ unsigned int j=0;
for(;DelayTime>0;DelayTime--)
{ for(j=0;j<125;j++)
{;} }}
uchar Key()
{ uchar KeyV;
uchar tmp;
P3=P3|0x3c; //四个按键所接位置
KeyV=P3;
if((KeyV|0xc3)==0xff) //无键按下
return(0);
mDelay(10); //延时,去键抖
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
else
{ for(;;){ tmp=P3;
if((tmp|0xc3)==0xff)
break;}
return(KeyV);}}
void main()
{ unsigned char OutData=0xfe; bit UpDown=0;
bit Start=0;
uchar KValue;
for(;;)
{ KValue=Key();
switch (KValue)
{ case 0xfb: //P3.2=0,Start
{ Start=1;
break; }
case 0xf7: //P3.3=0,Stop
{ Start=0;
break; }
case 0xef: //P3.4=0 Up
{ UpDown=1;
break; }
case 0xdf: //P3.5=0 Down
{ UpDown=0;
break; }
}
if(Start)
{ if(UpDown)
OutData=_crol_(OutData,1);
else
OutData=_cror_(OutData,1);
P0=OutData;
}
else
P0=0xff; //否则灯全灭
mDelay(1000);
}
}
实验四 蜂鸣器驱动实验
1.实验目的
利用单片机的P3口作为I/O 口,使用户学会蜂鸣器的使用. 2.实验设备及器件
PC 机 一台 SL-51HP 单片机综合创新实验箱 一台 杜邦线 一根 3.实验内容
① 编写一段程序,用P3.2口控制,使蜂鸣器发出嘹亮的响声。
蜂鸣器原理图如图3.7所示。
② 按照例程输入一段程序,用P3.2口控制,使蜂鸣器发出“生日快乐”的音乐。
4.实验步骤
① 使用导线把蜂鸣器J12的1与P3.2口相连。
② 先编写一个延时程序。
③ 再编写一个循环程序,改变P3.2口的电平,然后延时。
④ 按以下例程输入,然后运行,蜂鸣器发出“生日快乐”的音乐。
MICROPHONE1
CON3J12
图3.7 蜂鸣器电路图
5.参考例程
ORG 0000H AJMP MAIN ORG 000BH JMP TIM0 ORG 0030H
MAIN:MOV TMOD,#01H ;设定时方式 MOV IE,#82H ;开中断 START0:MOV 30H,#00H ; NEXT:MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;查表取音调和节拍 MOV R2,A
JZ END0 ;为零,不进行处理.
ANL A,#0FH
MOV R5,A ;将节拍存入R5
MOV A,R2
SWAP A
ANL A,#0FH
JNZ SING ;根据音调决定是否演奏.
CLR TR0
JMP D1
SING:DEC A
MOV 22H,A ;将音调存入22H.
RL A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;根据音调决定定时器初值.
MOV TH0,A ;放入TH0
MOV 21H,A
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A ;放入TL0
MOV 20H,A
SETB TR0 ;启动定时
D1:CALL DELAY
INC 30H
JMP NEXT
END0:CLR TR0
JMP START0
;定时器中断服务程序
TIM0:PUSH ACC
PUSH PSW
MOV TL0,20H ;重赋初值.
MOV TH0,21H
CPL P3.2
POP PSW
POP ACC
RETI
DELAY:MOV R7,#02H ;延时子程序
D2:MOV R4,#187
D3:MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
;决定音调的定时初值.
TABLE1:DW 64260,64400,64524,64580
DW 64684,64777,64820,64898
DW 64968,65030,65058,65110
DW 65157,65178,65217
;决定音调和节拍的表格,不同的歌曲只是此表不同
TABLE:DB 82H,01H,81H,94H,84H,0B4H,0A4h,04H,
DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H ;1 DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H ;2 DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H
DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H ;3 DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H ;4 END
C 源码实验:
3.实验内容
①编写一段程序,用P1.0口控制,使蜂鸣器发出嘟嘟的响声。
4.实验步骤
①使用导线把蜂鸣器J12的1与P1.0口相连。
②编写程序。
仿真程序并运行查看结果。
5.参考例程
#include"reg52.h"
void delay(int x);
sbit Beep=P1^0;
main()
{
while(1)
{
Beep=!Beep;
delay(200);
}
}
void delay(int x)
{
int b,a;
for(b=0;b<x;b++)
for(a=0;a<200;a++);
}
实验五定时器中断实验
1.实验目的
利用单片机内部的定时器计时,用中断方式来控制LED单灯闪烁。
2.实验设备及器件
PC机一台
SL-51HP单片机综合创新实验箱一台
杜邦线一根
3.实验内容
编写一段程序,用P1.0口作为控制端口,利用定时器一个LED周期性点亮。
4.实验步骤
①用导线将P1.0口与基础板的LED输入端J6的任意端相连。
②先编写一个延时程序。
③将程序编写完整并调试运行。
5.参考程序
ORG 0000H
AJMP START
ORG 000BH ;定时器0的中断向量地址
AJMP TIME0 ;跳转到真正的定时器程序处
ORG 0030H
START:MOV P1,#0FFH ;关所灯
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
MOV TH0,#00H
MOV TL0,#0A0H ;即数5536
SETB EA ;开总中断允许
SETB ET0 ;开定时/计数器0允许
SETB TR0 ;定时/计数器0开始运行
LOOP:AJMP LOOP ;真正工作时,这里可写任意程序
;定时器0的中断处理程序
TIME0:PUSH ACC
PUSH PSW ;将PSW和ACC推入堆栈保护
CPL P1.0
MOV TH0,#00H
MOV TL0,#0A0H ;重置定时常数
POP PSW
POP ACC
RETI
END
C 程序实验
#include"reg52.h"
sbit LED=P1^0;
unsigned char i=0; //要定义为全局变量void timer0() interrupt 1
{
i+=1;
TH0=0x15;
TL0=0xa0;
if(i==10)
{ i=0;
LED=!LED;
}
}
void main()
{
P0=0xff;
TMOD=0x01;
TH0=0x15;
TL0=0xa0; //请您计算定时时间是多少?
TR0=1;
ET0=1;
EA=1;
while(1)
{;}
}
实验六外部中断实验
1.实验目的
利用单片机外部中断0来控制LED单灯闪烁。
2.实验设备及器件
PC机一台
SL-51HP单片机综合创新实验箱一台
杜邦线两根
3.实验内容
编写一段程序,用P3.2口作为外部中断控制端口,按键控制指示灯的亮来。
4.实验步骤
①用导线将矩阵键盘的J9-H1接地(此时,相当于把矩阵键盘作独立按键
用);再用导线将P3.2口与矩阵键盘的J9-L相连。
②用导线将P1.0口与基础板的LED输入端J6的任意端相连。
③编写程序实现按键切换指示灯的亮来。
④将程序编写完整并调试运行。
5.参考程序
ORG 0000H
AJMP START
ORG 0003H ;中断0的中断向量地址
AJMP INT00 ;跳转到真正的外部中断程序处
ORG 30H
START:SETB IT0
SETB EX0
SETB EA
LOOP:AJMP LOOP
;外部中断0的中断处理程序
INT00: CPL P1.0
RETI
END
实验七数码管显示1234
1.实验目的
掌握七段LED显示器的两种显示方式,使用户学会如何编程使其点亮。
2.实验设备及器件
PC机一台
SL-51HP单片机综合创新实验箱一台
8孔排线两根
杜邦线六根
3.实验内容
编写一段程序,用P0口输出段码,P2口控制位选,使数码管依次显示1234。
4.实验步骤
①使用排线将P0口和数码管的段码驱动输入J7相连,并将P2口和位选
控制J8相连。
②先编写一个延时程序。
③将数码管显示的程序编写完整并调试运行。
5.实验参考程序
(一、显示1234,ASM源码)
ORG 0000H
SJMP DPLOP
ORG 0030H
DPLOP:MOV A,#01 ;显示数字1
MOV R0,#7FH
MOV R1,A
MOV DPTR,#TAB ;送数据表首地址
DPLOP1:MOV A,R1
MOVC A,@A+DPTR
MOV P0,A ;显示段码送P0口
MOV A,R0
MOV P2,A
ACALL DELAY ;调用显示延时
INC R1
MOV A,R0
RR A
MOV R0,A
CJNE A,#7FH,DPLOP1 ;判8位数字显示完?
(如果要判4位显示完,此语句如何写?)AJMP DPLOP ;显示完转DPLOP
DELAY:MOV R2,#50
D0:MOV R3,#9
D1:DJNZ R3,D1
DJNZ R2,D0
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
(二、显示1234,C源码)
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define shu P0
#define wei P2
uchar code segtab[11]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
void d_1ms(void)
{
uint i;
for(i=0;i<100;i++);
}
void main(void)
{
uchar i;
while(1)
{
for(i=0;i<4;i++)
{
P0|=0xff;
P0=segtab[i];
switch(i)
{
case 0: P2=0xf1; break;
case 1: P2=0xf2; break;
case 2: P2=0xf4; break;
case 3: P2=0xf8; break;
}
d_1ms();
}
}
}
实验八 8155扩展实验
1.实验目的
学会如何利用使用8155扩展IO
2.实验设备及器件
PC机一台
SL-51HP单片机综合创新实验箱一台
8孔排线两根
杜邦线若干根
3.实验内容
使用8155扩展IO,实现流水灯
4.实验步骤
①用排线分别将8155PB口(基础板J29)和LED接口(基础板J6)连接。
用
杜邦线将基础板J31的CE和P2.7连接,J33的IO/M和P2.6连接,R和W分别连接单片机P37和P36。
8155接口图见图3.8所示。
J34和J36用跳线帽短接。
②编写程序,在集成开发环境上检查错误并改正。
③下载程序并运行查看结果。
.
. Array 9
.
.
图3.8 8155硬件接口图
5.参考例程
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R0,#10 ;等待10毫秒,使8155复位完毕
MAIN1: LCALL D1MS
DJNZ R0,MAIN1
MOV SP,#60H
MOV A,#01H
MOV DPTR,#7F00H
MOVX @DPTR,A
MOV A,#0FEH
MOV DPTR,#7F01H
LOOP: MOVX @DPTR,A
ACALL DELAY
ACALL DELAY
RL A
SJMP LOOP
D1MS: MOV R6,#5
D1:MOV R7,#0FFH
JNZ R7,$
DJNZ R6,D1
RET
DELAY: MOV R0,#0FFH
L1: MOV R1,#0FFH
L2: DJNZ R1,L2
DJNZ R0,L1
RET
END
C实验源码
3.实验内容
使用8155扩展IO,实现流水灯。
4.实验步骤
①短接8155区J34端,8155 PB口和8路灯相连;8155位选CE接P10,R和
W分别连接单片机RD 和WD
②J33的右侧两针用跳线帽相连可J33中间一根线接P11。
③运行编写好的软件程序,仿真观看运行结果。
5.参考例程
#include <reg52.h>
#include<ABSACC.H>
//用8155扩展芯片实现流水灯
#define AdressCON XBYTE[0x7E00] /*控制字地址*/
#define AdressPA XBYTE[0x7E01] /*PA口地址*/
#define AdressPB XBYTE[0x7E02] /*PA口地址*/
sbit CE8155 = P1^0;
sbit IOM8155 = P1^1;
sbit WR8155 = P1^2;
sbit RD8155 = P1^3;
void delay();
//写初始化
void inital()
{
CE8155 = 0;
IOM8155 = 1;
}
void main()
{
unsigned char flag,Value=0x01; inital();
while(1)
{
AdressCON=0x03;
do
{
flag=AdressCON;
flag&=0x01;
}
while(flag==0);
AdressPB=~Value;
Value<<=1;
if(Value==0x00)
Value=0x01;
delay();
}
}
void delay()
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<200;j++);
}
实验九 ADC0809实验
1.实验目的
掌握A/D芯片ADC0809与单片机的接口方法及ADC0809芯片性能;了解单片机实现数据采集的方法。
2.实验设备及器件
PC机一台
SL-51HP单片机综合创新实验箱一台
8孔排线两根
杜邦线若干根
3.ADC0809简介
IN7~IN0:8路模拟量输入端,在多路开关控制下,任一时刻只能有一路模拟量实现A/D转换。
A、B、C:多路开关地址选择输入端,当取值000~111时与A/D转换对应的通道为IN0~IN7。
ALE:地址锁存输入线,该信号的上升沿可将地址选择信号A、B、C锁入地址寄存器。
START:启动转换输入线,其上升沿用以清除A/D内部寄存器,其下降沿用以启动内部控制逻辑,开始A/D转换工作。
EOC:转换完毕输出线,其上出现高电平时表示A/D转换结束。
2-1~2-8(D7~D0):为8位数据输出端,可直接接入单片机的数据总线。
ENABLE:允许输出控制端,高电平有效。
低电平时,数据输出端为高阻态;高电平时,将A/D转换后的8位数据送出。
CLOCK:转换定时脉冲输入端。
它的频率决定了A/D转换器的转换速度。
使用频率小于等于640KHZ,对应转换速度大于等于100μs。
REF+,REF-:是内部D/A转换器的参考电压输入端。
VCC为+5V,GND为地。
图3.9 ADC0809引脚图
图3.10
4.实验内容
编写一段程序,通过ADC0809实现单片机对模拟输入通道电压的采集,使采集到的数据显示在数码管上。
参考流程图如图3.11所示。
图3.11 流程图
4.实验步骤
①使用导线将P2.7与基础板J11中的CS端相连, P3.6(WR)与基础板J11
中的WR相连, P3.7与基础板J11的RD相连。
②使用导线分别将P3.0、P3.1任意选通两位数码管,将P1口与段码驱动
J7相连。
③将功能板电位器的模拟电压(0~5V)至输入通道7。
④编写汇编程序(图3.11为程序流程图),实现本实验的要求。
5.参考例程
AD EQU 30H
BAI EQU 31H
SHI EQU 32H
GEW EQU 33H
AD1 EQU 34H
ORG 0000H
LJMP MAIN
MAIN:MOV A,#00H
MOV DPTR,#7F07H
MOVX @DPTR,A
MOV R6,#0aH
DELAY:NOP
NOP
NOP
DJNZ R6,DELAY
MOVX A,@DPTR
MOV AD,A
ACALL DISP
JMP MAIN
DISP:MOV A,AD
MOV B,#5
DIV AB
MOV B,#10
DIV AB
MOV BAI,A
MOV A,B
MOV SHI,A
D0:MOV R0,#100
D1:CLR P3.0
MOV A,BAI
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
ACALL D1MS
SETB P3.0
CLR P3.1
MOV A,SHI
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P1,A
ACALL D1MS
SETB P3.1
DJNZ R0,D1
RET
D1MS:MOV R6,#2
DSS:MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DSS
RET
TAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
TAB:DB 40H,79H,24H,30H,19H,12H,2H,78H,0H,10H
END
C源码实验
3.实验内容
将AD采集到的值送到数码管上进行显示
4.实验步骤
①短接J37,为AD芯片供电
②数码管位选接P3口高四位,J8端接P37,数码管段选接P2口,低位接
J7端;
③ADC0808数据线已接入P0口(不需外接线).JCON4端口的CS、RS、WR、
EOC分别接P12,P11,P10,P16;J27的ABC端分别接P13,P14,P15;J25(串口旁边的电位器)的NC端接J5(ADC0809的模拟输入端)的CH0 运行编写好的软件程序,完成温度数据的采集和显示功能。
仿真观看运行结果。
5.参考例程
#include "reg52.h"
#define THCO 0xee
#define TLCO 0x0
unsigned char code Duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
//共阴极数码管-9段码表
unsigned char Data_Buffer[4]={10,0,0,0};
float AdValue;
sbit P34=P3^4; //四个数码管的位码口定义
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
sbit TEST=P3^0;
/**************************************************/
sbit ADWR=P1^0;
sbit RS=P1^1;
sbit CS=P1^2;
sbit Add1=P1^3;
sbit Add2=P1^4;
sbit Add3=P1^5;
sbit EOC=P1^6;
sbit LED=P1^7;
/**************************************************/ void Sysinit();
void AD_Start(void);
void LED_Fresh();
void delay_ms(unsigned int x);
void main()
{
unsigned int i;
Sysinit();
Add1=0;
Add2=0; //模拟量通道输入选择
Add3=0;
while(1)
{
AD_Start();
while(!EOC);
LED=!LED;
RS=0;
AdValue=P0;
LED_Fresh();
RS=1;
for(i=0;i<40000;i++);
}
}
void Timer0_ISR() interrupt 1
{
static unsigned char Bit=0;
TH0=THCO;
TL0=TLCO;
Bit++;
if(Bit>=4)Bit=0;
P3&=0x0f;
if(Bit==1) P2=Duan[Data_Buffer[Bit]]|0x80; else P2=Duan[Data_Buffer[Bit]];
switch(Bit)
{
case 0: P34=1;break;
case 1: P35=1;break;
case 2: P36=1;break;
case 3: P37=1;break;
}
}
void LED_Fresh()
{unsigned int temp;
AdValue=AdValue*19.5;
temp=AdValue;
Data_Buffer[1]=temp/1000;
Data_Buffer[2]=temp/100%10;
Data_Buffer[3]=temp/100%10;
}
void Sysinit()
{
TMOD=0x11; //定时器0初始化
TH0=THCO;
TL0=TLCO;
TR0=1;
ET0=1;
EA=1;
TEST=0;
}
void AD_Start(void)
{
ADWR=1;
CS=0;
delay_ms(1);
ADWR=0;
delay_ms(1);
ADWR=1;
}
void delay_ms(unsigned int x) {
unsigned char y;
for(x;x>0;x--)
for(y=110;y>0;y--);
}
CS 1WR12AGND 3D34D25D16D07VREF 8Rfb 9DGND 10I OUT1
I OUT2
D7
13D614D515D416XFER 17
WR218
ILE
19
VCC 201112
实验十 DAC0832实验
1.实验目的
掌握D/A 芯片DAC0832与单片机的接口方法及DAC0832芯片的性能;了解单片机系统中扩展D/A 转换的基本方法。
2.实验设备及器件
PC 机 一台 SL-51HP 单片机综合创新实验箱 一台 杜邦线 若干 示波器 一台 3. DAC0832简介
D0~D7:8位数据输入端;
ILE :数据允许锁存信号; CS : 输入寄存器选择信号; WR1:输入寄存器写选通信号;
XFER :数据传送信号; WR2:DAC 寄存器的写选通信号; VREF :基准电源输入端; Rfb :反馈电源输入端; Iout1,Iout2:电源输入1、2; AGND :模拟地; DGND :数字地。
图3.12 DAC0832引脚图 4.实验内容
① 由于DAC0832为电流输出,为了取得电压输出,需在电流输出端Iout1,Iout2分别接上运算放大器UA741的B-、B+。
使Rfb 与运算放大器的输出端OUT 连接。
② 正确连接硬件电路后编写程序,使用查表的方法使单片机控制DAC0832产生一个电压值在0~-5V 之间的方波。
电路原理如图17所示。
5.实验步骤
①使用导线将P2.7与基础板的J21中的CS 端相连, P3.6(WR)与J21中 的WR 相连,并将J36和J38跳线帽短接。
如接口电路所示。
② 运行已经编好的程序。
使用示波器观察UA741的输出端OUT 输出的波形。
6.实验参考程序
ORG 0000H
MAIN:MOV DPTR,#7FFFH
LOOP:MOV A,#200
MOVX @DPTR,A
ACALL DELAY
MOV A,#0
MOVX @DPTR,A
ACALL DELAY
SJMP LOOP
DELAY:MOV R7,#250
DJNZ R7,$
RET
END
思考:正弦波的实现。
C实验源码
3.实验内容
DA输出方波。
4.实验步骤
①短接J38为DA芯片供电;J2的CS,WR分别接P36,P37
②DA数据线已接入P0口(不需外接线)。
J20的DA端接示波器。
③运行编写好的软件程序,仿真观看运行结果。
5.参考例程
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit DA_CS =P3^6;
sbit DA_WR =P3^7;
void DA_init();
void DA_datasend(uchar DA_value);
void main()
{
unsigned int i,count=0;
DA_init();
while(1)
{
for(i=0;i<200;i++)
DA_datasend(0);
for(i=0;i<200;i++)
DA_datasend(255);
}
}
void DA_init()
{
EA=1;
TMOD=0x01;
TH0=0xee;
TL0=0x00;
ET0=1;
TR0=1;
DA_CS=0;
DA_WR=0;
}
void DA_datasend(uchar DA_value) {
P0=DA_value;
}
实验十一串口通信实验
1.实验目的
利用单片机的TXD、RXD口,使用户学会单片机的串行口的使用。
2.实验设备及器件
PC机一台
SL-51HP单片机综合创新实验箱一台
3.实验内容
使用基础板MCU及串口,编写一段程序,利用单片机的串行口向PC机发送数据0x55。
4.实验步骤
①用串口线连接PC机和单片机开发板
②编写一段程序,利用单片机的串行口发送0x55,波特率为 9600bps。
③由于本实验用串口资源,因此程序必须下载运行。
运行结果可以在PC的接收软件上看见接收到“UUUUUUU…”。
5.参考例程
ORG 0000H
LJMP MAIN
ORG 0060H
MAIN:MOV SP,#60H
MOV TMOD,#20H ;设置T1为方式2
MOV TH1,#0FDH ;设置波特率为9600
MOV TL1,#0FDH
MOV SCON,#50H ;设置串口为方式1
MOV PCON,#00H
SETB TR1 ;启动定时器
LOOP:MOV SBUF,#55H ;开始发送
SENDWT:JBC TI,LOOP
AJMP SENDWT
END
C源码实验:
3.实验内容
编写一段程序,使数码管显示从上位机接收到的对应数值(0-9),并将此值发送给上位机。
(注:此实验只能用STC芯片,将HEX文件下载进去才能观看运行结果)
4.实验步骤
①P1口接数码管位码,J8端接低位。
P2口接数码管段码,J7端接低位
②编写程序。
仿真程序并运行查看结果。
5.参考例程
#include "reg52.h"
#define THCO 0xee
#define TLCO 0x0。