硬件课程设计报告课题名称: 自动售货机班级: 计科2014-02班**: ***学号: ************: ***2016年12月27日摘要 1 1.设计简介 21.1设计步骤及要求 21.2设计题目 21.3设计背景 21.4面临问题 21.5解决方案 31.6设计思想 32.设计任务及要求 32.1实验目的 32.2具体要求 32.3使用硬件 43.总体方案与说明 43.1流程设计 43.1.1系统程序模块 43.1.2系统流程图 44.硬件框图与说明 54.1DAC0832芯片 54.2可编程外围接口芯片8255A 74.3128×64字符液晶显示器94.4可编程定时计数器8254 115.电路原理图与说明 135.18254定时电路 135.2LCD显示电路 145.3总的电路 146.软件流程图 147.实验代码及注释 158.结论与体会 188.1实验成果 188.1.1实验线路图 188.1.2实验结果 188.2实验体会 189.参考文献 18在日常的生活中,为了方便人群,在人群活动较多的地方放置自动售货机,解决了人群的需求,自动售货机里包括多种商品,若需要购买货物,选择自己所需的商品,按下确定键,付款后及购买成功。
通过使用自动售货机,解放了人力资源的同时,为人们提供了便利,同时由于自动售货机是集中调配,统一管理,使其成为新时期电子产品应用现实社会的体现之一。
关键词普通开关 8255A芯片 8254芯片 DAC0832芯片 LCD液晶显示器1 设计简介1.1设计步骤及要求课程安排1.指导老师布置任务,学生选题2.系统总体设计3.系统硬件设计4.系统调试5.设计报告6.检查、评定、总结1.2设计题目自动售货机1.3设计背景在日常的生活中,为了方便人群,在人群活动较多的地方放置自动售货机,解决了人群的需求,自动售货机里包括多种商品,若需要购买货物,选择自己所需的商品,按下确定键,付款后及购买成功。
通过使用自动售货机,解放了人力资源的同时,为人们提供了便利,同时由于自动售货机是集中调配,统一管理,使其成为新时期电子产品应用现实社会的体现之一。
1.4面临问题1.如何实时反应所购商品变化2.如何利用8254上升沿下降沿实现定时转动电机3.如何将商品显示在LCD显示屏上1.5解决方案1.利用8255A B口作为输入端口实时读取开关控制信息,即所购商品。
2. 将级联后的8254out1端口连至8255A输入口,通过读取输入口数据,判断8254处于高低点平状态。
3.将汉字写入系统根据开关读取状态实时显示汉字在LCD液晶显示屏。
1.6设计思想该系统通过8255A芯片的B口作为输入口,实时采集用户从开关输入的状态,当K2开关未闭合表示用户选择完毕,此时显示用户选择的商品,通过LCD液晶显示屏显示商品名称,并循环此过程,不断的显示用户选择的商品。
8254芯片定时一秒,输出口通入8255A B口不断读取PB3位状态,在高电平时,实现跟踪,低电平时通过0832芯片给电机写FF电机转动。
每一种商品对应一种转速。
2 设计任务与要求2.1实验目的1.复习8255芯片,8254芯片工作原理及使用方法2.学会使用128×64字符液晶显示屏3.锻炼小规模逻辑电路设计4.提高分析、解决问题的能力2.2具体要求本系统需要实时提供用户购买商品服务,客户在通过K0,K1开关选择实验商品时,显示屏显示商品,按下K2键即确认购买键,电动机根据所选商品转动,不同商品为了区分,使其设置为不同的电动机转速。
2.3使用硬件8255A芯片 8254芯片 DAC0832芯片 128×64字符液晶显示器3 总体方案与设计说明3.1实验流程设计3.1.1系统程序模块图3-1系统程序模块3.1.2系统流程图图3-2系统流程图4 硬件框图与说明4.1DAC0832芯片1.概述DAC0832是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
2.芯片结构图图4-1DAC0832结构图*D0~D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);* ILE:数据锁存允许控制信号输入线,高电平有效;* CS:片选信号输入线(选通数据锁存器),低电平有效;* WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;* XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;* WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。
由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
* IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化;* IOUT2:电流输出端2,其值与IOUT1值之和为一常数;* Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;* Vcc:电源输入端,Vcc的范围为+5V~+15V;* VREF:基准电压输入线,VREF的范围为-10V~+10V;* AGND:模拟信号地;* DGND:数字信号地。
4.2可编程外围接口芯片 8255A1.概述8255A是一种通用的可编程并行I/O接口芯片,它是为Intel 系列微处理器设计配套电路,也可用于其他微处理器系统中。
通过对它编程,芯片可工作于不同的工作方式。
在微型计算机系统中,用8255A做接口时,通常不需要附加外部逻辑电路就可直接为CPU 与外设之间提供数据通道,因此得到了极为广泛的应用。
2.系统结构图图4-2 8255A系统结构图由图可见,8255A由数据端口A、B、C(期中,C口被分为C 口上半部分和C口下半部分),A组和B组控制逻辑,数据总线缓冲器和读写控制逻辑。
3.控制字8255A具有3种基本工作方式。
方式0:基本输入输出方式;方式1:选通输入输出方式;方式2:双向总线I/O方式。
端口A可以工作于3种方式中的任一种;端口B只能工作于方式0和方式1,而不能工作于方式2;端口C常被分成2个4位端口,除了用做输入输出端口外,还能用来配合A口和B口工作,为这两个端口的输入输出操作提供联络信号。
4.工作方式方式0 基本输入输出方式,它适用于不需要应答信号的简单输入输出场合。
A B C口适用方式1 选通输入/输出方式。
在这种方式下,A口和B口作为数据口,均可用于输入或输出方式。
A B口方式2 双向总线方式。
A口4.3 128×64字符液晶显示器1.概述ST7920是台湾矽创电子公司生产的中文图形控制芯片,它是一种内置128×64-12汉字图形点阵的液晶显示控制模块,用于显示汉字及图形。12864A-1汉字图形点阵液晶显示模块集成ST7920驱动器,可显示汉字及图形,内置8192个中文汉字(16×16点阵)、128个字符(8×16点阵)及64×256点阵显示RAM(GDRAM)。
2.系统结构外形如图图4-3 LCD显示屏系统结构图图4-4 LCD系统图3.工作原理12864液晶显示器工作于并行模式。
8位数据线与8255A芯片8位数据口连接,控制口(E、R/W、D/I)与8255A芯片C口四位相连。
通过8255A的8位数据空向12864液晶显示器传送数据,通过C口低四位传送控制信号。
控制口E为使能端,高电位有效。
R/W为读写控制,低点位为写数据、高电位为读数据。
D/I为数据与命令口,低电位为命令、高电位为数据。
将需要显示的地址通过数据口以命令的形式送入显示器,再将需要显示的数据通过数据口以数据的形式送入显示器,即可显示内容。
表4-1 LCD汉字显示坐标图4-5 LCD中文字库截图4.4 可编程定时器计数器82541. 概述8254 芯片是一款使用十分广泛的可编程定时,计数芯片,其主要功能是定时和计数的功能。
我们的微机内的动态存储器刷新电路,系统日时钟的技术以及发声系统的声源都是由8254芯片来完成的。
2.系统结构图4-6 8254系统结构图数据总线缓冲器:数据总线缓冲器是一个三态、双向8位寄存器主要作用是与cpu进行数据交换,8位数据线D7~D0与CPU的系统数据总线连接,构成CPU和8254之间信息传送的通道,CPU通过数据总线缓冲器向8254写入控制命令、计数初始值或读取计数值。
读写逻辑:读写逻辑是芯片的控制部分,编程人员通过控制信号的选择来选择芯片的工作方式。
读/写控制逻辑用来接收CPU系统总线的读、写控制信号和端口选择信号,用于控制8254内部寄存器的读/写操作。
控制字寄存器:控制寄存器是一个只能写不能读的8位寄存器,系统通过指令将控制字写入控制寄存器,设定8254的不同工作方式。
计数器:8254内部有三个结构完全相同而又相互独立的16位减“1”计数器,每个计数器有六种工作方式,各自可按照编程设定的方式工作。
3.工作方式(1)方式0:计数到0结束输出正跃变信号方式。
(2)方式1:硬件可重触发单稳方式。
(3)方式2:频率发生器方式。
(4)方式3:方波发生器。
(5)方式4:软件触发选通方式。
(6)方式5:硬件触发选通方式。
5 电路原理图与说明5.1 8254定时电路图5-1 8254定时电路5.2 LCD显示电路图5-2 LCD显示电路5.3 总的电路图5-3 系统总电路6 软件流程图图6-1 软件流程图7 实验代码及注释#include<stdio.h>#include<conio.h>#include "ApiExusb.h"#pragmacomment(lib,"ApiExusb.lib")char lcd1[6] = {0xBF,0xC9,0xC0,0xD6,0x20,0x31};char lcd2[6] = {0xC2,0xF6,0xB6,0xAF,0x20,0x31};char lcd3[6] = {0xBA,0xEC,0xC5,0xA3,0x20,0x31};右转char lcd4[6] = {0xC4,0xCC,0xB2,0xE8,0x20,0x31};void clear();void cmdsetup();void datasetup();void main(){byte data;int i;printf("Press any key tobegin!\n\n");getch();if(!Startup()) /*打开设备*/{printf("ERROR: Open Device Error!\n");return;}//通道0工作方式3,初值1000 PortWriteByte(0x283,0x36);PortWriteByte(0x280,2000%256);PortWriteByte(0x280,2000/256);PortWriteByte(0x283,0x76);//通道2工作方式3,初值Out0PortWriteByte(0x281,1000%256);PortWriteByte(0x281,1000/256) ;//级联后的周期2秒clear();while(!kbhit()){PortWriteByte(0x28b,0x82);/*设8255为方式0,C口输出,A口输出,B口输入*/clear();PortReadByte(0x289,&data);//从B口不断地读入数据printf("%d\n", data);PortWriteByte(0x290,0x00);if(!(data & 4)) //判断B口输入数据 K2是否闭合{if(data == 0||data == 8) //根据K0 K1 由B口传入数据判断键值四种 {PortWriteByte(0x288,0x90);cmdsetup();Sleep(10);for(i = 0;i<6;i++){PortWriteByte(0x288,lcd1[i]);datasetup();}}else if(data == 1||data == 9){PortWriteByte(0x288,0x90);cmdsetup();Sleep(10);for(i = 0;i<6;i++){PortWriteByte(0x288,lcd2[i]);datasetup();}}else if(data == 2||data == 10){PortWriteByte(0x288,0x90);cmdsetup();Sleep(10);for(i = 0;i<6;i++){PortWriteByte(0x288,lcd3[i]);datasetup();}}else if(data == 3||data == 11){PortWriteByte(0x288,0x90);cmdsetup();Sleep(10);for(i = 0;i<6;i++){PortWriteByte(0x288,lcd4[i]);datasetup();}}}else //键K2按下开始电机转动{PortWriteByte(0x290,0x00);while(true){if(data & 8) //跟踪8254高电平不断获取{break;}break;}while(true) //低电平开始转动并不断检测电平{PortWriteByte(0x290,0x00);//由K0 K1 键值给电动机一个转速共四种转速if(!(data & 8)) {if(data == 4||data == 12){PortWriteByte(0x290,0xCC);}else if(data == 5||data == 13){PortWriteByte(0x290,0xEE);}if(data == 6||data == 14){PortWriteByte(0x290,0x51);}if(data == 7||data == 15){PortWriteByte(0x290,0xFF);}break;}PortWriteByte(0x290,0x00);break;}}}Cleanup();}void clear(){PortWriteByte(0x288,0x0c); cmdsetup();}void cmdsetup(){PortWriteByte(0x28a,0x00); Sleep(1);PortWriteByte(0x28a,0x04); Sleep(1);PortWriteByte(0x28a,0x00);Sleep(1);}void datasetup(){PortWriteByte(0x28a,0x01); Sleep(1);PortWriteByte(0x28a,0x05); Sleep(1);PortWriteByte(0x28a,0x01); Sleep(1);}8 结论与体会8.1实验成果8.1.1实验线路图图8-1 实验线路图8.1.2实验结果实现K0 K1 选择商品在LCD显示屏显示,而后,K2 闭合,控制电机转动,不同商品对应不同转速,转动1S。