印张计数器设计一.设计任务要求1能够进行6位数码显示,显示当前的印张数;2能够进行印数的预置;3能够进行正/反计数;4能够模拟机械手取出次品;5当计数结束时,可以报警;二.硬件设计总图三.硬件部分分析说明1)、显示部分实验箱提供了6位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8位段码、6位位码是由两80C514个LED显示印张计数器运作状态键盘输入端口6个七段数码管显示数据复位监控输入印张计数中断信号输入晶振时钟输入电源LED指示灯片74LS374输出。位码经MC1413或ULN2003倒相驱动后,选择相应显示位。在实验箱中8位段码输出地址为0X004H,位码输出地址为0X002H。此处X是由KEY/LEDCS决定,参见地址译码。做键盘和LED实验时,需将KEY/LEDCS接到相应的地址译码上。以便用相应的地址来访问。将KEY/LEDCS接到CS0上,则段码地址为08004H,位码地址为08002H。2)、键盘部分1预设初始计数值:可通过数字键键入所需计量的印张数,按下“确定(A)”键后开始。2正向\反向计数:可通过键盘上的正向(B)\反向(C)键切换正向计数或者反向计数。当选择正向计数时,显示屏显示从0开始,每印刷一张,数值加1,直到遇到暂停或者到达预设值时停止计数;当选择反向计数时,显示屏从预设值开始,每印刷一张,数值减1,直到遇到暂停或者到达0时停止计数。3次品报告:当按下键盘上次品键(D)时,代表出现次品,此时直流电机停止运转,步进电机缓慢转动一周,代表机械手取出次品,之后直流电机恢复运转。4报警提示:当计数为0或者到预设值时,停止计数,发出报警,此时L2亮。5复位键(F)四.源程序#include<reg51.h>#defineLEDLen6//用6个八段管xdataunsignedcharOUTBIT_at_0x8002;//位码输出+列扫描地址xdataunsignedcharOUTSEG_at_0x8004;//段码输出xdataunsignedcharIN_at_0x8001;//行扫描地址入口xdataunsignedcharCS0832_at_0x9000;//产生电压启动直流电机xdataunsignedcharcontrol_at_0xa003;//control=0832---8255内部指令xdataunsignedcharctl_at_0xa000;//产生电流启动步进电动机codeunsignedcharLEDMAP[]={//数码显示管段码0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};codeunsignedcharKeyTable[]={//4*6键盘定义码0x16,0x15,0x14,0xff,0x13,0x12,0x11,0x10,0x0d,0x0c,0x0b,0x0a,0x0e,0x03,0x06,0x09,0x0f,0x02,0x05,0x08,0x00,0x01,0x04,0x07};//code,单片机中的ROMunsignedcharLEDBuf[LEDLen];//显示缓冲unsignedcharch;//ch=getkeyintnum,num1,num2,i;//num(用户输入数)num1(正计)num2(反计)sbitLED1=P1^0;//正计指示灯sbitLED2=P1^1;//反计指示灯sbitLED3=P1^2;//结束指示灯sbitSpeaker=P1^3;//喇叭接口//////////////////////////////////////////////////////////////////////////////延时程序voidDelay(unsignedcharCNT){unsignedchari;while(CNT--!=0)for(i=100;i!=0;i--);}voidDelay3()//喇叭延时{unsignedcharl;for(l=0;l<100;l++);}voiddelay2()////////////////////{unsignedchari,j;j=30;do{for(i=250;i!=0;i--);{TMOD=0x01;/*定时器0工作在模式1下(16位计数器)*/TH0=0xfd;TL0=0x65;TR0=1;/*启动定时器*/while(TF0==0);TR0=0;}}while(--j);}////////////////////////////////////////////////////////////////////////数码管显示voidDisplayLED()//数码管显示函数{unsignedchari;unsignedcharPos;Pos=0x20;//从左边开始显示for(i=0;i<LEDLen;i++){OUTBIT=0;//关所有八段管OUTSEG=LEDBuf[i];OUTBIT=Pos;//显示一位八段管Delay(1);Pos>>=1;//Pos的数据右移一位}}/////////////////////////////////////////////////////////////////////////////键盘unsignedcharTestKey()//键盘扫描函数(本实验属行-列扫描方式)4*6矩阵式键盘{OUTBIT=0;//列设为低电平0return(~IN0x0f);//读入键状态(高四位不用)得到第几行}unsignedcharGetKey()//读取键值函数{unsignedcharPos;unsignedchari;unsignedchark;i=6;//i代表第几列Pos=0x20;//得到第几列do{OUTBIT=~Pos;//Pos...