资源描述
目录
1前言1
2 总体方案设计2
2.1方案比较2
2.2方案论证和方案选择3
3 硬件接口设计4
3.1各硬件功能介绍及电路设计4
3.1.1 DS18B20温度传感器4
3.1.2串口通信电路4
3.1.3按键电路5
3.1.4 LED显示电路6
3.1.5 单片机STC89C52 6
3.1.6 IIC的存储电路7
3.2电路参数的计算及元器件的选择8
3.3特殊器件的介绍8
3.3.1 DS18B20芯片介绍8
3.3.2 STC89C52单片机介绍9
3.3.3 24C02存储器介绍10
4 软件设计12
4.1软件设计原理及设计所用工具12
4.2 软件设计流程图12
4.3 keilc与protel简介13
5 系统调试14
5.1 系统硬件调试14
5.2 系统软件调试14
6 系统功能、指标参数15
7 结论18
8 总结与体会19
9参考文献20
附录一21
附录二24
1前言
本次课程设计是为了锻炼我们的动手能力,加强对硬件电路的设计、制作能力,巩固以往所学的模电、数电等电路理论知识,从实践操作中,掌握电子产品的常规设计开发流程,提升对电子产品系统规划的整体认知,由实验室课题制作的理解转化为公司化产品开发流程的实际操作。本设计为带温度的数字钟,在日常生产生活中应用广泛,作为基础性功能产品,带温度的数字钟在农业大棚、工业流水线、环境监测设备、仓储等方面发挥着重要作用,国外带温度检测报警的智能化系统具备相当先进的发展水平,我国的同类系统也在飞速发展中,并逐渐深入各行各业,渗透到各种产品体系中,为电子工业发展提供重要助力。
现在是一个知识爆炸的新时代,在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化的钟表给人们带来了极大的方便。
单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉。但是却很少知道它的内部结构以及工作原理。由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。通过键盘可以进行定时、校时功能。输出设备显示器可以用液晶显示技术和数码管显示技术。
高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英晶振技术,因此走时精度高,稳定性好,使用方便,不需要经常调校。数字式电子钟用集成电路计时和译码,代替了传统时钟的“机械式传动”装置,用 LED 数码管或液晶显示器代替传统的指针式显示器,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,具有简单、方便的校时功能。近年来,随着科技的发展和社会的进步,人们对计时器的要求也越来越高,多功能计时器不论在性能还是在样式上都发生了质的变化,为人们的生活带来便利。
2 总体方案设计
2.1方案比较
方案一:
图2.1 基于LCD的设计框图
该方案是用LCD进行显示的,内部包括了时钟电路,电源电路,温度检测等,核心是单片机,运用keilc进行编程。报警电路用的是二极管代替的,按键设置能够自由的设计门限值。
方案二:
图2.2基于LED的设计框图
方案二运用的LED灯作为显示部分,其他的和方案一相同。
2.2方案论证和方案选择
LED是发光二极管属于二极管的一种,lcd是液晶显示屏,两者相差太多.但是用LED的点阵也能组成显示器,适用于户外大屏幕显示,分辨率较低。LED显示器与LCD显示器相比,LED在亮度、功耗、可视角度和刷新速率等方面,都更具优势。LED与LCD的功耗比大约为1:10,而且更高的刷新速率使得LED在视频方面有更好的性能表现,能提供宽达160°的视角,可以显示各种文字、数字、彩色图像及动画信息,也可以播放电视、录像、VCD、DVD等彩色视频信号,多幅显示屏还可以进行联网播出。有机LED显示屏的单个元素反应速度是LCD液晶屏的1000倍,在强光下也可以照看不误,并且适应零下40度的低温。利用LED技术,可以制造出比LCD更薄、更亮、更清晰的显示器,拥有广泛的应用前景。
所以综合考虑,我们选择用基于LED的方案一更为合适。设计直接用单片机编程,用硬件电路搭建方便,通过STC89C52单片机编写程序,将预定功能一一实现。这样可以大大简化系统结构,降低材料的成本。提高系统的先进性和可靠性,能实现控制器的系统编程。
3 硬件接口设计
3.1各硬件功能介绍及电路设计
3.1.1 DS18B20温度传感器
DS18B20的核心功能是它的直接读数字的温度传感器,温度传感器的精度为用户的可编程的9,10,12位,分别为0.5,0.25,0.125和0.0625度增量递增,,在上电状态下默认的精度为12位。DS18B20上电后保持低电耗的默认状态。
图3.1 温度传感器电路图
3.1.2串口通信电路
RS232串口通信通过CPU发送控制信号控制RS232的发送和接受。串口的工作方式有:
方式0 (00):同步移位寄存器方式(用于扩展I/O)
方式1(01):8位异步收发,波特率可变(由定时器控制)
方式2(10):9位异步收发,波特率为Fosc/64或Fosc/32
方式3(11):9位异步收发,波特率可变(由定时器控制)
RS-232下载电路主要有串口和MAX232构成。J1_1为串口接口,一端连接MAX232,另一端通过串口线和电脑连接。J1为下载接口,通过杜邦线可以与单片机的TXD和RXD相连接。
图3.2 串口通信电路
3.1.3按键电路
键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的键盘称为非编码键盘,在单片机组成的各种系统中,用得较多的是非编码键盘。非编码键盘又分为独立键盘和行列式键盘。
在本设计中定义了8个按键,其功能如下:
S2: 确定 S6:设置当前时间
S3:设置闹钟 S7:设置报警温度
S4:加 S8:减
S5:左移 S9:右移
图3.3 按键电路图
3.1.4 LED显示电路
对于数码显示管单元,我们选用的是七段数码显示管,七段数码显示管有共阴极和共阳极两种,显示器接口按驱动方式可分为静态显示和动态显示两种方式。静态显示的优点是显示稳定,亮度高;缺点是占用硬件电路(如I/O口、驱动器等)多。动态显示的优点是节省硬件电路;缺点是采用软件扫描时占用CPU时间多,当显示位数较多时,显示器亮度将受到影响。此系统我们采用的是7段共阳数码显示管、动态显示的工作情况。
在该电路中,P0口作为8个数码管的使能端,P2口作为8个数码管的数据端,通过动态扫描,让数码管显示我们需要的内容。
图3.4 LED显示电路图
3.1.5 单片机STC89C52
STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
图3.5 单片机最小系统图
在本设计中,单片机是核心,通过软件编程,让单片机控制下面的子模块,从而实现预定功能。P0口用作数码管的使能端,P2口用作数码管的数据端,P1口与P3口的一部分用作按键扫描与24C02的端口。在本设计中还使用了中断。
3.1.6 IIC的存储电路
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。IIC总线的特点有:二线制,支持多主控,位速率100 Kbit/s到3.4M kbit/s。连接到相同数量的IIC上面。
在本设计中,24C02用于存储闹钟时间与报警温度。
图3.6 IIC的电路图
3.2电路参数的计算及元器件的选择
本次设计用到了的元件有STC89C52单片机,DS18B20温度传感器,LED数码管,24C02存储器, RS232串口以及各种按钮,电阻,电容。电路的参数在买元件之前预先计算好。
3.3特殊器件的介绍
3.3.1 DS18B20芯片介绍
DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图3.7 DS18B20的实物图
图3.8 DS18B20内部结构图
3.3.2 STC89C52单片机介绍
C52是由宏晶公司推出的新一代高速,低功耗,超强抗干扰的单片机,指令代码完全兼容传统的8051单片机,12个时钟/机器周期和6时钟/机器周期可任意选择。其主要特性如下:
·与MCS-51 兼容
·8K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24Hz
·三级程序存储器锁定
·512内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
图3.9 C52单片机实物图
图3.10 C52单片机引脚图
3.3.3 24C02存储器介绍
24C02是串行E2PROM存储器,是基于I2C-BUS 的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。
(1).宽范围的工作电压1.8v~5.5v
(2).低电压技术:
(3).储存器组织结构
(4).2线串行接口,完全兼容I2C总线
(5).施密特触发输入噪声抑制
(6).硬件数据写保护
(7).内部与周期(最大5ms)
(8).自动递增地址
(9).可按照字节写
(10).esd保护大于2.5kV
(11).高可靠性:擦写寿命:100万次数据保持时间:100年
(12).无铅工艺,符合RoHS标准
图3.11 24C02引脚图
4 软件设计
4.1软件设计原理及设计所用工具
本次设计利用protel的特点画出原理图和PCB图,并用电气规则检查无误以后,就可以直接买元器件,焊板子。本设计所用的程序设计软件为keil c,在此软件上逐句的写出本设计所要实现的功能的程序代码。
4.2 软件设计流程图
图4.1 系统软件设计的流程图
本设计主要流程:初始化后正常显示时间与温度,同时将存在24C02中的闹钟值、报警温度与当前时间,温度比较,满足条件就报警。同时判断是否有按键按下,如果有按键按下,便实现相应的按键功能,按键结束后返回主程序。如果没有按键按下,直接返回主程序。
4.3 keilc与protel简介
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。C51工具包的整体结构中uVision与Ishell 分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件 (.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
PROTEL是PORTEL公司在80年代末推出的EDA软件,在电子行业的CAD软件中,它当之无愧地排在众多EDA软件的前面,是电子设计者的首选软件,它较早就在国内开始使用,在国内的普及率也最高,有些高校的电子专业还专门开设了课程来学习它,几乎所有的电子公司都要用到它,许多大公司在招聘电子设计人才时在其条件栏上常会写着要求会使用PROTEL。现今的PROTEL已发展到PROTEL99(网络上可下载到它的测试板),是个庞大的EDA软件,完全安装有200多M,它工作在WINDOWS95环境下,是个完整的板级全方位电子设计系统,它包含了电路原理图绘制、模拟电路与数字电路混合信号仿真、多层印制电路板设计(包含印制电路板自动布线)、可编程逻辑器件设计、图表生成、电子表格生成、支持宏操作等功能,并具有Client/Server(客户/服务器)体系结构,同时还兼容一些其它设计软件的文件格式,如ORCAD,PSPICE,EXCEL等,其多层印制线路板的自动布线可实现高密度PCB的100%布通率。在国内PROTEL软件较易买到,有关PROTEL软件和使用说明的书也有很多,这为它的普及提供了基础。
5 系统调试
5.1 系统硬件调试
系统的硬件调试分为在protel上的模拟调试查看各连接线是否有问题,以及在实际板子上面的调试,当板子焊完以后我们要逐个的调试板子上面的器件,看是否焊接正确,是否有少焊,错焊等情况。然后在keilc 里面编写一段程序通过电脑下载到板子上面,运行,看是否能够实现预期的功能,若能,则板子焊接无误。
5.2 系统软件调试
当系统的硬件调试完成以后,我们要进行的是系统的软件调试,系统的软件调试是结合到板子来进行的,首先我们要对流程图中的每个单元功能所实现的功能进行编程,然后在keilc 中逐句的查看是否有错误,若无错误,则通过电脑下载到板子上面看能否实现相应的功能,若能则,本单元所要实现的功能调试完成。当几个单元模块合在一起的时候,我们要对每个单元模块进行检查,看各个单元模块是否有相冲突的地方,当解决了冲突以后板子的软件调试就成功了。本设计的软件设计分为4个子模块,下面进行简单介绍:
按键部分主要功能是对按键功能进行定义,并对相应功能进行设计。本设计一共定义了8个按键,分别实现确定、设置当前时间、设置闹钟、设置报警温度、加、减、左移、右移8个功能。
时间部分主要实现时钟功能,本设计并未采用1302,而是利用单片机的中断编写了一个时钟程序。
温度部分主要实现温度采集功能,温度传感器采用18B20。
温度部分主要作用是存储报警温度与闹钟。
6 系统功能、指标参数
本设计是基于LED的带温度显示的数字钟,所以本设计能实现的功能有自动显示温度,自动显示时间,并且能设置温度的门限值,当温度达到门限值的时候,二极管明亮报警,当时间达到闹钟时间时,数码管闪烁提示,而闹钟时间与温度的门限值能通过按键实现动态写入,并且存入IIc中。
图6.1 系统正常运行图
图6.2 当前时间设置图
图6.3 闹钟设置图
图6.4 报警温度设置图
图6.5温度报警图
图6.6闹钟报警图
7 结论
本设计是基于LED的带温度显示的数字钟的设计,本设计的价值是在数字钟的基础上实现附带温度显示的功能,比如当早上起床以后,我们就不必为今天穿什么衣服感到烦恼,只要看看今天的当前温度就能选择合适的衣物。
本设计的优点是能设置报警温度与闹钟,当达到条件时报警。能修改当前时间,并且在设置时,所在位数码管会闪烁,使使用更加方便,设置时实现了循环移位。。本设计所用的电路比较简单,元器件较少。缺点是设计时把主要精力放在了功能实现上,没有过多考虑其它因素对本设计的影响,所以数码管在显示时有时会受到一定影响。进一步的研究可以添加更多的更实用的功能,使系统的功能向多样化,实用话迈进。
本设计与以往的数字钟相比较由于应用了IIC 能存储所设定的门限值,使其的编程更加简单,而且与以往的数字钟相比,本设计的功能更加多样化,可添加的功能也多样化。
8 总结与体会
本次智能化电子系统设计是基于单片机STC89C52的数字钟,通过本次设计,我们在对单片机应用及模、数电技术有了更深刻的认识,也从实践的例子中去感受到了智能化设计给我们设计带来的改变与进步。在设计中,我们不仅掌握protel和PROTUES及keilc软件的使用,与此同时,我们还对电子设计的思路有了更多的认识。
通过四个星期的智能化课程设计,我们受益匪浅。
首先,在这次智能化课程设计当中,我们重新将《单片机原理与应用》的教材认真温习了一遍,并大量阅读了各种有关单片机的参考书,这使我对单片机的硬件结构更加清晰,对单片机的软件的设计有了初步的系统的了解,对其中的各种常用的指令更加熟悉,相对于课程设计以前的水平有了很大的改观,尤其表现在对指令的认识与使用方面。在此次的课程设计当中,通过对程序的大量阅读,我对使用C语言设计程序不再感到陌生,通过对程序的不断修改,我对C语言中的各种指令和语句的使用更加熟练,这对我步入使用C语言编写程序的大门做了一个很好的铺垫。
另外,在这次智能化课程设计当中,我们的毅力得到了加强。在单片机实验室的调试过程中,我们失败了很多次,当一次失败了,我们就修改程序再调试,第二次失败了,我们继续修改程序继续调试;当一种方案失败了,我们就换一种方案;一次又一次的调试失败几乎使我们丧失信心,但我们没有放弃,而是一遍有一遍的不断修改程序、修改方案,最后,终于在我们的不懈努力下完成了拉幕式数码显示的课程设计,这使我们得到成功喜悦的同时更得到了坚持不懈的可贵精神,它将对我今后的生活与工作产生重大的影响。
最后,感谢胡老师及其各位师兄在这次智能化课程设计当中对我们的悉心教导,使我们对单片机的软件设计与硬件接线方面的知识有了很大的收获,相对于以前的知识来说,我在这方面的知识有了一次质的飞跃。另外,在设计与调试的过程中,我不断的与周围的同学交流,这也使我的知识得到了很大的提高。
9参考文献
[1] 康华光.电子技术基础.模拟部分(第五版).高等教育出版社. 2006年1月
[2] 康华光.电子技术基础.数字部分(第五版).高等教育出版社. 2006年1月
[3] 谢自美. 电子线路设计.实验.测试(第三版).华中科技大学出版社.2006年8月
[4] 张毅刚. 单片机原理及应用.高等教育出版社. 2003年12月
[5] 杨宝清. 实用电路手册.机械工业出版社. 2002年
[6] 张洪润.电子线路及应用.科学出版社. 2002年
附录一
图 附录1 原理图
图 附录2 PCB图
图 附录3 实物图
附录二
/******存储部分********************/
void Cstart()
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void stop()
{
SDA = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
unsigned char shin()
{
unsigned char i,read_data;
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= (unsigned char)SDA;
SCL = 0;
}
return(read_data);
}
bit shout(unsigned char write_data)
{
unsigned char i;
bit ack_bit;
for(i = 0; i < 8; i++)
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
write_data <<= 1;
}
SDA = 1;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit = SDA;
SCL = 0;
return ack_bit;
}
void Cwrite_byte(unsigned char addr, unsigned char write_data)
{
Cstart();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delay(10);
}
void fill_byte(unsigned char fill_data)
{
unsigned char i;
for(i = 0; i < MAX_ADDR; i++)
{
Cwrite_byte(i, fill_data);
}
}
unsigned char read_current()
{
unsigned char read_data;
Cstart();
shout(OP_READ);
read_data = shin();
stop();
return read_data;
}
unsigned char
read_random(unsigned char random_addr)
{
Cstart();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
/* \*******时钟部分************\********/
void start()
{
TMOD=0x11;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
EA=1;
ET0=1;
TR0=1;
}
void show(uchar add,uchar date)
{
P0= dispbitcodeT[add];
P2 = dispcode0[date];
}
void show1(uchar add,uchar date)
{
uint miao2=miao1*10+miao;
P0= dispbitcodeT[add];
if (miao2%2==0 )
P2 = dispcode0[date];
else
P2 = dispcode1[date];
}
void time1() interrupt 1
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
tt++;
if(tt==18)
{
tt=0;
miao++;
if(miao==10)
{
miao=0;
miao1++;
if(miao1==6)
{
miao1=0;
fen++;
if(fen==10)
\{
\\fen=0;
fen1++;
if(fen1==6)
{
fen1=0;
shi++;
if(shi==10)
{
shi=0;
shi1++;
if(shi1==2)
{if(shi==4)
{shi=0;
shi1=0;
}
}
}
}
}
}
}
}
}
/* ******按键部分****************/
void delay_10ms(void) //延时//
{
unsigned char i,j;
for(i=0;i>0;i--)
for(j=248;j>0;j--);
}
void getkey()
{
unsigned char x,y;
P1=P1|0xE8;
P3=0x7b;
y=P1&0xe8;
if(y!=0Xe8)
{
delay_10ms();
if(y!=0Xe8)
{ P3 = 0XFB;
x=P1&0xe8;
if(x!=0xe8 )
{
switch(x)
{
case 0xe0:sure=1; break; //确定 (s2)
case 0xc8: clock=1;max_c=0;time=0; sure=0;break;//“设置闹钟”(S3)
case 0xa8:if(num[s]==9){num[s]=0;break;} num[s]=num[s]+1; break; //"+"(S4)
case 0x68: if(s==3){s=0;break;} s=s+1;flash=s; break; //左移S5)
}
}
else
{
P3 = 0X7f;
x=P1&0xe8;
if(x!=0xe8)
{
switch(x)
{
case 0xe0:time=1;max_c=0; clock=0;sure=0;break; //设定时间 (S6)
case 0xc8:max_c=1;time=0; clock=0;sure=0;break; //设置报警温度(S7)
case 0xa8: if(num[s]==0){num[s]=9;break;}num[s]=num[s]-1;break; //“-” (S8)
case 0x68: if(s==0){s=3;break;} s=s-1;flash=s; break; //右移 S9)
}
}
}
}
}
while((P1&0xe8)!=0xe8) ;//判断按键是否松开
}
void displys()
{if(sure==1)
{if(time==1)
{
shi1=num[3];delay(1);
shi=num[2]; delay(1);
fen1=num[1]; delay(1);
fen=num[0]; delay(1);
max_c=0; clock=0;time=0;
}
if(clock==1)
{ unsigned char i;
SDA = 1;
SCL = 1;
fill_byte(0xff);
for(i = 0; i <4; i++)
{
Cwrite_byte(i, num[i]);
}
max_c=0;clock=0;time=0;
}
if(max_c==1)
{unsigned char i;
SDA = 1;
SCL = 1;
fill_byte(0xff);
for(i = 4 ; i <8; i++)
{
Cwrite_byte(i, num[i]);
}
max_c=0;clock=0;time=0;
}
}
if(time==1)
switch(flash)
{
case 0:
for(i=0;i<110;i++)
{
getkey();
for(k=0;k<4;k++)
{ if(k==0)
++k;
P0 = dispbitcodeT[k];
P2 = dispcode[num[k]];
delay1ms();
P0=0xff;
}
}
for(i=0;i<110;i++)
{
getkey();
for(k=0;k<4;k++)
{
P0 = dispbitcodeT[k];
P2 = dispcode[num[k]];
delay1ms();
P0=0xff;
}
}
break;
case 1: for(i=0;i<110;i++)
{
getkey();
for(k=0;k<4;k++)
{
if(k==1)
P0 = dispbitcodeT[k];
P2= dispcode[num[k]];
delay1ms();
P0=0xff;
}
}
for(i=0;i<110;i++)
{
getkey();
for(k=0;k<4;k++)
{
P0 = dispbitcodeT[k];
P2 = dispcode[num[k]];
delay1ms();
P0=0xff;
}
}
break;
case 2: for(i=0;i<110;i++)
{
getkey();
for(k=0;k<4;k++)
{
if(k==2)
k++;
P0 = dispbitcodeT[k];
P2 = dispcode[num[k]];
delay1ms();
P0=0xff;
}
}
for(i=0;i<110;i++)
{
getkey();
for(k=0;k<4;k++)
{
P0 = dispbitcodeT[k];
P2 = dispcode[num[k]];
delay1ms();
P0=0xff;
}
}
break;
case 3: for(i=0;i<110;i++)
{
getkey();
for(k=0;k<3;k++)
{
P0 = dispbitcodeT[k];
P2 = dispcode[num[k]];
delay1ms();
P0=0xff;
}
}
for(i=0;i<110;i++)
{
getkey();
for(k=0;k<4;k++)
{
P0 = dispbitcodeT[k];
P2 = dispcode[num[k]];
delay1ms();
P0=0xff;
}
}
break;
}
}
}
}
if(max_c==1)
{
{
{ char k;
char i;
switch(flash)
{
case 0:
for(i=0;i<110;i++)
{
getkey();
for(k=4;k<8;k++)
{ if(k==4)
++k;
P0 = dispbitcodeT[k];
P2 = dispcode[num[k-4]];
delay1ms();
P0=0xff;
}
}
for(i=0;i<110;i++)
{
getkey();
for(k=4;k<8;k++)
{
P0 =
展开阅读全文