文档库 最新最全的文档下载
当前位置:文档库 › 实训报告技术文档

实训报告技术文档

柳州运输职业技术学院

《单片机应用技术2实训》报告书

实训题目计算器设计与制作流水线在线产品检测系统的设计和制作

系别电子工程系

专业应用电子技术

年级 08级

姓名

指导教师黄莺

目录

第一章简单计算器的设计与制作流水线在线产品检测系统的设计与制作 (4)

1.1 计算器系统人流量统计基本方案 (4)

1.2 模块方案选择与论证 (4)

1.2.1 单片机方案选择和论证 (4)

1.2.2 显示方案 (5)

1.2.3 输入方案 (5)

1.2.4 电源提供方案 (5)

第2章计算硬件设计与实现 (6)

2.1 计算器的人流量的基本组成部分 (6)

2.1.1 电源电路图 (6)

2.1.2 显示电路图 (7)

2.1.3 MAX7219使用简介 ............................... 错误!未定义书签。

2.1.4 KA2184使用简介 ................................ 错误!未定义书签。

2.1.5 红外线探测、按键、控制电路 (8)

2.1.6 发射电路....................................... 错误!未定义书签。第3章计算器人流量的软件设计 (10)

3.1 程序总流程图 (10)

3.1.1 计算器人流量总流程图........................... 错误!未定义书签。

3.1.2 主程序流程图................................... 错误!未定义书签。

3.2 软件编程............................................ 错误!未定义书签。第4章参考文献 (12)

第5章致谢词 (12)

附录1元件清单 (13)

附录2印制版图 (13)

附录3总程序.......................................................................................... 错误!未定义书签。

计算器系统设计与制作流水线在线产品检测系统设计与制作

摘要:本系统采用AT89S52单片机为控制核心, 1602显示模块、触点开关和一个红外线发射管、两个红外线接收器组成,两个红外线接收器相距一定距离,当产品从一个红外线探测器中走过时锁定其进入或出去,经过另外一个红外线探测器时完成进入或出去一次计数。可广泛用于生产流水线产品数量统计、以及及车站、商场等公共场合的客流量统计等。本设计从一个设定值开始计数,超过99时从0开始,1602液晶显示,通过键盘设定上下限,大于或小于设定值时声光报警。

关键词:微处理器AT89S52 1602 红外对管TR38

第1章流水线在线产品检测的设计与制作方案选择与论证

1.1 计算器功能系统的设计与制作的基本方案流水线在线产品检测系统的设计与制作的基本方案

流水线在线产品检测系统的设计与制作可以划分为电源电路、发射、接收电路按键电路、显示电路声音电路。总框图如图(1-1):

图1-1 总方框图

从图1-1中看出经过红外对管的检测后,通过AT89S51的控制,输出到1602,1602经过字库译码显示计数,按键具有调节计数功能,功能齐全,是一个很好的流量计数产品。

为了更好地实现各模块的功能,分别作了几种不同的设计方案和论证,我选择了较好的方案实现。

1.2 模块方案选择与论证

1.2.1 单片机方案选择和论证

方案一:采用MCS-51系列单片机。MCS-51系列单片机是8位单片机,高性能CMOS8位微处理器,是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。它具有4K字节可编程FLASH存储器(寿命:1000写/擦循环), 128*8位内部RAM两个16位定时器/计数器,低功耗的闲置和掉电模式且支持在线仿真。T89C51适合程序小,储存器容量小使用,从价格方面考虑比较廉价。

方案二:采用陵阳61单片机(SPCE061A)作为系统的控制器。该单片机有32位通用可编程输入/输出端口,2个10位DAC(数-模转换)输出通道,7通道10位电压模-数转换器(ADC)和单通道语音模-数转换器。具有RAM、ROM空间大、指令周期短、运算速度快、低功耗、低电压等特点,其中声音模-数转换器输入通道内置麦克风放大器自动增益控制(AGC)功能;可编程音频处理, 使用凌阳音频编码SACM_S240方式(2.4K位/秒),能容纳210秒的语音数据。但价钱较高。

由于方案一价格廉价,本系统程序小,储存器容量小,能实现系统功能,故采用方案一。

1.2.2 显示方案

方案一:采用LCD液晶显示器。LCD有明显的优点:微功耗、尺寸小,超薄轻巧、显示信息量大、字迹清晰、显示稳定美观。LCD是以点阵模式显示的,在显示上很方便,但在各种符号的显示上因为需要利用控制芯片创建字符库,工作量大,占用资源较多,但手上有闲置不有的。

方案二:采用传统的数码管显示。数码管具有低压低耗能、寿命长、对外界环境要求低等特点,而且其精度比较高。采用BCD编码方式显示数字,程序编译简单,资源占用少.显示的电路驱动芯片采用MAX7221。MAX7221芯片是用于动态扫描显示驱动的芯片。该芯片的特点是利用一块芯片就能完成8位字数据和8位线数据的驱动,使得电路紧凑。多芯片级联时,采用串行输入输出,可节省CPU的数据接口和接口芯片,但做硬件麻烦,显示单一。

权衡利弊,第一种方案可以很好地实现本系统的要求,我决定采用方案一实现本系统的显示功能。

1.2.3 输入方案

本设计要求系统有手动式时间调节,手动计数功能,讨论了以下三种方案:方案一:采用独立式按键,直接在I/O口线上接上按键开关。设计时考虑精简和优化电路、程序和I/O口资源数。因剩余的口资源还比较多,所以此方案有一定的优势。

方案二:采用矩阵式按键。该方案的优点是使用灵活可编程,占用I/0口资源比较少。若用该方案,可为其它功能提供更多的I/0资源,但电路和程序比较复杂。

由于本系统使用单片机的端口较少,单片机端口剩余较多,故采用方案一。

1.2.4 电源提供方案

为使模块稳定工作,需要有可靠的电源。我考虑了两种电源方案。

方案一:采用普通3节1.5V碱性电池,具有使用方便,取材容易,电源无波纹,无电源干扰,但由于电池使用时间长,电能下降影响红外线发射接收的灵敏度,故不采用。

方案二:通过变压器降压然后经过整流滤波稳压调到所需的电压,该方案具

有供电能力强,但要制作硬件复杂麻烦。

经过考虑系统的稳定性故采用第二种方案。

第2章计算器硬件设计与实现人流量硬件设计与实现

2.1 计算器人流量的基本组成部分

本系统可以划分为电源电路、显示电路图、红外探测电路、控制电路、按键电路。

2.1.1 电源电路图

原理: 由市电经过变压器降压后,通过桥堆整流滤波,稳压后滤波输出,变压器采用9伏输出,元件采用4个1N4007整流,1000UF、0.47UF稳压管输入滤波,使用7805稳压,100UF、0.1UF滤波输出。

图2-1-1 电源电路

2.1.2显示电路图

原理:通过单片机程序控制液晶模块字库显示数字、字符。

2.1.2显示电路图

2.1.3发射模块电路图

原理:通过NE555产生38KHz载波,经过三极管放大驱动红外发射管发射红外线信号。

2.1.4发射电路图

2.1.5接收电路图

原理:使用TR38红外线接收一体化器件,当接收到38KHz红外线信号时输出低电平,通过三极管放大驱动单片机端口。

图2-1-5 接收图

2.1.6按键电路

原理:采用独立式按键,一个I/O一个按键

图2-1-6 按键电路

2.1.7硬件原理电路

图2-1-7 硬件原理总电路

2.1.8最小系统电路PCB

1011121314151617181920

40

39

38

3736353433323130292827262524232221

10101010

图2-1-8 最小系统PCB

2.1.9发射电路PCB

32

112

1

2

1

2

1

2

12

21

1

2

3

4

4

3

5

1

2

6

8

9

10

7

12

3

1

2

3

2

1

1

21

2

56784

321

图2-1-9 发射电路PCB

第3章 计算器 人流量的软件设计

3.1 主程序流程图

图3-1 主程序流程图

图3-2子程序按键流程图

图3-2子程序进入流程图图3-2子程序流出流程图

单片机采集到的数据由软件完成对它进行判断、计数、调整,然后送液晶显示。

3.2.2测试、数据及结果分析

1、测试红外线接收、发射电路

单独给红外线接收、发射电路上电、38KHz方波信号,结果是无障碍物时输出低电平,有障碍物时输出高电平。符合设计要求。

2、单片机最小系统测试

接好单片机并烧入简单流水灯程序进行测试,结果现象与程序所描述一样,符合设计要求。

3、测试整体电路

系统上电,刷写好程序即可开始测试,观测各按键是否能完成软件所要求的功能,是否能正常计数。测试结果正确。

第4章参考文献

[1] 黄庆华,张永格主编.《单片机开发技术与实训》.电子工业出版社。

[2] 李铁香,赵伟军,王泰.《单片微计算机原理、开发及应用》.高等教育出版社。

[3] 刘树林,高树德.《低频电子线路》.电子工业出版社。

[4] 梁伟,艾学忠,施云贵.《电子设计与实践》.中国电力出版社。

[5] 赵克林,姜春茂,韩忠东.《C语言程序设计教程》.北京工业大学出版社。

第5章致谢词

在同组3人的紧密团结,精诚合作下,本设计还存在着一些值得改进的地方,如:测量精度不是很准确等问题。小组基本上完成了设计任务。并有所收获,这是与大学二年里的理论学习,平时的电子设计训练及老师的教导分不开的。我们除了增强了动手能力,加深了对理论知识的认识,还学到了许多大学课程学不到的知识。我们感到:通过这次毕业设计培养了我们吃苦耐劳、互相协作的精神;培养了自学的能力、独立工作的能力、综合应用知识的能力和实践动手的能力;激发了更高的学习积极性;增强了自信心,这是一次难得的实践机会。同时,我也感悟到:收获就要有付出,一份耕耘,一份收获,勤奋出成绩,勤奋出人才。

附录1 元件清单

元件名称 数量/单位

元件名称 数量/单位

元件名称 数量/单位

AT89S52 1

IC40 1

1602液晶显示 1

稳压管7805 1 16V10UF 2 TR38 2 红外发射管

1 9013 5 NE555 1

12M 晶振

1

CC1 104

4

附录2 印制版图

图一 电源、最小系统PCB 图

10

111213141516171819

2040

39

38

37

36353433

3231

302928

272625242322

21

10

1010

10

图三 发射电路PCB 图

1

2

34

8

765

2

1

21

1

2

3

2

1

3

2

1

10

9

8

7

6

2

1

5

3

4

4

3

2

1

1

22

1

2

1

2

1

2

1

2

112

3

#include #include #include "intrins.h"

#define uint unsigned int #define uchar unsigned char typedef unsigned char BYTE; typedef bit BOOL;

sbit lcden=P2^5; //定义引脚 E 使能 sbit rs=P2^3; sbit rw=P2^4; sbit busy=P0^7; sbit p33=P3^7;

char i,j,temp,num,num_1;

long a,b,c; //a,第一个数 b,第二个数 c,得数

uchar flag,fuhao;//flag 表示是否有符号键按下,fuhao 表征按下的是哪个符号

uchar code table[]={

7,8,9,0, 4,5,6,0, 1,2,3,0, 0,0,0,0 };

uchar code table1[]={

7,8,9,0x2f-0x30, //按键标值 0x2f-0x30是将字符转化为数字,与后面的0x30+i 抵消,得i 值 4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30 //0x01是清屏命令

};

void delay(uchar z) // 延时函数

{

uchar y;

for(z;z>0;z--)

for(y=0;y<220;y++);

}

BOOL check() // 测试LCD忙碌状态

{

BOOL result;

rs = 0;

rw = 1;

lcden = 1;

delay(2);

result = (BOOL)(P0 & 0x80);

lcden= 0;

return result;

}

write_com(BYTE com) // 写指令函数

{

while(check());

rs=0;

rw=0;

lcden=0;

P0=com; //com指令付给P0口

delay(3);

lcden=1;

delay(3);

lcden=0;

}

write_date(BYTE date) // 写数据函数

{

while(check());

rs=1;

rw=0;

lcden=0;

P0=date;

delay(3);

lcden=1;

delay(3);

lcden=0;

}

void init() //初始化

{

lcden=1; //使能信号为高电平

write_com(0x38); //功能设置命令:8位,2行DDRAM的地址

write_com(0x0e); //显示开,光标开,不闪烁

write_com(0x06); //增量方式不移位

write_com(0x80); //设置访问地址*/

num_1=0;

i=0;

j=0;

a=0; //第一个参与运算的数

b=0; //第二个参与运算的数

c=0; //结果值

flag=0; //flag表示是否有符号键按下,

fuhao=0; // fuhao表征按下的是哪个符号

}

void keyscan(void)// 键盘扫描程序

{

p33=0;

P1=0xfe;

if(P1!=0xfe)

{

delay(20);//20ms

if(P1!=0xfe)

{

temp=P1&0xf0;

switch(temp)

{

case 0xe0:num=0;

break;

case 0xd0:num=1;

break;

case 0xb0:num=2;

break;

case 0x70:num=3;

break;

}

}

while(P1!=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9'

{

if(j!=0)

{

write_com(0x01); //清屏命令

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num]; //a的初值为'0',结果为输入a值

}

else //如果按过符号键

{

b=b*10+table[num]; //b的初值为'0' ,结果为输入b值

}

}

else //如果按下的是'/'

{

flag=1;

fuhao=4; //4表示除号已按

}

i=table1[num];

write_date(0x30+i);//将数字转化为字符,对应前面的table1中的i-0x30 }

P1=0xfd;

if(P1!=0xfd)

{

delay(15);

if(P1!=0xfd)

{

temp=P1&0xf0;

switch(temp)

{

case 0xe0:num=4;

break;

case 0xd0:num=5;

break;

case 0xb0:num=6;

break;

case 0x70:num=7;

break;

}

}

while(P1!=0xfd);

if(num==4||num==5||num==6)//如果按下的是'4','5'或'6' {

if(j!=0)

{

write_com(0x01); //清屏命令

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num]; //输入a值

}

else//如果按过符号键

{

b=b*10+table[num]; //输入b值

}

}

else//如果按下的是'*'

{

flag=1;

fuhao=3;//3表示乘号已按

}

i=table1[num];

write_date(0x30+i);

}

P1=0xfb;

if(P1!=0xfb)

{

delay(15);

if(P1!=0xfb)

{

temp=P1&0xf0;

switch(temp)

{

case 0xe0:num=8;

break;

case 0xd0:num=9;

break;

case 0xb0:num=10;

break;

case 0x70:num=11;

break;

}

}

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3' {

if(j!=0)

{

write_com(0x01); //清屏

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else if(num==11)//如果按下的是'-'

{

flag=1;

fuhao=2;//2表示减号已按

}

i=table1[num];

write_date(0x30+i);

}

P1=0xf7;

if(P1!=0xf7)

{

delay(15);

if(P1!=0xf7)

{

temp=P1&0xf0;

switch(temp)

{

case 0xe0:num=12;

break;

case 0xd0:num=13;

break;

case 0xb0:num=14;

break;

case 0x70:num=15;

break;

}

}

switch(num)

{

case 12:

{

write_com(0x01);

a=0;

b=0;

flag=0;

fuhao=0;

} //按下的是"清零"

break;

case 13: //按下的是"0"

{

if(flag==0)//没有按过符号键

{

a=a*10;

write_date(0x30);

}

else if(flag==1)//如果按过符号键

{

b=b*10;

write_date(0x30);

}

}

break;

case 14:

{

j=1;

if(fuhao==1)

{

write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处

write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格c=a+b;

while(c!=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d); //再写"="

a=0;b=0;flag=0;fuhao=0;

}

else if(fuhao==2)

{

相关文档