单片机 - 图文

更新时间:2024-02-28 12:13:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

文华学院学生实验报告

实验课程: 单片机原理及应用

专业班级:12通信一班 学 号:1xxxxxxxxxxx 姓 名: xxx 指导教师: xxx

实验日期:2014.10.10—2014.12.10

目 录

单片机实验开发仪硬件学习单片机控制LED灯实验 数码管实验. 按键实验 中断实验 串口通信实验

实验一

实验二

实验三

实验四

实验五

实验六

实验一 单片机实验开发仪硬件学习

一、实验目的

1. 熟悉单片机开发仪硬件电路原理图、PCB板元器件布局以及跳线帽和接线插座的作用。

2.进一步熟悉51单片机实验开发仪。 3.Keil C51软件使用。

二、51单片机实验开发仪硬件电路简介

51单片机实验开发仪硬件电路原理图详见附件。原理图按功能模块给出,每个模块分别给出了相应器件和外接连线定义符号,它可作为设计应用系统中的一个独立器件或功能模块使用。该实验开发仪由51单片机最小系统、电源模块、矩阵键盘模块、独立键盘模块、8位LED数码管显示模块(动态数码管)、1位LED数码显示管(静态数码管)、10位LED灯模块(交通灯)等多个模块构成。

我们在设计单片机应用系统硬件电路时,需依照设计要求,由单片机最小系统和某些功能模块(或器件)组成。

这里只介绍单片机最小系统模块。其他模块在具体实验或应用设计时,再进行学习。

51单片机最小系统原理图如图1-1所示。单片机的4个I/O口,P0口、P1口、P2口、P3口分别接至JP10、JP8、JP11和JP9接线排座,通过接线排座与有关器件连接,实现I/O对不同模块的操作控制以及系统扩展,从而实现不同的应用系统。(注意:其中某些I/O引脚已固定作为某种信号,直接或通过短路帽连接到固定器件。例如,P2.0、P2.1作为EEPROM器件的SDA和SCL信号直接接到该器件的第5、第6脚;P3.4作为实时时钟芯片DS1302的DSIO信号,通过短路帽JP1302连接到DS1302的第6脚(SDIO)。

单片机的复位电路模块如图1-2所示,利用短路帽经J9,可方便实现高电平脉冲复位或低电平脉冲复位,这点以选用单片机型号确定。51单片机为高电平脉冲复位,其复位引脚RST(引脚9)应通过短路帽使J9的2、1短接。

图1-1 51单片机最小系统(MCU)原理图

图1-2 单片机复位电路

三、实验内容:

点亮一个LED

四、实验原理

LED小灯的阳极全部与高电平相连,阴极与单片机的P1口相连,当P1口对

应位输出为高电平时,LED小灯不亮,当P1口对应位输出为低电平时,LED小灯亮。具体P1口各个位输出电平的高低有程序控制。

五、硬件电路设计

五、软件设计 1、程序流程图

P1口输出高低电 开始 结束

2、源代码

#include

sbit P1_0=P1^0; //进行位定义 main()

{P1_0=0;} //让P1^0口输出低电平,点亮小

六、实验结果分析

试验中,经常是感觉程序编的的没有任何问题,可是到了用keil软件在板子上运行的时候就会发现有错误,产生这些错误的原因,主要是51芯片的类型选错,或者是串口、波特率等选择不正确,归根到底还是硬件和软件的结合做的不够。

实验二 单片机控制LED灯实验

一、实验目的

1、 进一步掌握Keil的使用,熟悉单片机C语言编程。 2、 学习I/O口的使用方法。

二、实验内容

双4只 LED 灯(D1、D3、D5、D7 与D2、D4、D6、D8)交替闪烁

三、实验原理

发光二级管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。 单片机对LED小灯的控制,其实就是对I/O口(单片机引脚)的控制。单片机共四个端口,P0、P1、P2、P3;每个端口分别有8个引脚 P0.0-P0.7、P1.0-P1.7、P2.0-P2.7、P3.0-P3.7;这32个引脚既可以作输出脚,又可以作输入脚。作输出脚时,单片机可以控制指示灯、数码管、电机等外部器件,当输出高时,LED小灯就能亮。

四、硬件电路图

五.软件设计

1、程序流程图

2、源代码

#include void delay(int x) { int i,j;

for(i=x;i>0;i--) //延时子程序 for(j=110;j>0;j--);}

main(){while(1) //不断循环执行

{ P1=0x55; //D1、D3、D5、D7亮 delay(100); //延时,让灯亮一会儿 P1=0xaa; //D2、D4、D6、D8亮 delay(100); //延时,让灯亮一会儿 }}

开始 P1口不断输出相应的高低电平 结束 六.实验结果分析

这个实验相对来说比较简单,因为书本上有相应的例题可以作为参考,编起程序也就比较简单,另外程序的运行也相对比较容易,基本上没有什么问题。。

实验三 数码管实验

一、实验目的

1、 掌握数码管显示原理(静态显示和动态显示)。

2、 掌握数码管显示编程。

二、实验内容

设计一个共阴极数码管动态显示和一个独立按键电路,未按下显示:ABCHELLO,按下显示:87654321。

三、实验原理

数码管是一种半导体发光器件,是MCS-51单片机系统中用得非常多的一种 输出通设备,其基本单元是发光二级管。MCS-51单片机系统中最常使用的是8段数码管。 数码管的内部结构其实是由8个发光二极管组成的,这8个二极管的正极或负极连接在一起,这样的数码管叫共阳(将8个led的阳极连接在一起)或共阴(将8个led的阴极连接到一起)数码管,点亮一个数码管其实就是有选择性的点亮这8个二极管;每个数码管位选单独接出来,他们的段选是接在一起的,段选是用来控制数码管亮什么数字,位选是用来控制哪一个数码管亮。通过对位选和段选的选择来实现数码管亮数字。

四、硬件电路设计

五、软件设计

1、程序流程图

开始 位选,选定要亮的数码管 段选,选择要显示的数 结束 2、源代码

#include

#define uint unsigned int #define uchar unsigned char sbit P24=P2^4;

uchar num1; //定义无符号变量 uchar code du1[]={0x7f,0x07,0x7d,0x6d,

0x66,0x4f,0x5b,0x06}; // 数码管显示码表1 uchar code du2[]={0x77,0x7c,0x39,

0x76,0x79,0x38,0x38,0x3f}; // 数码管显示码表2 uchar code wei[]={

0x7f,0xbf,0xdf,0xef, //数码管码表,主要选哪个数码管 0xf7,0xfb,0xfd,0xfe};

void delay(); //延时程序函数声明 void main() {

while(1)

{ if(P24==0) //判断是否有按键按下 { for(num1=0;num1<8;num1++) {

P1=wei[num1]; //送位选数据 P0=du2[num1]; //送段选数据表2 delay(); }} else {

for(num1=0;num1<8;num1++) {

P1=wei[num1]; //送位选数据

P0=du1[num1]; //送入段选数据表1

delay(); } } }}

void delay() //延时子程序 {

uint x,y;

for(x=2;x>0;x--)

for(y=110;y>0;y--); }

六、实验结果分析:

这次试验的重点是段选和位选,由于51芯片的引脚资源有限,而通过锁存器来扩充引脚资源又是一个比较好的办法,所以采用这种做法来控制数码管。

实验四 按键实验

一、实验目的

1、掌握单片机键盘与单片机接口

2、掌握单片机键盘(独立键盘和矩阵键盘)程序设计方法

二、实验内容

设计一4×4矩阵键盘,定义键盘数字为0~F;编制一位数码管显示按下键盘值程序。

三、实验原理

键盘是计算机系统中不可缺少的输入设备,当按键少时可接成线性键盘(或称独立键盘),即一个键盘占用一个I/O口中一位,当按键较多时,这样的接法占用口线较多。在按键较多时,常将按键接成矩阵的形式,可以节省口线,例如一个I/O口可按4×4的形式接16个按键。

矩阵键盘通常由列线和行线构成,按键设在行线,列线交点处,行、列线分别连接到按键开关的两端。列线(按键一端)通过电阻接VCC,行线(按键另一端)的接地是通过程序对某I/O口输出数字“0”实现。矩阵键盘的每一个键都有自己的行值和列值,行值和列值的组合是识别这个按键的编码,称为键码。 图示出了单片机实验仪4×4矩阵键盘模块,它有P-14、P-15、P-16、P-17四行和P-10、P-11、P-12、P-13四列构成(当列线连接到某I/O时,可通过相应口经一电阻与VCC连接,见图1-1),共构成S1~S16个按键。四行行线和四列列线分别连接到JP4 接线排座的引脚,可通过它们连接到某个I/O口,实现键盘键盘闭合判断,获得键盘的键值。

四、硬件电路设计

利用单片机P2口低4位作为矩阵键盘的行线,高4为作为矩阵键盘的列线;利用8PIN 排线将最小系统模块的接线排座J8和矩阵按键模块的接线排座JP4连接(注意引脚号的对应关系)。利用P0口作为数码管的字形码输出口,利用8PIN排线将最小系统模块的接线排座J10和单位数码管模块的接线排座JP3连接(注意引脚号的对应关系)。

根据硬件电路设计,其键盘键码示于表5-1。设键盘对应数字如表5-2所示。

(S1)EE (S2)DE (S3)BE (S4)7E (S5)ED (S6)DD (S7)BD (S8)7D (S9)EB (S10)DB (S11)BB (S12)7B (S13)E7 (S14)D7 (S15)B7 (S16)77 表5-1 矩阵键盘键码表

(S1)1 (S5)5 (S2)2 (S6)6 (S3)3 (S4)4 (S7)7 (S8)8 (S9)9 (S10)0 (S11)A (S12)B (S13) (S14)D (S15)E (S16)F 表5-2 矩阵键盘对应数字

五、软件设计 1、程序流程图

开始

检测是否有按键按下 消陡

数码管显示 检测是否有按键按下

2、程序代码 #include

#define uchar unsigned char #define uint unsigned int

code char tab[16]={0xc0,0xf9, 0xa4,0xb0,0x99, 0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1, 0x86,0x8e};

//共阳极数码管显示码表 void delayms (); uchar kbscan();

void display(uchar keydisp); //函数调用声明 void main () {

uchar key; P0=0xc0; while (1) {

key=kbscan(); //是否有键按下 display(key); } }

void delayms () {

uchar i; //延时子程序 for (i=200;i>0;i--){} }

uchar kbscan () {

uchar sccode, recode; //定义矩阵键盘行,列

结束 P2=0xf0;

if((P2 & 0xf0)!=0xf0) { delayms ( );

if ((P2 & 0xf0)!=0xf0) //P2的高四位不全为1时说明有按键按下 {sccode=0xfe; //第一行为1 while((sccode&0x10)!=0) //不断扫描,确定按下的按键 { P2=sccode;

if ((P2 & 0xf0)!=0xf0) { recode = P2 & 0xf0; sccode= sccode & 0x0f; return (sccode+recode); } else

sccode=(sccode <<1)| 0x01; } } }

return(0); }

void display (uchar keydisp )

{ uchar keytab[16]={ 0xdb,0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,

0x7d,0xeb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77} ; //矩阵键码对应的数字 uchar m ;

for (m=0;m<16;m++) {

if (keytab[m]==keydisp) P0=tab[m] ; } }

六、实验结果分析:

这次的实验感觉也是比较容易的,主要针对的是将矩阵键盘对应数字进行改变,另外就是要求我们对代码要有很深的理解,这样做起来才会效率很高。。

实验五 中断实验

一、实验目的

1、 掌握MCS-51单片机中断的工作原理,体会外部中断的使用特点。 2、 掌握中断处理程序的编程方法和中断程序编程特点。

二、实验内容

用一按键作为外部中断INT0,并用单位数码管显示外部中断源INT0的中断次数(0-9),每当显示到5时,一LED等闪烁一下。

三、实验原理

中断就是停止正在运行的任务去执行突发任务,执行完突发任务后在回来执

行刚刚被暂停的任务。只要有突发状况发生,我们给外部中断两个引脚一个的脉冲,单片机通过检测这两个引脚上的脉冲方式就可以判断是否有突发状况发生了,给这两个引脚一个低电平或者一个下降沿脉冲都可以触发外部中断,然后程序执行中断。

四、硬件电路图

五、软件设计 1、程序流程图

开始 检测是否有中断信号

执行中断

返回中断点 结束 程序代码:

#include < reg51.h > #include unsigned int LedNumVal;

sbit led=P1^0; //申明单片机P1口的第一位 unsigned int i;

unsigned char code Disp_Tab[] = {

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0—9数码管码表 void main(void) {

IT0=0;

IT0=1; //对外部相关寄存器进行设置 EA=1; EX0=1;

LedNumVal=0; while(1) {

P0=Disp_Tab[LedNumVal];

if(LedNumVal==10) //判断是否进入下一个循环 LedNumVal=0; } }

void counter(void) interrupt 0 //中断服务程序 {

EX0=0;

LedNumVal++; if(LedNumVal==5) {led=0;

for(i=50000;i>0;i--){} //插入一个延时程序

led=1; }

if(b==9)

b=0;} //进行下一次循环

六、实验结果分析

这次试验的要求比较高,需要将数码管、独立按键以及外部中断糅合在一起,既需要把握好对独立按键的设置,同时又要求相关变量的不重复性,这样做起来感觉还是比较的棘手。

实验六 串口通信实验

一、实验目的

1、熟悉51系列单片机定时器串口通信工作原理与工作方式。 2、掌握单片机定时器串口通信的程序编写。 3、进一步熟悉定时/计数器编程。

二、实验内容

编一个单片机串口自发自收程序,并发送0—F,并用一发光二极管指示发送过程。

三、实验原理

串行接口是单片机的一个重要接口,单片机通过它与外部设备进行通信,串口通信又

分为并行通信和串行通信,而串行通信又可分为:异步通信和同步通信。单片机与计算机通信其实就是数据的传送,采用的是串行异步(在线路上传送时以一个字符为单位)通信,那么在数据的传送过程中就涉及到数据的格式和传送数据的速度了,这就对应着串口通信中的两个概念:数据帧和波特率。在进行串口通信编程时,要对相关寄存器进行设置。

四、硬件电路设计

利用P0口作为数据(字型码)输出,驱动一位静态LED数码管显示串口接收到的字符。JP10接线排座(单片机I/O P0口)与JP3 接线排座(一位数码管字形码输入)用8PIN排线连接。这里,用单片机I/O的P0口作为数码管字形码的输出口。

因为本实验只需实现自发自收即可,故单片机的P3^0口和P3^1口用杜邦线直接相连即可。

五、程序设计

1、程序流程图

2、源程序 #include unsigned int i;a=1;

code char tab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数据管码表 Sbit P1_0=P1^0; void main(){

TMOD=0x20; //对定时器相关寄存器进行配置 TH1=0xf3; TL1=0xf3; //装入定时器初值 TR1=1;

SCON=0x50; //对串口通信进行寄存器配置 P0=tab[a]; P1_0=0; while(1){

for (a=0;a<=15;a++)

数码管显示 接收数据 发送数据 开始 结束 { SBUF=tab[a]; //发送数据 for(i=0;i<10000;i++); if(TI==1) {TI=0; if(RI==1) {RI=0; P0=SBUF;

//保存接收数据

//判断是否接收完

//判断是否完成发送

P1_0=~P1_0; for(i=0;i<15000;i++);}} }}}

六、实验结果分析

这次的实验感觉比较的难,一开始便程序的时候,把发送和接受没有区别

对待,以至于后面在板子上运行的结果是对的,但是却不是按照实验的要求来做的,所以,必须要对发送和接收进行很好的区分,同时也要注意判断时间的先后。

{ SBUF=tab[a]; //发送数据 for(i=0;i<10000;i++); if(TI==1) {TI=0; if(RI==1) {RI=0; P0=SBUF;

//保存接收数据

//判断是否接收完

//判断是否完成发送

P1_0=~P1_0; for(i=0;i<15000;i++);}} }}}

六、实验结果分析

这次的实验感觉比较的难,一开始便程序的时候,把发送和接受没有区别

对待,以至于后面在板子上运行的结果是对的,但是却不是按照实验的要求来做的,所以,必须要对发送和接收进行很好的区分,同时也要注意判断时间的先后。

本文来源:https://www.bwwdw.com/article/eh4a.html

Top