印章计数器设计报告

时间:2021-10-16 09:46:24 来源:网友投稿

印章计数器设计报告 本文关键词:印章,计数器,报告,设计

印章计数器设计报告 本文简介:印张计数器设计一.设计任务要求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——脉冲输入

六.程序流程图

七.设计总结与心得

单片机的学习比一般编程困难在于,要完成一个单片机系统,不仅要掌握编程技术,更为重要的是要知道如何针对实际应用的需要选择合理的单片机方案和外围器件,并为此为基础,设计硬件电路。所以,单片机是一个软硬结合的产物。对我来说,我可以制作一个产品了。也许我的实力并没有达到更高的级别,但是我会继续努力,争取了解并掌握单片机的设计理念和规则。

通过此次的微机原理课程,我感受最深的是实践与理论相结合,也是对我们以前学的知识的总结和概括,使得我们在设计的过程中体会到了电子的重要性,体会到了我们所学的知识的用途和方向。、

学习的过程中,我发现我还有很多不足之处,我会努力弥补我的不足,继续进步。

推荐访问:印章 计数器 报告

版权所有:文秘范文网 2010-2024 未经授权禁止复制或建立镜像[文秘范文网]所有资源完全免费共享

Powered by 文秘范文网 © All Rights Reserved.。陕ICP备16010436号