单片机原理及应用
实验指导书
测控系
2016年4月
1/39
目 录
1 单片机实验板 ............................................................................................................................. 3
1.1 资源介绍 ........................................................................................................................... 3 1.2原理图 ................................................................................................................................ 4 1.3 PCB丝印图 ....................................................................................................................... 6 2 KEIL软件的使用 ..................................................................................................................... 7 3 STC-ISP下载软件的使用方法 ............................................................................................. 15 实验一实验二实验三实验四实验五实验六实验七实验八
熟悉KEIL软件的使用 ................................................................................................ 18 Keil C51程序设计上机练习 ....................................................................................... 20 单片机中断实验 ........................................................................................................... 23 中断及定时器∕计数器实验 ....................................................................................... 25 数码管显示器实验 ....................................................................................................... 28 串口通信实验 ............................................................................................................... 30 AD转换器实验 ............................................................................................................ 33 DA转换器实验 ............................................................................................................ 36
2/39
1 单片机实验板
1.1 资源介绍
1)采用STC8952RC(与标准51指令、脚位完全兼容),支持在线串行ISP下载。 2)供电方式:USB供电及下载 3)USB转串口RS232 (PL2303芯片) 4)4个LED发光管,1个电源指示灯 5)四位数码管
6)4个独立式键盘(包含外部中断按键),1个复位或下载按键 7)DS1302 一片 8)AT24C02一片 9)热敏电阻1支 10) 加热电阻 1个 11)12864液晶显示接口 12)PCF8573一片 13)AD电位器一个 14) 蜂鸣器一个
15)DS18B20温度传感器(选配件) 16)IrDA红外接收头(遥控器为选配件) 产品图片:
资源分配图如下:
3/39
加热指示灯 热敏电阻 发热电阻 DS18B20接口 MCU: STC89C52 所有IO引出 12864液晶接口 DA指示PCF8573 AD电位器 蜂鸣器 红外接收 USB 电源 24C02 DS130
PL2303 下载芯片 四个独立按键 电源 指示灯 复位 下载键 5V GND 1.2原理图
4/39
5/39
1.3 PCB丝印图
6/39
2 KEIL软件的使用
KEIL是51单片机开发的最常见的开发软件。
成功安装好KEIL软件后,即可看到电脑桌面上Keil软件图标,如下图。
1.双击图标,打开软件,出现如下界面。在打开的窗口中,选择“Project”菜单:
2.点击“New Project”出现一个创建工程对话框,选择工程所建路径,并输入工程的文件名(建议用英文),点击“保存”:
3.之后出现芯片选择界面,如下图:
7/39
4.这里,选取常用51芯片即可,选择“Philips”下的“8Xc51RC+”芯片:
5.点击“确定”,在出现如下对话框时,选择“否”:
8/39
6.至此,已成功建立工程。界面如下图所示:
7.点击“Project”菜单下面的“options for Target‘Target 1’”选项,出现如下选项框:
9/39
8.选择“output”页面,选中“create Hex File”,并可在“Name of Executable:”输入框中,重新输入生成HEX文件的文件名,然后点“确定”,以在程序编译时,实时生成需下载到单片机中的HEX文件。
10/39
9.点击“File” 菜单下面的“New”选项,再点击“File”菜单下面的“Save”选项,保存文件。输入文件名(C文件扩展名为“.c”,汇编文件扩展名为“.asm”),如下图:取名为main.c:
10.在新建的文件里,进行程序编制,如图:
11/39
11.程序编制完成后,保存文件。将源程序文件加载到工程中。加载方法为:右击“Source Group”,在出现的选项列表中,选择“Add Files to Group ‘source Group 1’”,如下图所示:
12/39
12.在出现的对话框中,选择刚编辑的源文件(main.c),点击“Add”,如图:
13.添加成功后,点击“Project”菜单下面的“Rebuild all target files”选项。当编译通过之后HEX文件才能生成,如下图。如果程序有错误,编译结果框中会有提示错误。双击对应的错误列表,可定位到源程序的位置,以便快速寻找错误。
13/39
14/39
3 STC-ISP下载软件的使用方法
该软件将已生成的HEX文件下载到单片机中。具体步骤如下: 1.双击STC-ISP图标:
2.然后在“单片机型号”列表中选择单片机型号(应选择单片机板中的CPU型号),如下图:
3.点击“打开程序文件”按钮,找到所要下载的HEX文件,并选中,选择“打开”,如下图:
15/39
4.选择串口的对应端口号,(根据自己的硬件连接端口)(如COM1)。
提示:使用电源线即可下载。但下载之前需安装USB转串口驱动程序。 将板子与电脑连接后,请查看“设备管理器”中的COM识别端口号。
16/39
5.然后选“MaxBuad”中的波特率,也可以选默认值。
6.点击“下载/编程”按钮,然后按下板子上的红色下载键,进行文件下载。
7.稍等几秒,即可下载完成,如图:
17/39
实验一 熟悉KEIL软件的使用
一、实验目的
1. 认识单片机实验系统的构成及使用。
2. 学习KEIL软件和STC-ISP下载软件的使用方法。 3. 单片机I/O口的使用方法; 二、实验内容
1. P13口做输出口,接发光二极管,编写程序,使其闪烁。
2. P13、P35~P37口接四只发光二极管LED1-LED4, P20口接开关K1,编写程序,用开关控制发
光二极管上的亮灭。
三、实验步骤
1.设计实验电路,画出电路原理图 2.按照 KEIL软件的使用步骤,建立工程。 3.编写程序,保存文件,将源程序文件加载到工程中,当编译通过之后生成HEX文件。 4. 用STC-ISP下载软件下载HEX文件到单片机系统。 5.运行、调试程序,观察实验结果。 四、实验参考电路及参考程序 1.参考电路
2.参考程序
实验1:
#include \sbit P13=P1^3; //定义LED指示灯的IO口 void main() {
int i;//计时变量
while(1) {
for(i=0;i<30000;i++);//延时
18/39
P13=!P13;//指示灯IO口反转 } }
实验2:
#include \sbit P13=P1^3; //定义LED指示灯的IO口 sbit P20=P2^0; //定义key的IO口 void main() {
int i;//计时变量
while(1) {
for(i=0;i<30000;i++);//延时
if( P20==0) P13=0; // 按键,LED亮 else P13=1;// LED亮 } }
五.思考题
1. P35- P37口做输出口,接发光二极管,编写并调试程序,使其闪烁。
2. P35- P37口做输出口,接发光二极管,编写并调试跑马灯程序。
19/39
实验二 Keil C51程序设计上机练习
一、实验目的
1. 学习KEIL软件的程序调试方法。
2. 学会KEIL C程序设计及调试,重点学会预处理命令、数据类型的定义。 二、实验内容
1.单片机P2口的P20和P21各接一个开关K1、K2,P13、P35、P36和P37各接一只发光二极管。由K1和K2的不同状态来确定发光二极管的点亮。
K2 0 0 1 1 K1 0 1 0 1 亮的二极管 L1 L2 L3 L4 2.设计一个二进制加1计数器,按一次键,加1,并用3个LED显示计数结果,加至8时清零重新计数。 三、实验步骤
1.设计实验电路,画出电路原理图 2.按照 KEIL软件的使用步骤,建立工程。 3.编写程序,保存文件,将源程序文件加载到工程中,当编译通过之后生成HEX文件。 4. 用STC-ISP下载软件下载HEX文件到单片机系统。 5.运行、调试程序,观察实验结果。
四、实验参考电路及参考程序
1.实验1#include
20/39
}
}
}
if(k1 == 1&k2 == 1) { P13 = 0; }
2.实验2
#include
unsigned char count = 0; void delay(int i) { while(i) i--; }
void main() { while(1) { P32=1; if( key==0 ) { delay(10); if( key==0) { count++; while(!key); if( count==8) count = 0; a = count; a = ~a; a = a<<5; P3 = a; } } } }
五、思考题
1.设计一个二进制减1计数器,按一次键,减1,并用3个LED显示计数结果,减至0时,重新从7开始计数。
2.用1个按键控制LED的显示,要求显示3种以上的不同模式。如,按第一次键,3个灯轮流亮灭;按第二次键,1、2灯和2、3灯轮流显示;按第三次键,3灯同时亮灭。
21/39
22/39
实验三 单片机中断实验
一、实验目的
1.掌握单片机的中断系统,学会单片机中断系统的初始化。 2.学会单片机外部中断的应用。 二、实验内容
1.采用外部中断的方式实现按键控制1个LED的亮灭。 2.采用外部中断的方式实现3个LED的轮流亮灭。 三、实验步骤
1.设计实验电路,画出电路原理图 2.按照 KEIL软件的使用步骤,建立工程。 3.编写程序,保存文件,将源程序文件加载到工程中,当编译通过之后生成HEX文件。 4.用STC-ISP下载软件下载HEX文件到单片机系统。 5.运行、调试程序,观察实验结果。 四、实验参考电路和参考程序
1.实验1
#include \
sbit P35=P3^5;
void main() {
IT0=1; //外部中断0连沿触发方式 EX0=1; //使能外部中断0 EA=1; //开部中断 P34=0; //指示灯初始为亮
while(1) ; }
void int0() interrupt 0 //外部中断0程序入口 {
P35=!P35; }
2.实验2
23/39
#include \
//sbit P32=P3^2;
void main() {
IT0=1; //外部中断0连沿触发方式 EX0=1; //使能外部中断0 EA=1; //开部中断
while(1) ; }
void int0() interrupt 0 //外部中断0程序入口 {
static unsigned char Bit=0; Bit++;
if(Bit>=3)Bit =0; switch(Bit) {
case 0: P3 = 0xef; break; case 1: P3 = 0xdf; break; case 2: P3 = 0xbf; break; }
P32=1; }
五、思考题
1. 采用外部中断的方式实现一个二进制减1计数器,按一次键,减1,并用3个LED显示计数结果,减至0时,重新从7开始计数。
2. 采用外部中断的方式实现用1个按键控制LED的显示,要求显示3种以上的不同模式。
24/39
实验四 中断及定时器∕计数器实验
一、实验目的
1.掌握单片机的中断系统、定时器的工作原理。 2.学会单片机中断系统、定时器的应用。 二、实验内容
1.采用单片机定时器实现1个LED的亮灭,周期为1s。
2. 采用单片机定时器实现4个LED的轮流亮灭,每个LED点亮时间为1s。 三、实验步骤
1.设计实验电路,画出电路原理图 2.按照 KEIL软件的使用步骤,建立工程。 3.编写程序,保存文件,将源程序文件加载到工程中,当编译通过之后生成HEX文件。 4.用STC-ISP下载软件下载HEX文件到单片机系统。 5.运行、调试程序,观察实验结果。 四、实验参考电路和参考程序
1.实验1
#include
TMOD=0x01; TH0=THC0; TL0=TLC0; TR0=1; ET0=1; EA=1; while(1); }
void timer0_ISR(void) interrupt 1 {
25/39
static unsigned char count=0; TL0=TLC0; TH0=THC0; count++;
if(count>=200) {
count=0; led0=!led0; } } 2.实验2
#include
TMOD=0x01; TL0=TLC0; TH0=THC0; TR0=1; ET0=1; EA=1; while(1); }
void timer0_ISR(void) interrupt 1 {
static unsigned char count=0,Bit=0; TL0=THC0; TH0=TLC0; count++;
if(count>=200) {
count=0; Bit++; if(Bit>=4) Bit=0;
P3=P3|0xf0; P1=P1|0x0f;
switch(Bit) {
26/39
case 0:led0=0;break;
case 1:led1=0;break; case 2:led2=0;break; case 3:led3=0;break; } } } 五、思考题
1.设计1个秒计数器,每秒计1次数,在LED上显示出来,计至16清零后重新计数。 2.在上题基础上用按键控制秒计数器的启停,按一次键开始计数,按2次停止计数,按3次又开始计数…。
27/39
实验五 数码管显示器实验
一、实验目的
1.掌握单片机的按键、数码管显示器的工作原理。 2.学会单片机独立式按键、数码管显示器的应用。 二、实验内容
1.在一个数码管上显示字符“1”。 2.在4个数码管上显示字符“1”、“2”、“3”、“4”。
3.设计一个2位10进制计数器,每秒加1,在LED上显示。 三、实验步骤
1.设计实验电路,画出电路原理图 2.按照 KEIL软件的使用步骤,建立工程。 3.编写程序,保存文件,将源程序文件加载到工程中,当编译通过之后生成HEX文件。 4.用STC-ISP下载软件下载HEX文件到单片机系统。 5.运行、调试程序,观察实验结果。 四、实验参考电路和参考程序
1.参考电路
2.参考程序
#include \
#define THCO 0xee #define TLCO 0x0
unsigned char code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//共阴极数码管,0-9段码表
28/39
unsigned char Data_Buffer[4]={1,2,3,4};//四个数码管显示数值,数组变量定义
sbit P24=P2^4; //四个数码管的位码口定义 sbit P25=P2^5; sbit P26=P2^6; sbit P27=P2^7;
void main() { TMOD=0x11; //定时器0初始化 TH0=THCO; TL0=TLCO; TR0=1; ET0=1; EA=1;
while(1) ; }
void timer0() interrupt 1 {
static unsigned char Bit=0; //静态变量,退出程序后,值保留
TH0=THCO; TL0=TLCO;
Bit++;
if(Bit>=4)Bit=0; P2|=0xf0; //先关位码 P0=Duan[Data_Buffer[Bit]]; //开段码 switch(Bit) //送位码 {
case 0: P24=0;break; case 1: P25=0;break; case 2: P26=0;break; case 3: P27=0;break; } }
五、思考题
用按键作显示模式选择键,实现上述实验中3个显示画面的切换,即上电显示“1”,按1次键显示“1234”,再2次键显示2位秒计数器,按3次键又显示“1”……。
29/39
实验六 串口通信实验
一.实验目的
利用单片机的TXD、RXD口,使用户学会单片机的串行口的使用。 二.实验设备及器件
PC机 一台 单片机实验板 一台 三.实验内容
编写一段程序,使数码管显示从上位机接收到的对应数值(0-9),并将此值发送给上位机。(注:此实验只能用STC芯片,将HEX文件下载进去才能观看运行结果) 四.实验步骤
1.按照 KEIL软件的使用步骤,建立工程。 2.编写程序,保存文件,将源程序文件加载到工程中,当编译通过之后生成HEX文件。 3.用STC-ISP下载软件下载HEX文件到单片机系统。
4.运行、调试程序,利用STC-ISP的串口助手窗口中发送数据给单片机,在单片机的数码管上观察接收到的数据;并在STC-ISP的串口助手窗口中观察接收到的数据。
本实验中将使用串口助手进行调试,使用方法如下: (1)在STC-ISP软件窗口中,点击 “串口助手”,PC机上显示下图所示窗口,在发送缓冲区和接收缓冲区均选择HEX模式,正确选择通讯的串口号和波特率,根据单片机与PC机连接的串口选择串口号,波特率的选择要与程序中设定的波特率一致,本实验中选择的波特率为9600。
(2)在发送缓冲区输入0-9的数据,然后点击“发送数据”,观察单片机实验板上LED显示的结果,并观察STC-ISP软件窗口中“接收缓冲区”中显示的数据是否与LED显示数据一致。
图2.7 PC机串口助手界面
五.参考例程
#include \
30/39
#define THCO 0xee #define TLCO 0x0 unsigned
char
code
Duan[]={0x3F,
0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴极数码管,0-9段码表
unsigned char Data_Buffer[4]={1,2,3,4}; //四个数码管显示数值,数组变量定义
sbit P24=P2^4; //四个数码管的位码口定义 sbit P25=P2^5; sbit P26=P2^6; sbit P27=P2^7; //sbit P34=P3^4; void main() {
TMOD=0x20; SCON=0x50;
TH1=0xfd; //设置波特率为9600 TL1=0xfd;
TR1=1; //开定时器1 ES=1;
TH0=THCO; TL0=TLCO; TR0=1; ET0=1; EA=1;
while(1); }
void timer0() interrupt 1 {
static unsigned char Bit=0; //静态变量,退出程序后,值保留 TH0=THCO; TL0=TLCO;
31/39
//方式控制字
Bit++;
//先关位码
if(Bit>=4)Bit=0; P2|=0xf0;
P0=Duan[Data_Buffer[Bit]]; //开段码 switch(Bit) {
case 0: P24=0;break; case 1: P25=0;break; case 2: P26=0;break; case 3: P27=0;break; }
}
void seri()interrupt 4 {
unsigned char temp; if(RI==1) {
temp=SBUF; RI=0;
if(temp>=0&&temp<=9)//接收到的数据为0-9时显示到数码管上 { TI=0; SBUF=temp; while(TI==0); TI=0; } }
32/39
//送位码
}
Data_Buffer[0]=temp; Data_Buffer[1]=temp; Data_Buffer[2]=temp; Data_Buffer[3]=temp; //P34=!P34;
7.思考题
利用单片机的串行口向PC机发送数据0x55,运行结果可以通过在PC的接收软件上看见,验证接收数据是否正确。
实验七 AD转换器实验
一、实验目的
学会用51单片机模拟I2C总线接口,实现与PCF8591 8位AD转换器的接口,学会用单片机实现数据采集的方法。 二、实验设备及器件
PC机 一台
51单片机实验板一台(含PCF8951芯片) 万用表、示波器 三、实验内容
编写一段程序,采集PCF8591 AD通道的模拟信号值,将采集的电压值用四位数码管显示出来。
四、实验电路原理图
AIN0-AIN3为4路模拟输入信号,时钟信号SCL接至单片机P36,数据线SDA接至P37。 五、参考例程
#include \#include
#define PCF8591 0x90 //PCF8591 地址 #define THCO 0xf8 //11.0592MHZ晶振 #define TLCO 0xcb //定时2ms时间常数值 unsigned char Data_Buffer[4]={1,2,3,4};
33/39
uchar code
Duan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};
sbit P24=P2^4; sbit P25=P2^5; sbit P26=P2^6; sbit P27=P2^7; bit flag=0;
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val); bit ISendByte(unsigned char sla,unsigned char c); unsigned char IRcvByte(unsigned char sla); /******************************/ void main(void) //主程序 {
unsigned int v;
unsigned char AD_CHANNEL=1; unsigned int D[5]={0,0,0,0,255};
TMOD=0x11; TH0=THCO; TL0=TLCO; TR0=1; ET0=1; EA=1;
//四个数码管的位码口定义
//设置定时器0工作模式,16位计数模式
//启动定时器
//使能定时器中断 //开总中断
while(1) {
if(flag==1) {flag=0;
ISendByte(PCF8591,0x41);
v=IRcvByte(PCF8591);
Data_Buffer[0]=0; Data_Buffer[1]=v/100;
34/39
Data_Buffer[2]=v/10;
Data_Buffer[3]=v; }
} }
void timer0() interrupt 1 //定时器中断服务子程序 {
static unsigned int count=0;//软计时变量定义
static unsigned char Bit=0; //静态变量,退出程序后,值保留
TH0=THCO; TL0=TLCO; Bit++; if(Bit>=4)Bit=0; P2|=0xf0;
//先关位码 //开段码
P0=Duan[Data_Buffer[Bit]]; if(Bit==0)P0|=0x80; switch(Bit) {
case 0: P24=0;break; case 1: P25=0;break; case 2: P26=0;break; case 3: P27=0;break; }
count++; if(count>=250) {
count=0; flag=1; } }
//送位码
//半S时间到
六、思考题
35/39
1.将PCF8591的4个模拟输入通道的采样值轮流在数码管上显示出来。
实验八DA转换器实验
一、实验目的
学会用51单片机模拟I2C总线接口,实现与PCF8591的8位AD转换器的接口,学会用单片机实现波形发生器的方法。 二、实验设备及器件
PC机 一台
51单片机实验板一台(含PCF8951芯片) 万用表、示波器 三、实验内容
编写一段程序,用单片机控制PCF8591 DA转换器输出方波,用示波器观察PCF8591输出的方波。
四、实验电路原理图
时钟信号SCL接至单片机P36,数据线SDA接至P37。 五、参考例程
#include \#include
#define uchar unsigned char #define uint unsigned int
#define PCF8591 0x90 //PCF8591 地址
#define THCO 0xf8 //11.0592MHZ晶振 #define TLCO 0xcb //定时2ms时间常数值
36/39
unsigned char Data_Buffer[4]={1,2,3,4}; uchar
5e,0x79,0x71,0x76};
sbit P24=P2^4; sbit P25=P2^5; sbit P26=P2^6; sbit P27=P2^7;
bit flag=0;
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val); bit ISendByte(unsigned char sla,unsigned char c); unsigned char IRcvByte(unsigned char sla); /******************************/ void main(void) //主程序 {
unsigned int v;
unsigned char AD_CHANNEL=0; unsigned int D=255;
TMOD=0x11; TH0=THCO; TL0=TLCO; TR0=1; ET0=1; EA=1; while(1) {
if(flag==1) {flag=0;
code
Duan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x
//四个数码管的位码口定义
//设置定时器0工作模式,16位计数模式
//启动定时器
//使能定时器中断
//开总中断
DACconversion(PCF8591,0x40, D); //DAC 数模转换 D=255-D;//输出方波
37/39
}
Data_Buffer[1]=D/100; Data_Buffer[2]=D/10; } }
void timer0() interrupt 1 //定时器中断服务子程序 {
static unsigned int count=0;//软计时变量定义 static unsigned char Bit=0;
TH0=THCO; TL0=TLCO; Bit++;
//先关位码
if(Bit>=4)Bit=0; P2|=0xf0;
P0=Duan[Data_Buffer[Bit]]; //开段码 if(Bit==0)P0|=0x80; switch(Bit) {
case 0: P24=0;break; case 1: P25=0;break; case 2: P26=0;break; case 3: P27=0;break; }
count++;
if(count>=250) {
count=0;
38/39
Data_Buffer[3]=D; }
//静态变量,退出程序后,值保留
//送位码
//半S时间到
flag=1; } }
六、思考题
利用单片机控制PDF8591 DA转换器输出三角波,用示波器观察PCF8591输出的方波。
39/39