印章计数器设计报告 本文关键词:印章,计数器,报告,设计
印章计数器设计报告 本文简介:印张计数器设计一.设计任务要求1能够进行6位数码显示,显示当前的印张数;2能够进行印数的预置;3能够进行正/反计数;4能够模拟机械手取出次品;5当计数结束时,可以报警;二.硬件设计总图80C514个LED显示印张计数器运作状态键盘输入端口6个七段数码管显示数据复位监控输入印张计数中断信号输入晶振时钟
印章计数器设计报告 本文内容:
印张计数器设计
一.设计任务要求
1能够进行6位数码显示,显示当前的印张数;
2能够进行印数的预置;
3能够进行正/反计数;
4能够模拟机械手取出次品;
5当计数结束时,可以报警;
二.硬件设计总图
80C51
4个LED显示印张计数器运作状态
键盘输入端口
6个七段数码管显示数据
复位监控输入
印张计数中断信号输入
晶振时钟输入
电源LED指示灯
三.硬件部分分析说明
1)、显示部分
实验箱提供了6位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8位段码、6位位码是由两片74LS374输出。位码经MC1413或ULN2003倒相驱动后,选择相应显示位。
在实验箱中8位段码输出地址为0X004H,位码输出地址为0X002H。此处X
是由KEY/LED
CS决定,参见地址译码。做键盘和LED实验时,需将KEY/LED
CS
接到相应的地址译码上。以便用相应的地址来访问。将KEY/LED
CS接到CS0上,则段码地址为08004H,位码地址为08002H。
2)、键盘部分
1
预设初始计数值:可通过数字键键入所需计量的印张数,按下“确定(A)”键后开始。
2
正向/反向计数:可通过键盘上的正向(B)/反向(C)键切换正向计数或者反向计数。当选择正向计数时,显示屏显示从0开始,每印刷一张,数值加1,直到遇到暂停或者到达预设值时停止计数;当选择反向计数时,显示屏从预设值开始,每印刷一张,数值减1,直到遇到暂停或者到达0时停止计数。
3次品报告:当按下键盘上次品键(D)时,代表出现次品,此时直流电机停止运转,步进电机缓慢转动一周,代表机械手取出次品,之后直流电机恢复运转。
4
报警提示:当计数为0或者到预设值时,停止计数,发出报警,此时L2亮。
5
复位键(F)
四.源程序
#include
#define
LEDLen
6//用6个八段管
xdata
unsigned
char
OUTBIT
_at_
0x8002;
//
位码输出+列扫描地址
xdata
unsigned
char
OUTSEG
_at_
0x8004;
//
段码输出
xdata
unsigned
char
IN
_at_
0x8001;
//
行扫描地址入口
xdata
unsigned
char
CS0832
_at_
0x9000;//产生电压启动直流电机
xdata
unsigned
char
control
_at_
0xa003;//control=0832---8255内部指令
xdata
unsigned
char
ctl
_at_
0xa000;
//产生电流启动步进电动机
code
unsigned
char
LEDMAP[]
=
{//数码显示管段码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
code
unsigned
char
KeyTable[]
=
{
//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,单片机中的ROM
unsigned
char
LEDBuf[LEDLen];
//
显示缓冲
unsigned
char
ch;
//ch=getkey
int
num,num1,num2,i;//num(用户输入数)num1(正计)num2(反计)
sbit
LED1
=
P1^0;//正计指示灯
sbit
LED2
=
P1^1;//反计指示灯
sbit
LED3
=
P1^2;//结束指示灯
sbit
Speaker
=
P1^3;
//喇叭接口
//////////////////////////////////////////////////////////////////////////////延时程序
void
Delay(unsigned
char
CNT)
{
unsigned
char
i;
while
(CNT--
!=0)
for
(i=100;
i
!=0;
i--);
}
void
Delay3()
//喇叭延时
{
unsigned
char
l;
for
(l=0;
l>=
1;
//
Pos的数据右移一位
}
}
/////////////////////////////////////////////////////////////////////////////键盘
unsigned
char
TestKey()//键盘扫描函数(本实验属行-列扫描方式)4*6矩阵式键盘
{
OUTBIT
=
0;
//
列设为低电平0
return
(~IN
//
读入键状态(高四位不用)得到第几行
}
unsigned
char
GetKey()//读取键值函数
{
unsigned
char
Pos;
unsigned
char
i;
unsigned
char
k;
i
=
6;//i代表第几列
Pos
=
0x20;
//
得到第几列
do
{
OUTBIT
=
~
Pos;//
Pos
>>=
1;//向下一列扫描
k
=
~IN
}
while
((--i
!=
0)
//
键值
=
列
x
4
+
行
if
(k
!=
0)
{
i=
4;
if
(k
else
if
(k
else
if
(k
OUTBIT
=
0;
do
Delay(10);
while
(TestKey());
//
等键释放
return(KeyTable[i]);
//
取出键码
}
else
return(0xff);
}
//////////////////////////////////////////////////////////////////////////步进电动机
void
Stepmotor()
{
unsigned
char
ctl1[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//A-AB-B-BC-C-CD-D-DA-A
//双八拍,一个周期转60度,8*7.5
unsigned
int
i,j;
ctl
=
0;//步进电动机初始化-无电流
while(1)
{
for(j=0;j0)
{
LEDBuf[5]
=
LEDMAP[num2%10];
LEDBuf[4]
=
LEDMAP[(num2/10)%10];
LEDBuf[3]
=
LEDMAP[(num2/100)%10];
LEDBuf[2]
=
LEDMAP[(num2/1000)%10];
LEDBuf[1]
=
LEDMAP[(num2/10000)%10];
LEDBuf[0]
=
LEDMAP[(num2/1000000)%10];
DisplayLED();
}
else
if(num2==0)
{
LED1
=
1;
for(i=0;i=0);
LED3
=
1;
LED1
=0;
LED2
=0;
while(1){
LEDBuf[5]
=
LEDMAP[0];
LEDBuf[4]
=
LEDMAP[0];
LEDBuf[3]
=
LEDMAP[0];
LEDBuf[2]
=
LEDMAP[0];
LEDBuf[1]
=
LEDMAP[0];
LEDBuf[0]
=
LEDMAP[0];
DisplayLED();
Speaker
=
0;
Delay3();
Speaker
=
1;
Delay3();
if
(TestKey()){ch=GetKey();ch==0x0f;
then:
break;}
}
}
///////////////////////////////////////////////////////////////////////////主函数
void
main()
{
unsigned
char
i=0xff,j;
unsigned
char
no[6];//每按一个数字键的缓冲
unsigned
char
ch;//
LEDBuf1
=
0;
control
=
0x82;//8255内部指令
CS0832
=
0x80;
//直流电动机停
LED1
=0;
LED2
=0;
LED3
=0;
for(j=0;j<6;j++){
LEDBuf[j]
=
0x00;//----
no[j]=0xff;
}
DisplayLED();//显示-----
while
(1)
{
DisplayLED();
if
(TestKey())
{
ch=GetKey();
if(ch<0x0a){
//输入数据
i++;
LEDBuf[i]
=
LEDMAP[ch
no[i]=ch;
}
else
if(ch==0x0a){//确定(A)
num=0;
for(j=0;j<6;j++){if(no[j]!=0xff)num=num*10+no[j];}
}
else
if(ch==0x0b){//正计(B)
LED1
=1;
num1=0;
zhengji();
main();
}
else
if(ch==0x0c)
{//反计(C)
LED2
=1;
num2=num;
fanji();
main();
}
else
if(ch==0x0f){//复位(F)
i=0xff;
LED1=0;
for(j=0;j<6;j++)
{
LEDBuf[j]
=
0x00;
no[j]=0xff;
}
DisplayLED();
}
}
}
}
五.连线
直流电机——-8v~+8v
步进电机A——PA0
B——PA1
C——PA2
D——PA3
KEY/LED
CS——CS0
DA_CS——CS1
8255
CS——CS2
L1——P10
L2——P12
L3——P13
P32——单脉冲
P13——脉冲输入
六.程序流程图
七.设计总结与心得
单片机的学习比一般编程困难在于,要完成一个单片机系统,不仅要掌握编程技术,更为重要的是要知道如何针对实际应用的需要选择合理的单片机方案和外围器件,并为此为基础,设计硬件电路。所以,单片机是一个软硬结合的产物。对我来说,我可以制作一个产品了。也许我的实力并没有达到更高的级别,但是我会继续努力,争取了解并掌握单片机的设计理念和规则。
通过此次的微机原理课程,我感受最深的是实践与理论相结合,也是对我们以前学的知识的总结和概括,使得我们在设计的过程中体会到了电子的重要性,体会到了我们所学的知识的用途和方向。、
在学习的过程中,我发现我还有很多不足之处,我会努力弥补我的不足,继续进步。