单片机实习报告 - 图文

更新时间:2023-10-28 14:04:01 阅读量: 综合文库 文档下载

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

单片机原理与应用课程设计

题目:计数器数码管综合设计

专业班级:电自化1201班 学号:20122835 姓名:邱胜朋

2016年11月12日

目 录

1.摘要及关键词 ····························· 1 1.1主要问题 ····························· 1 1.2 解决思路 ····························· 1 2.简介 ································· 2 2.1 系统特性及其功能 ························· 2 2.2 设计的具体方案 ·························· 2 3.系统设计 ······························· 2 3.1 硬件电路······························ 3 3.1.1使用的主要器件 ························· 4 3.1.2主要部分器件说明 ························ 5 3.2 软件设计······························ 7 3.2.1 程序流程图···························· 7 3.2.2 程序设计内容··························· 9 3.2.3 实验程序及部分注释························ 9 4.实验结果 ·······························14 5.实习总结 ·······························15 参考文献 ································15 附录 ··································15

1.摘要及关键词 1.1主要解决问题

随着当今社会的快速发展,大部分的自动化生产过程中的流水线的自动装箱或自动装配都需要用的自动计数,而怎样对流水线上的产品需要进行实时的、有效率的、精确地自动技术成为广泛关注的问题。传统的机械式或电子式计数器比较复杂,元器件数量较多,故障率较高,维修比较困难,而且设置不方便,功能不易更改,适用范围较窄。 1.2解决思路

基于单片机的自动计数器已经成为比较成熟的产品,应用于各种需要计数的场合,具有计数准确,操作方便,显示准确计数功能形式多样化的特点,被广泛的应用,能够实现数据统计的搜集,有效的节省劳动力高质量地完成任务。基于单片机构成的产品自动计数器研究的主要内容包括:如果构成检测电路、STC89C51单片机用何种方式对外部计数脉冲进行计数显示控制、LED显示驱动模块的选择、STC89C51单片机的扩展。在这个设计中主要需要解决的问题便是如何提高单片机的抗干扰能力以及稳定性。

本文以单片机为核心的技术设计,阐述了系统的原理、硬件电路和软件设计

相关内容。

关键词:单片机,数码管,计数显示,流水线 2.简介

2.1系统特性及其功能

本次实习设计以STC89C51系列单片机开发板为基础开发环境,编制程序实现

饮料包装流水线从0~36的饮料瓶数字实时显示。设计具体思路是:综合单片机开发板按键模块和led数码管模块,使用按键的闭合模拟流水线上检测装置检测到的计数脉冲,送入

STC89C51单片机控制单元,通过对单片机编程实现计数然后由led数码管显示,实现实时计数功能。可以实现的功能有:

1

(1)按下启动键,可以记录显示流水线启动开始后的物件数量,计数值到36自动清零,再次按下启动重新计数;

(2)在计数过程中按下清零键可以清零并停止计数,再次按下开始重新计数;

(3)计数过程中按下暂停键暂停计数并显示当前数值,按下启动键继续计数;若按下请零键可以清零并停止计数;

2.2设计方案选择

基于STC89C51单片机的流水线计数器设计可以采用以下方案:

2.2.1 单片机计数器的方式控制寄存器TMOD中的GATE位=1时,可以很方便的进行INT0引脚的外部输入信号的时间间隔测量。通过p1.7口模拟外部计数脉冲,通过外部连线将P1.7与P3.4相连接进行计数功能,这种方法使用单片机内部的计数器,具有使用方便,计数准确等特点。但是由于我粗心大意没有读请题目要求,没有使用计数器,所以本次设计使用下面一种方案:

2.2.2 使用C语言编写软件程序,嵌套循环实现计数功能,实验结果也可以符合设计的要求。

3.系统设计

3.1硬件电路

3.1.1使用的主要器件有以下部分:

(1)单片机电路;(2)复位电路;(3)usb供电电路;(4)单片机复位电路; (5)led显示、机器驱动电路;(6)矩阵按键电路;

2

图1、STC89C51

图2、电源电路和复位电路

3

图3、跳线帽

图4、译码器和数码管电路

3.1.2 主要部分器件说明

(1)LED数码管

4

图5、数码管示意图

我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。

其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。可以看出两个编码的各位正好相反。

共阳极的数码管0~f的段编码是这样的:unsigned char code table[]={ //共阳极0~f数码管编码

5

0xc0,0xf9,0xa4,0xb0,//0~3 0x99,0x92,0x82,0xf8,//4~7 0x80,0x90,0x88,0x83,//8~b 0xc6,0xa1,0x86,0x8e //c~f };

图6、数码管(共阴、共阳极)

(2)4x4矩阵键盘模块

确定矩阵式键盘上任何一个键被按下通常采用行扫描法。行扫描法又称为逐行查询法它是一种最常用的多按键识别方法。因此,我们就以行扫描法为例介绍矩阵式键盘的工作原理。

首先,不断循环地给低四位独立的低电平,然后判断键盘中有无键按下。将低位中其中一列线(P1.0~P1.3中其中一列)置低电平然后检测行线的状态(高4位,即P1.4~P1.7,由于线与关系,只要与低电平列线接通,即跳变成低电平),只要有一行的电平为低就延时一段时间以消除抖动,然后再次判断,假如依然为低电平,则表示键盘中真的有键被按下而且闭合的键位于低电平的4个按键之中任其一,若所有行线均为高电平则表示键盘中无键按下。再其次,判断闭合键所在的具体位置。在确认有键按下后 ,即可进入确定具体闭合键的过程。其方法是: 依次将列线置为低电平,即在置某一根列线为低电平时,其它列线为高电平。同时再逐行检测各行线的电平状态 ;若某行为低,则该行线与置为低电平的列线交叉处的按键就是闭合的按键。下面图7是4*4矩阵式按键硬件接法。

6

图7、矩阵键盘

3.1.3 电路原理图

图8、矩阵键盘数码管连接示意图

3.2.1 软件程序设计

开始

7

初始化 显示“00”; 等待按键。 未按下 按下开始键? 记到了 按下了 开始计数; 等待按键。 没有36 未按下 按下清零? 计数36了吗? 按下暂停 显示当前数值 清零并显示“00” 并暂停计数 ; 等待按键? 按下开始 ? 按下清零? 8

继续计数 清零显示“00”

显示数值

结束

3.2.2 程序设计内容

单片机对按键的识别的过程处理:

(1)单片机对正确识别的按键进行计数,计数满时,又从零开始计数; (2)单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。如何拆开十位和个位我们可以把所计得的数值对10求余,即可个位数字,对10整除,即可得到十位数字了。

(3)通过查表方式,分别显示出个位和十位数字。

3.2.3实验程序及注释 /*

* 数码管测试 *

* 晶振:11.0592M */

#include

9

sbit ENLED = P1^4; // sbit ADDR3 = P1^3; // sbit ADDR2 = P1^2; // sbit ADDR1 = P1^1; // sbit ADDR0 = P1^0; //声明地址 sbit EN = P1^5 ; //3-8译码器设置 sbit KeyOut1 = P2^3; //按键列扫描 sbit KeyIn1 = P2^4; sbit KeyIn2 = P2^5; sbit KeyIn3 = P2^6;

sbit KeyIn4 = P2^7; //按键输入

int x; //用x作为监测到的个数变量,但是模拟计数令x自动增加 int a,b,c, d,e,f; //用到7个中间变量

unsigned char code

Ledcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //0-9.的数码管段码

void delay(unsigned int i) // 延时 { }

void display(int num) //数码管显示 {

ADDR0 = 0; //第一个数码管地址显示各个位

ADDR1 = 0; while (i--);

10

ADDR2 = 0;

P0=Ledcode[num]; //取余数就是个位数值 delay(200);

ADDR0 = 1; //第二个数码管显示十位 ADDR1 = 0; ADDR2 = 0;

P0=Ledcode[num0/10]; delay(200);

}

main() //主函数 { KeyOut1=0; //

ADDR3 = 1; //译码器使能端 ENLED = 0;

while (1) //主循环 { display(0); //一开始显示00

if(KeyIn1==0) //第一个按键按下就开始显示 {

b=36,x=0; //循环36次,并使从0开始显示 }

while(b>0) //限制循环36次 {

if(KeyIn4==0)

11

{x++; //如果有增数量增加脉冲,循环一次,假设数量加1 b--;}

if(KeyIn2==0) //计数时如果按下K2就清零 {

b=0,x=0,c=1;

while(c>0)

{

for(a=50;a>0;a--) //每次刷新50次显示 {

display(x);

}

if(KeyIn1==0) //重新计数 {

b=36,x=0,c=c-1; }

}

}

if(KeyIn3==0) //暂停计数并显示当前数值 {

e=x,f=b,d=1;

while(d>0)

{

for(a=50;a>0;a--)

{

display(x); //显示当前数值

}

if(KeyIn1==0)

//从当前继续计数

12

{

b=f,x=e,d=d-1;

} if(KeyIn2==0)

//暂停状态下按下清零

{

// 刷新50次显示

b=0,x=0,d=d-1;

}

} }

for(a=50;a>0;a--)

{

display(x);

}

} } }

4.实验结果

(1)不停按下K4按键模拟计数脉冲。当按下启动键,可以记录显示K4启动开始后按下的次数,计数值到36自动清零,再次按下启动重新计数; (2)在计数过程中按下清零键可以清零并停止计数,再次按下开始重新计数;

(3)计数过程中按下暂停键暂停计数并显示当前数值,按下启动键继续计数;若按下请零键可以清零并停止计数; 5.实习总结

通过这次单片机实习,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成

13

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

Top