1.背景及意义
在工业生产的早期阶段,人们对检测对象的数据获取和处理都是靠人工来完成的,甚至处理随机误差和系统误差都是以人工方法进行的。随着全球化和市场竞争的加剧,企业需要快速、准确地处理大量零部件,以满足不断变化的市场需求。然而传统的计数和检测方法往往效率低下,且容易出错,无法满足现代制造业的需求,因此,迫切需要智能产线零部件自动计数系统的技术诞生。该技术基于微处理器的智能检测系统,包含了测量检验、信息处理和决策输出等多种内容,其范畴远超过传统的“测量”。该技术可以对生产线上的零部件进行自动计数和检测,筛选合格与不合格产品,从而实现生产流程的自动化和智能化。这不仅提高了生产效率,降低了人工成本,还能确保产品的质量稳定和一致性。同时,这种系统还可以为产品设计和生产提供宝贵的数据支持,帮助企业优化产品性能和质量,为企业提供了一种高效、准确的解决方案。
总之,智能产线零部件自动计数系统的研究和发展,符合我们推动制造业转型升级的导向。通过引入先进技术,提高生产效率和产品质量,有助于企业实现可持续发展,为经济发展做出贡献。
2.设计目标
1)通过按键电路设置检测零件的个数,并通过LCD显示;
2)通过脉冲信号模拟产线零部件的计数信号;
3)单片机接收来自电机电机电路的脉冲信号并进行计数;
4)当零部件数量达到设定值后,系统停止工作,蜂鸣报警其发出声报警。
3.设计内容
3.1 硬件设计
3.1.1各部件工作原理
单片机芯片内部逻辑结构
1.中央处理器(CPU):中央处理器简称CPU,是单片机的核心,完成运算和控制操作。按其功能,中央处理器包括运算器和控制器两部分电路。
2.运算器电路:运算电路时单片机的运算部件,用于实现算术和逻辑运算。运算电路以ALU为核心,基本的算术和逻辑运算均在其中进行,包括加、减、乘、除、增量、减量、十进制调整、比较等算术运算,与、或、、异或等逻辑运算,左、右、移位和半字节交换等操作。运算和操作结果的状态由状态寄存器(PSW)保存。
3.控制器电路:控制电路时单片机的指挥控制部件,保证单片机各部分能自动而协调地工作。单片机执行指令是在控制电路的控制下进行的。首先从程序存储器中读出指令,送指令寄存器保存,然后送指令译码器进行译码,译码结果送定时控制逻辑电路,由定时控制逻辑产生各种定时信号和控制信号,再送到系统的各个部件去进行相应的操作。这就是执行一条指令的全过程,执行程序就是不断重复这一过程。
4.内部数据存储器:内部数据存储器包括RAM(128 x8)和RAM地址寄存器等。实际上80C51芯片中共有256个RAM单元,但其中后128单元被专用寄存器占用,供用户使用的只是前128单元,用于存放可读写的数据。因此,通常所说的内部数据存储器是指前128单元,简称“内部RAM”。
5.内部程序存储器:内部程序存储器包括ROM(4Kx8)和程序地址寄存器等。80C51共有4KB掩膜ROM,用于存放程序和原始数据。因此称之为程序存储器,简称“内部ROM”。
6.定时器/计数器:出于控制应用的需要,80C51共有两个16位的定时器/计数器,以实现定时或计数功能,并以其定时或计数结果对单片机进行控制。
7.并行I/O口:MCS-51共有4个8位的I/O口(P0、P1、、P2、P3),以实现数据的并行输入输出。
8.串行口:MCS-51单片机有一个全双公的串行口,以实现单片机和其它数据设备之间的串行数据传送。该串行口功能较强,即可作为全双工异步通信收发器使用,也可作为同步移位器使用。
9.中断控制系统:MCS-51单片机的中断功能较强,以满足控制应用需要。80C51共有5个中断源,即外中断2个,定时/计数中断2个,串行中断1个。全部中断分为高级和低级共两个优先级别。
10.时钟电路:MCS-51芯片的内部有时钟电路,但石英晶体和微调电容需外接,时钟电路为单片机产生时钟脉冲序列,典型的晶振频率为12MHZ。
11.位处理器:单片机主要用于控制,需要有较强的位处理功能,因此位处理器是它的必要组成部分,在一些书中常把位处理器称为布尔处理器。位处理器以状态寄存器中的进位标志位C为累加器,可进行置位、复位、取反、等于“0” 转移、等于“1”转移且清“0”以及C可寻址位之间的传送、逻辑与、逻辑或等位操作。位处理操作也是通过运算器实现的。必须特别指出,位处理器是单片机的重要内容,因为它是单片机实现控制功能的保证。
12.总线:上述这些部件都是通过总线连接起来,才能构成一个完整的单片机系统。总线结构减少了单片机的连线和引脚,提高了集成度和可靠性。从上述内容可以看出,虽然MCS-51只是一个芯片,但“麻雀虽小五脏俱全”,作为计算机应该具有的基本部件在单片机中几乎都包括,因此,实际上它已经是一个简单的微型计算机系统了,应当按计算机系统的概念来理解单片机。
本设计采用的是AT89C51,它的主要性能:
·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
AT89C51管脚图及各管脚功能
AT89C51管脚图
AT89C51管脚功能如下:
·VCC:供电电压。
·GND:接地。
·P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
·P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
·P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
·P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
·P3口也是复用口,可作为AT89C51的一些特殊功能口,如下:
·P3.0 RXD:串行输入口;
·P3.1 TXD:串行输出口;
·P3.2 /INT0:外部中断0;
·P3.3 /INT1:外部中断1;
·P3.4 T0:计时器0外部输入;
·P3.5 T1:计时器1外部输入;
·P3.6 /WR:外部数据存储器写选通;
·P3.7 /RD:外部数据存储器读选通;
同时,P3口为闪烁编程和编程校验接收一些控制信号。
·RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
·ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
·PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
·EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
·XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
·XTAL2:来自反向振荡器的输出。
BUTTON(按键)
“BUTTON”是一种基本的元件,其主要功能是控制电路的开关,实现电路的各项功能对于"BUTTON"元件,其工作原理相对简单。当按钮未被按下前,电路是断开的,按下按钮后,按钮的触头被连通,电路也被接通。这种情况对应的是常开触头(NO)。相反,如果按钮的触头原本是闭合的,那么在按下按钮后,触头被断开,电路也被分断,这种情况对应的是常闭触头(NC)
BUZZER(蜂鸣器)
“BUZZER”的主要功能是发出声音。在Proteus中,"BUZZER"通常被用作一种测试工具,用来验证电路的工作状态。当你在Proteus中使用“BUZZER”时,它会发出一种短暂的声音,以帮助你确定电路是否正常工作。"BUZZER"的工作原理主要依赖于其驱动方式。在Proteus中,"BUZZER"通常被用作一种测试工具,用来验证电路的工作状态。使用“BUZZER"时,它会发出一种短暂的声音,以帮助确定电路是否正常工作。"BUZZER"的驱动方式主要分为两种:有源和无源。有源”BUZZER"只需要加电压就可以发出声音,而无源”BUZZER”则需要有特定频率的信号才能发出声音。
(4)CAP(无极性电容)
无极性电容器是一种电容器,它没有正负极性。这意味着这种电容器既没有正电极也没有负电极,因此可以在任何方向上连接到电路中为容由人工无极性电容器的工作原理无极性电容器主要用于纯交流电路,并且由于其适中的电容量,也可以用于高频滤波。它们不会根据施加的直流电压的极性来阻止电流流动,而是像所有电容器一样,基本上会阻止直流电流。
(5)CRYTAL(晶体振荡器)
“CRYTAL”通常被用作晶振元件的标识符。晶振(Crystal)是一种电子元件,它能产生稳定的频率信号,对于许多电子设备来说是非常重要的基础部件。在Proteus中,晶振的主要作用是提供稳定的时钟信号,用于驱动整个电路的运行。在实际的电路设计中,晶振的选取和布局是非常关键的。因为晶振的特性,比如频率、精度、温度系数等,都会直接影响到最终电路的性能。所以在使用Proteus进行电路设计时,需要仔细选择合适的晶振,并合理安排其位置,以确保电路的正常工作。
LED(发光二极管)
LED(发光二极管)的作用主要是作为指示灯,用于显示电路的工作状态。当电路中的电流流过LED时,LED就会发出光亮,从而反映出电路是否正常工作。LED的工作原理是基于半导体材料的特性。当电子与空穴复合时,会释放出能量,这些能量会转化为光能并发射出来,形成可见光。因此,LED可以看作是一种能够将电能直接转换成光能的装置。在电路图中,电流经过一个电阻后,才到达LED灯的,这个电阻在电路中起到限流的作用,防止电流过大损坏LED。值得注意的是,LED的亮度并不是由其本身决定的,而是由外部电路决定的。例如,通过改变电源电压、调整电阻值等方式,可以调节LED的亮度。此外,Proteus还支持对LED进行颜色设置,使得在仿真过程中,LED的颜色可以随着电路的工作状态而变化,更加直观地反映出电路的工作状态。
LM016L(LCD显示屏)
LMO16L是一款液晶显示模块,其主要的工作原理是利用HD44780控制器进行控制。HD44780具有简单而功能较强的指令集,可以实现字符移动、闪烁等功能。LMO16L的工作原理主要体现在以下几个方面:
1.通信方式:LMO16L与单片机MCU(Microcontroller Unit)的通信可以采用8位或者4位并行传输两种方式。
2.控制指令:通过对HD44780写入控制指令,HD44780产生显示驱动信号来驱动LMO16L0。
3.显示功能:HD44780的控制指令主要有:清除显示(Clear Display)、地址归位(Return Home)、输入模式设定(Entry Mode Set)、显示开/关控制(Display On/Off Control)、功能设定。
4.引脚功能:LMO16L的引脚功能包括读/写以及指令/数据功能,还有控制指令的发送。
5.液晶显示:LMO16L液晶模块采用HD44780控制器,可以实现字符移动、闪烁等功能,并且可以存储80个字符码。
(8)MOTOR(步进电机)
MOTOR通常代表步进电机。步进电机是一种将电脉冲信号转换为角位移的执行机构,通俗一点讲,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。可通过控制脉冲数来控制角位移量,从而达到准确的定位目的,也可通过控制脉冲的频率来控制电机的转速和加速度;从而达到调速的目的在Proteus中,步进电机的工作原理主要体现在以下几个方面:
1.工作方式:步进电机有多种工作方式,比如三相单三拍、三相双三拍和三相六拍等。每一种工作方式都有其特定的脉冲序列和频率,不同的工作方式会导致电机的转速和转向有所不同。
2.控制指令:步进电机的转速和转向主要由控制指令决定。常见的控制指令包括脉冲频率、脉冲数量和脉冲宽度等。这些参数的不同组合可以实现不同的运动效果。
3.步进角度:步进电机每转动一圈,需要接受多少个脉冲。这个数值被称为步进角度,步进角度的大小决定了电机的转动速度和精度。步进角度可以通过公式计算得出,其中m为定子绕组的相数,z为转子的齿数。
(9)PNP(三极管)
PNP三极管主要用于放大和开关操作。PNP三极管的工作原理是,当基极电压低于0.7V时,流过集电极的电流瞬间增大PNP三极管的工作状态主要取决于基极和发射极之间的电压差。当基极电压低于0.7V时,三极管导通,此时流过集电极的电流增大。PNP三极管的工作原理可以概括为:当基极电压低于0.7V时,流过集电极的电流瞬间增大。三极管做开关时,工作在截止和饱和两个状态;通过控制三极管的基极电压Ub来控制三极管的导通与断开。PNP三极管的工作原理与NPN三极管有所不同。NPN三极管的工作原理是,当基极电压大于0.7V时,三极管导通,当基极电压小于0.7V时,三极管截止在实际电路设计中,PNP三极管常被用作开关,其工作原理是通过改变基极电压来控制三极管的导通与断开,从而实现电路的开关控制。
(10)POP-HG(滑动电阻)
POT-HG代表滑动变阻器。滑动变阻器在电路中主要用于调节电阻值,从而改变电流或电压,进而影响电路的性能。
POT-HG的工作原理是,你可以在原理图中插入POT-HG元件,然后通过拖动滑块来改变电阻值。POT-HG的电阻值可以在运行时动态改变,你可以通过鼠标左键单击滑块中心,然后按住并拖动滑块来改变电阻值。此外,POT-HG的调整精度为1%,也就是说,可以精确地调整电阻值到满刻度的1%左右。在实际应用中,POT-HG可以用于许多场景,例如作为反馈控制器,调节某个设备的输出,或者作为调节灯光亮度的装置等。
(10)RELAY(继电器)
继电器的主要作用是实现电路的开关控制,特别是在需要控制大功率设备的情况下,继电器能够发挥出其优势。继电器的工作原理基于电磁效应,当电流通过继电器的线圈时,会产生磁场,使得继电器的触点发生变化,从而实现电路的开关控制。在实际应用中,继电器常常被用于控制大功率设备的开关,例如驱动电灯泡、电机等。例如,在Proteus中,你可以通过5V和GND输入信号来控制通断12V供电的继电器电路来点亮和熄灭LED。此外也可以通过三极管放大电流,驱动继电器工作。这种方式的工作原理是通过三极管将1O口输出的电流放大来驱动继电器工作。
RESSPACK-8(排电阻)
在Proteus中,排阻(Resistor Pack)是一种特殊的电阻,它是将若干个参数完全相同的电阻集中封装在一起,组合制成的。排阻一般应用在数字电路上,比
如作为某个并行口的上拉或者下拉电阻用排阻的工作原理是,当我们在原理图中使用排阻时,它会被视为一组相同的电阻,这样就可以方便地控制整个电路的电阻值。例如,如果我们需要设置一个特定的电阻值,我们只需更改排阻的设定值,而不必单独更改每个电阻的值此外,排阻还可以用于模拟实际电路中的电阻连接方式。例如,在某些情况下,我们可能希望模拟一个串联或并联的电阻网络,这时就可以使用排阻来完成总的来说,排阻在Proteus中的主要作用是简化电路设计过程,提高电路设计效率,同时也可以模拟实际电路中的电阻连接方式,使电路设计更加真实可靠。
3.1.2硬件接线图
3.1.3 各硬件模块的功能介绍
(1)系统控制电路:
该系统控制电路的功能如下
1.管理和协调各部件的工作:系统控制电路负责管理和协调单片机内部的各种功能模块,如CPU、存储器、输入/输出端口等,确保它们能够有序地协同工作,从而实现产品计数,报警,实时显示产品计数数量等功能。
2.控制系统的运行状态:系统控制电路通过控制各个模块的工作状态,比如开启连接在9号口的复位电路便可实现。调整模块之间的工作关系等,便可控制整个系统的运行状态
3.处理和响应外部事件:系统控制电路还负责接收和处理来自外部的各种事件,比如按键按下P1.3口的开关接通电源,整个计数系统便会开始工作。
4.提供系统的基本功能:系统控制电路不仅要保证单片机的基本功能正常运行,还要支持一些高级功能,比如定时、计数、数学运算、逻辑运算等。
(2)按键电路:
按键电路的主要作用包括:
1.接收用户操作输入:按键电路可以接收用户按下的按键信号,将其转换为数字信号,并将其传递给单片机进行处理。
2.触发设置计数初值操作:当设置按键被按下时,按键电路便会进入输入状态,此时只要根据需求按下对应的数字按钮便可输入用户需要的初值(初值最大值为9999)。
4.提供用户交互界面:按键电路是单片机与用户之间的交互界面,通过按键的不同状态,可以实现用户输入不同初值的功能。
(3)LCD显示电路:
LCD显示电路
的主要作用包括:
1.显示数据和程序信息:LCD显示电路可以将单片机内部的数据和程序信息显示出来,比如显示当前计数的具体数值,设置的计数初值。
2.提供用户交互界面:LCD显示电路是单片机与用户之间的另一个交互界面,通过显示不同的信息,可以向用户反馈实时计数系统的数值。
3.支持多种字符和符号的显示:LCD显示电路支持多种字符和符号的显示,可以显示数字、字母、符号等。
(4)蜂鸣器电路:
当用户根据需求设置好计数系统初值后按下开始按钮计数系统便开始工作,当实际计数数值与设置的初值相等时,蜂鸣报警器接收到来自计数器T1的信号后便开始报警,按下复位按钮后报警停止。
(4)LED指示电路:
该LED灯连接单片机的P1.4口,一旦单片机开始工作该LED便常亮。
(5)电机电路:
产品到达以脉冲的形式进行模拟,通过调整步进电机的转速和转动的角度,便可形成有规律的脉冲,脉冲由P3.2口进行接收,当计数数值达到设定值后,便会触发外部中断0,外部中断0被触发之后,计数系统将停止工作,蜂鸣报警器将发声报警,提醒工人计数工件已经到达设定值。
3.2 软件设计
3.2.1 程序代码图
(3)软件流程图:
4.设计结果
4.1仿真结果
(1)实验开始前,各装置准备就绪:
(2)实验过程,各装置运行状态:
(3)实验结束时,产品数达到设定值,系统停止工作,触发蜂鸣器报警报警,LED工作指示灯一直亮红灯:
4.2 结果分析
在按下开始按钮前,需要对计数系统进行初值设置,按下按键电路中的设置按钮后,便可进入设置模式,根据用户的需求设置好初值后按下按键电路中的确定键后,初值便设置完成。LCD显示屏上的“set number”处便会带有设置好的初值,按下按钮后,计数系统便开始工作。产品到达以脉冲的形式进行模拟,通过调整步进电机的转速和转动的角度,便可形成有规律的脉冲,脉冲由P3.2口进行接收,当计数数值达到设定值后,便会触发外部中断0,外部中断0被触发之后,计数系统将停止工作,蜂鸣报警器将发声报警,提醒工人计数工件已经到达设定值。
5.总结
智能产线零部件自动计数系统技术,是为提高生产效率、降低人工成本、保证产品质量和实现可追溯性而设计的。通过自动化计数和检测,可以快速准确地识别出合格零部件,避免人工计数和检测的误差和延误。同时,该系统还可以实现生产过程的可追溯性,方便查找问题和进行质量追溯。
该技术是通过AT89C51单片机为基础控制装置实现全部功能。单片机用来计算产线上到达的零部件总数数量,并将零部件总数数量通过LCD显示屏显示出来,该技术还为计数系统设置了初值,当实际计数数值达到设置的初值时时,系统自动停止工作,并触发蜂鸣报警以提示工人产品数量已达到上限。
在设计完该技术后的仿真模拟中,以脉冲来模拟产品数量,LCD显示屏显示的两行字符分别显示设置初值和实际计数值。总之,智能产线合格零部件自动计数与检测系统技术是解放生产力,降低人工成本和提高零部件计数和检测准确率的重要技术段,同时也是实现工业4.0和智能制造的重要技术手段之
一,该技术已基本设计完成,功能基本达到预先要求,在完成该设计过程中,不仅再一次强化了我对于微机原理理论知识的理。
单片机程序如下
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcd_rs=P1^0;
sbit lcd_rw=P1^1;
sbit lcd_en=P1^2;
sbit qt=P1^3;
sbit bb=P3^5;
sbit out=P3^6;
sbit led=P1^4;
uint k,qidong,wei=15,kai=0;
uint q=2;
uint she,b=0,a,a1,a2,a3,a4,b1,b2,b3,b4,c,c1;
uint gw,sw,bw,qw;
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcd_rs=0;
lcd_en=0;
lcd_rw=0;
P0=com;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void write_data(uchar date)
{
lcd_rs=1;
lcd_en=0;
lcd_rw=0;
P0=date;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void write_sw(uchar add,uchar date)
{
uchar qian,bai,shi,ge;
qian=date/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
write_com(0x80+add);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_s(uchar add,uchar date)
{
write_com(0x80+0x40+add);
write_data(0x30+date);
}
void init()
{
lcd_rw=0;
lcd_en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void write_str(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
write_com(0x80 + x);
}
else
{
write_com(0xC0 + x);
}
while (*s)
{
write_data( *s);
s ++;
}
}
void write_char(unsigned char x,unsigned char y,unsigned char z)
{
if (y == 0)
{
write_com(0x80 + x);
}
else
{
write_com(0xC0 + x);
}
write_data(z);
}
void kscan(void)
{
unsigned char i, temp;
for(i=0;i<4;i++)
{
P2=_crol_(0xfe,i);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
/*1*/case 0xee:
if(she==1)
{a=1;wei--;}
break;
/*2*/case 0xde:
if(she==1)
{a=2;wei--;}
break;
/*3*/case 0xbe:
if(she==1)
{a=3;wei--;}
break;
/*A*/case 0x7e:k=0;break;
/*4*/case 0xed:
if(she==1)
{a=4;wei--;}
break;
/*5*/case 0xdd:
if(she==1)
{a=5;wei--;}
break;
/*6*/case 0xbd:
if(she==1)
{a=6;wei--;}
break;
/*B*/case 0x7d:if(she==1)
{
wei=15;
a1=0;a2=0;a3=0;a4=0;c=0;
write_str(11,1,"0000");
} break;
/*7*/case 0xeb:
if(she==1)
{a=7;wei--;}
break;
/*8*/case 0xdb:
if(she==1)
{a=8;wei--;}
break;
/*9*/case 0xbb:
if(she==1)
{a=9;wei--;}
break;
/*C*/case 0x7b:
write_char(15,1,'<');
she=1;
break;
/***/case 0xe7:break;
/*0*/case 0xd7:
if(she==1)
{a=0;wei--;}
break;
/*#*/case 0xb7:break;
/*D*/case 0x77:
write_char(15,1,' ');
she=0;kai=1;
break;
}
while((temp&0xf0)!=0xf0)
{
temp=P2;temp=temp&0xf0;
}
}
}
}
if((she==1)&&(wei<=14))
{
switch(wei)
{
case 14:
write_s(wei,a4);a4=a;
c=a4;c1=1;
break;
case 13:
write_s(wei,a4);
write_s(wei+1,a3);a3=a;
c=a4*10+a3;c1=2;
break;
case 12:
write_s(wei,a4);
write_s(wei+1,a3);
write_s(wei+2,a2);a2=a;
c=a4*100+a3*10+a2;c1=3;
break;
case 11:
write_s(wei,a4);
write_s(wei+1,a3);
write_s(wei+2,a2);
write_s(wei+3,a1);a1=a;
c=a4*1000+a3*100+a2*10+a1;
c1=4;
break;
}
if(wei<=10)
{
wei=14;a1=0;a2=0;a3=0;a4=0;
}
}
}
void qiti()
{
if(qt==0)
{
q++;
if(q==3)
{
q=1;
}
}
while(!qt);
switch(q)
{
case 1:out=0;EX0=1;break;
case 2:out=1;break;
}
}
void main()
{
IT0=1;
EA=1;
init();
write_str (0,0,"Now number:0000");
write_str (0,1,"Set number:0000");
led=0;
while(1)
{
qiti();
kscan();
write_sw(11,k);
b1=k/1000;
b2=k%1000/100;
b3=k%100/10;
b4=k%10;
if(kai==1)
{
switch(c1)
{
case 1:
if(c==k)
{
EX0=0;q=2;
bb=0;delay(100);bb=1;delay(100);led=1;
}
else led=0;
break;
case 2:
if(c==k)
{
EX0=0;q=2;
bb=0;delay(100);bb=1;delay(100);led=1;
}
else led=0;
break;
case 3:
if(c==k)
{
EX0=0;q=2;
bb=0;delay(100);bb=1;delay(100);led=1;
}
else led=0;
break;
case 4:
if(c==k)
{
EX0=0;q=2;
bb=0;delay(100);bb=1;delay(100);led=1;
}
else led=0;
break;
}
}
}
}
void t0() interrupt 0
{
if(q==1)
{
k++;
}
}
|