重庆科技学院单片机实验课程指导new - 图文 下载本文

单片机原理及应用

实验指导书

测控系

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 sbit k1 = P2^0; sbit k2 = P2^1; sbit P13 = P1^3; void main(){ while(1) { if(k1 == 0&k2 == 0) { P3 = 0x7f; } if(k1 == 1&k2 == 0) { P3 = 0xbf; } if(k1 == 0&k2 == 1) { P3 = 0xdf;

20/39

}

}

}

if(k1 == 1&k2 == 1) { P13 = 0; }

2.实验2

#include sbit key = P3^2; unsigned char a ;

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 #define THC0 0xee #define TLC0 0x00 sbit led0=P1^3; void main() {

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 #define THC0 0xee #define TLC0 0x00 sbit led0=P1^3; sbit led1=P3^5; sbit led2=P3^6; sbit led3=P3^7; void main() {

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 uchar unsigned char #define uint unsigned int

#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