资源描述
______________________________________________________________________________________________________________
《单片机原理及应用》
课程设计报告
课题名称
多通道秒定时器设计
学院
自动控制与机械工程
专业
电气工程及其自动化
班级
姓名
学号
时间
2015年7月
目录
一、课程设计的目的 3
二、课程设计要求 3
三、设计任务 3
1、总体要求 3
2、设计要求 3
3、设计提示 4
四、设计步骤 5
五、设计思路 5
六、硬件设计 6
1、单片机的选择 6
2、74HC的选择 9
3、显示电路 11
(1)时钟电路 11
(2)复位电路 11
(3)开关电路 12
(4)显示LED电路 13
表1-3共阴极接法八段LED代码 13
(5)小灯电路 13
七、软件设计 14
八、部分重要源程序代码 17
1.通道号的设置 17
2.定时值的设置 17
九、单片机秒表的安装与调试 18
1、通道选择仿真结果: 19
2、清零仿真结果: 20
十、心得体会 21
十一、参考文献 22
十二、程序清单 22
一、课程设计的目的
单片机原理及应用课程设计作为独立的教学环节,是自动化及相关专业集中实践性环节系列之一,是学习完《单片机原理及应用》课程后,并在进行相关课程设计基础上进行的一次综合练习。
单片机课程设计过程中,学生通过查阅资料、接口设计、程序设计、安装调试等环节,完成一个基于MCS-51系列单片机,涉及多种资源应用,并具有综合功能的小应用系统设计。使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件等方面的知识进一步加深认识,同时在软件编程、调试、相关仪器设备和相关软件的使用技能等方面得到较全面的锻炼和提高。使学生增进对单片机的感性认识,加深对单片机理论方面的理解,加深单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O接口、串行口等。使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,强化单片机应用电路的设计与分析能力。提高学生在单片机应用方面的实践技能和科学作风;培育学生综合运用理论知识解决问题的能力。
二、课程设计要求
课程设计以学生认知为主体,充分调动学生的积极性,重视学生自学能力的培养,根据具体课题安排时间确定课题的设计、编程和调试内容,分团队开展课程设计活动,按时完成每部分工作。坚持独立完成,实现课题规定的各项指标,并写出设计报告。要求学生自己查阅资料和充分利用所学知识,根据所要设计系统所要达到的功能,划分软硬件功能、选择器件、编写相关程序,用Proteus 在计算机上绘图并用Keil进行程序边编写进行防真,再对整个系统做调试运行,培养学生在遇到问题时能进行独立、系统、认真的思考,并进一步培养学生在团队中的合作精神,不断调试修改,直至达到设计的要求和取得满意的效果,最后编写系统说明书,其内容包括系统的功能介绍,使用范围,主要性能指标,使用方法,注意事项等。
三、设计任务
1、总体要求
基于AT89C51设计一个3位的LED数码作为“4通道秒定时器”。
2、设计要求
1)显示时间为00-99秒。
2)各通道定时时间到,点亮对应的LED。
3)设计一个有4个按键的键盘。
K1:“设置”/“定时启动”。
K2: “减一”和“打开通道设置”。
K3:“加一”。
K4: “通道”/“定时设置”。
4)@设计每到一秒钟有声音或LED提示提醒功能,可通过按钮打开及关闭该提醒功能.
5)其他功能.
3、设计提示
1)用4位7段LED数码管作为显示设备,最高位显示通道号,第2位显示时间.
2)可采用定时器,定时时间100ms.
3)参考 Proteus Pro仿真效果图:
图1-1 Proteus Pro仿真效果图
四、设计步骤
1、制定相应的设计方案;
2、硬件的初步设计;
3选择设计所用元器件和参数;
4在Proteus 7.8中设计和连接电路图;
5软件的初步设计;
6编写程序实现其功能;
7在keil_v4中进行调试运行;
8硬件和软件联合调试。
五、设计思路
为使数码管同时显示通道号和定时值(0~99秒),选用4位7段LED数码管,当定时时间到时点亮对应的LED灯,课程中我们选用LED-BLUE灯,并设计有四位按键的键盘,分别为K1、K2、K3、K4来控制定时启动/停止、通道号和定时时间的切换设置、通道号/定时时间加一、通道号/定时时间减一。通过这四个按键来控制整个电路的运行、LED灯的点亮和数码管的显示。
根据系统的设计要求,选择AT89C51单片机作为系统的核心来完成定时、计数的功能,用74HC244来完成数据的锁存和对LED的刷新控制,用74HC245来完成数据的锁存和对小灯的刷新控制,用外围开关电路实现对单片机的外围输入,用小灯来实现对于计时等功能的提示。
开关K1把开始信号传输给AT89C51单片机,单片机开始计数,然后在P2口输出信号,通过74HC244后传输给LED数码管控制数码管位数是否启用,然后P0口传输相对应的信号控制启用的数码管输出位数的具体信号。同理,其余开关的信号分别控制了AT89C51的开始、停止、复位和通道的加减。单片机开始计数,然后在P3口输出信号,通过74HC245后传输给小灯是否启用。
具体控制如下:
(1)通道号为1~4,对应LED灯为LED1~LED4,执行程序前可任意选择通道号;定时值可在0~99S内任意设置;
(2)当程序运行初始化化后,如果K2按下,则切换至通道号的设置,通过K3、K4来增加或减小通道号;当选择好通道号后如果按下K2则切换至定时值的设置,通过K3、K4来增加或减小定时值;当定时值设置好之后按下K1则程序执行所选通道的秒表定时;当定时时间到时,对应通道的LED灯点亮;
(3)当程序运行初始化后直接按下K3、K4进行定时时间的设置,通过K3、K4来增加或减小定时值;当设置好之后按下K1后直接执行一通道的秒表定时;当定时时间到时,对应通道的LED灯点亮;
(4)当程序运行初始化后直接按下K3、K4进行定时时间的设置,通过K3、K4来增加或减小定时值;当设置好之后按下K2则切换至通道号的设置,通过K3、K4来增加或减小通道号;当设置好后按下K1则执行对应通道的定时;当定时时间到时,对应通道的LED灯点亮;
(5)当程序运行初始化后直接按下K3、K4进行定时时间的设置,通过K3、K4来增加或减小定时值;当设置好之后按下K2则切换至通道号的设置,通过K3、K4来增加或减小通道号;当设置好后按下按下K2则又切换至定时时间的设置, 通过K3、K4来增加或减小定时值;依次可不断循环通道号和定时时间的切换设置,直至达到自己所想要的定时时间,此时按下K1则执行对应通道的秒表定时,当定时时间到时点亮对应的LED灯。
六、硬件设计
1、单片机的选择
AT89C51 是秒表计时系统的核心器件。该器件是 INTEL 公司生产的 MCS-51系列单片机的基础产品,采用了可靠的 CMOS 工艺制造技术,具 有高性能的 8位单片机,属于标准的 MCS-51 的 CMOS 产品。不仅结合了 HMOS 的高速和高密度技术及 HMOS 的低功耗特征,而且继承和扩展了 MCS-48 单片机的体系结构和指令系统。
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示。
AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
单片机小系统的电路图如图所示:
图1-2 AT89C51
管脚说明
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写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编程和校验时接收高八位地址信号和控制信号。K顶
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:来自反向振荡器的输出。
2、74HC的选择
由74HC245和74HC244芯片和电阻,导线构成,控制锁存单片机输出信号。
(1)74HC244是一款高速CMOS器件,74HC244引脚兼容低功耗肖特基TTL(LSTTL)系列。 74HC244是八路正相缓冲器/线路驱动器,具有三态输出。该三态输出由输出使能端1OE和2OE控制。任意nOE上的高电平将使输出端呈现高阻态。 74HC244与74HC240逻辑功能相似,只不过74HC244带有正相输出。如果输入的数据可以保持比较长的时间(比如键盘),简单输入接口扩展通常使用的典型芯片为74HC244,由该芯片可构成三态数据缓冲器。由于AT的51系列单片机一般用并口进行编程,理论上可以直接用单片机的几根I/O口接并口线,但如果电路板没做好,可能会连带把计算机并口烧坏,所以要加个74HC244芯片隔离一下。
74HC244芯片的引脚排列如图所示:
图1-3 74HC244
(2)74HC245元件的引脚图如下:
图1-4 74HC245
[1]第1脚DIR,为输入输出端口转换用,DIR=“1”高电平是信号由“A”端输入“B”端输出。
[2]第2–9脚A信号输入输出端,A0=B0、、、、、A7=B7,A0与B0是一组,如果DIR=“1”OE=“0”则A0输入B0输出,其他类同。如果DIR=“0”OE=“0”则B0输入A0输出,其他类同。
[3]第11–18脚“B”信号输入输出端,功能与端一样。
[4]第19脚OE,使能端,若该脚为“1”时A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。
[5]第10脚GND,电源地。
[6]第20脚VCC,电源正极。
Control Inputs
控制输入
Operation运行
DIR
L
L
B数据到A总线
L
H
A数据到B总线
H
X
隔开
表1-1 74HC245真值表(H=高电平 L=低电平 X=不定)
3、显示电路
(1)时钟电路
时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现电路应在唯一的时钟信号控制下严格地按时序进行工作。在AT89C51芯片内部有一个高增益反相放大器其输入端为芯片引脚XTAL1输出端为引脚TXAL2在芯片的外部通过这两个引角跨接晶体振荡器和微调电容形成反馈电路就构成了一个稳定的自激振荡器。此电路采用12MHz的石英晶体。
图1-5 时钟电路
(2)复位电路
复位是单片机的初始化操作其主要功能是把PC初始化为0000H使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外当由于程序运行出错或操作错误是系统处于死锁状态时为摆脱困境也需要按复位键以重新启动。
RST引脚是单片机复位信号的输入端复位信号是高电平有效其有效时间应持续24个振荡周期即2个机器周期以上若使用频率为12MHz的晶振则复位信号持续时间应超过4us才能完成复位操作。复位操作有上电自动复位和按键手动复位两种方式。上电自动复位是通过外部复位电路的电容充电来实现的。按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的。在本设计中采用了按键电平复位方式。
图1-6复位电路
(3)开关电路
由电源、导线、电阻、开关(K1、K2、K3、K4 4个开关)构成,使用独立式键盘接在单片机的P1口上但通过软件赋予其中五个按键功能如下:
K 1连接 P1.3 端口“设置”/“定时启动”。;
K 2连接 P1.2 端口“减一”和“打开通道设置”。
K3连接 P1.1 端口“加一”。
K4 连接 P1.0 端口“通道”/“定时设置”。
K4 连接 P1.0 端口“通道”/“定时设置”。
图1-7开关电路
(4)显示LED电路
用4位7段LED数码管构成
图1-8 4位7段LED数码管
显示字符
共阴极接法八段状态
段码共阴
DP
G
F
E
D
C
B
A
0
0
0
1
1
1
1
1
1
3FH
1
0
0
0
0
0
1
1
0
06H
2
0
1
0
1
1
0
1
1
5BH
3
0
1
0
0
1
1
1
1
4FH
4
0
1
1
0
0
1
1
0
66H
5
0
1
1
0
1
1
0
1
6DH
6
0
1
1
1
1
1
0
1
7DH
7
0
0
0
0
0
1
1
1
07H
8
0
1
1
1
1
1
1
1
7FH
9
0
1
1
0
1
1
1
1
6FH
表1-2共阴极接法八段状态真值表为
综上可知
显示
0
1
2
3
4
5
6
7
8
9
段码
3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
6FH
表1-3共阴极接法八段LED代码
(5)小灯电路
采用了5个LED,分别为:D1、D2、D3、D4、D5,当电路运行时,5个LED小灯接入电路,接口为:
D1通过74HC245接到P3.0端口:;
D2通过74HC245接到P3.1端口;
D3通过74HC245接到P3.2端口;
D4通过74HC245接到P3.3端口;
D5通过74HC245接到P3.4端口;
每到一秒钟LED灯亮一次,可通过按钮打开及关闭该提醒功能。
图1-9小灯电路
七、软件设计
单片机应用系统的软件设计是研制过程中任务关键的一项工作。没有软件,就无法实现单片机的控制;不同软件可以实现功能不同的控制,所以,要编写软件一定要把要实现的控制对象及其功能全面掌握,要做到心中有数。
单片机应用的软件千差万别,不存在统一的模式。开发一个软件的基本方法是尽可能采用模块化机构。根据系统软件的总体构思按照先粗后细的方法,把整个系统软件分成多个功能独立模块。应明确规定各模块的功能,模块间的接口信息,尽可能使各模块的联系减少到最低限度。这样,模块可以分别独立设计、编制和调试、最后在将各个程序模块连接成一个完整的程序进行调试。 较为复杂软件的设计,是建立在各个基本模块的基础上的,如果对基本模块熟悉了,编写一个较为复杂的软件相对较容易,各个基本模块都是课程中相关章节的内容,系统主要有主程序、中断子程序、显示子程序、加 1 子程序、记录翻页子程序、减1子程序组成。
开始
初始化
计时启动
按下k4
减一
YES
NO
按下k3
加一
YES
NO
通道设置
按下k2
YES
NO
设置启动
按下k1
YES N NO
计时
定时时间
对应通道灯亮
YES
结束
图1-10主程序结构图
加一/减一
加一
按下k3
YES
按下k4
NO
减一
YES
NO
启动计时
计时
图1-11子程序
通道设置
按下k2
NO
YES
开始设置
通道号加一
按下k3
YES
NO
通道号减一
按下k4
YES
NO
图1-12 按键程序
八、部分重要源程序代码
1.通道号的设置
uchar set_thax() //设置通道函数
{
key_set();
if(set_2==2)
{
delay(10);
if(k3==0) //K3加1
{
delay(30);
if(k3==0)
{
delay(300);
sec++;
if(sec==5)
{sec=1; }
}
}
if(k4==0) //K4减1
{
delay(30);
if(k4==0)
{
delay(300);
sec--;
if(sec==0)
{sec=4; }
}
}
}
a=sec;
return a;
}
2.定时值的设置
void set_time() //设置时间函数
{
key_set();
if(set_2==1)
{
delay(10);
if(k3==0) //K3加1
{
delay(30);
if(k3==0)
{
delay(300);
minu++;
if(minu==100)
{minu=1; }
}
}
if(k4==0) //K4减1
{
delay(30);
if(k4==0)
{
delay(300);
minu--;
if(minu==-1)
{
minu=99;
}
}
}
}
九、单片机秒表的安装与调试
软件的仿真与调试Proteus Pro仿真软件它可以仿真、分析SPICE各种模拟器件和集成电路。该软件的主要特点总结后有以下四点
(1)实现了单片机仿真和SPICE电路仿真相结合的功能。
(2)支持目前主流单片机系统的仿真。
(3)提供了软件调试功能并可以与WAVE联合仿真调试。
(4)具有强大的原理图绘制功能。
该软件是一款集单片机和SPICE分析于一身的仿真软件功能极其强大。在电子领域中也起到了很大的作用它的出现仿真不需要先焊接电路可以先仿真调试通过后在焊电路节省了不少在硬件调试上所花的时间。首先打开已经画好的Proteus Pro文件双击图中的AT89C51芯片就弹出一个窗口在他TOOLS项中通过路径选择在ASEM51中生成的ASEM.EXE文件双击选中后确定这样仿真图中的AT89S52芯片就已经读取了本设计中的EXE文件。单击“三角形按钮”进行仿真。通过对仿真结果的观察来对程序进行修改最终使程序到达设计要求。
部分功能运行结果如下:
1、通道选择仿真结果:
图1-13通道1选择仿真结果
图1-14通道3选择仿真结果
2、清零仿真结果:
图1-15初始仿真结果
图1-16清零仿真结果
十、心得体会
通过这次单片机课程设计,我获益良多,它不仅加深了我对理论知识的理解,而且学会将所学的理论知识应用到实际当中去,提高动手能力,使得课程设计更能达到我们的设计要求,我还学会了如何去培养我的创新精神,动手操作的能力,学会独立自主完成设计要求。
这个课程设计的主要内容包括单片机的选择,震荡电路,时钟电路,显示电路,这些基本电路的设计都是老师在课堂上讲到的重要内容。该课题的关键是软件部分的设计,如果把握不好的话思路就会很凌乱, 让人一时摸不着头脑。 经过几天的思索和上网查询和搜索,和同学间的交流,最后还是把整个程序设计出来了,当整个程序出来后我就怀着激动的心情进行仿真,然而还是存在很多错误,但经过多次调试后终于成功了。
这次设计也让我深深的感到仅在课堂上的学到的知识是远远不够的,课下我们应该多到图书馆或网上多了解一下其它的东西,多和同学交流,才能更好的学好这门知识,同时更应该加强我们的动手能力的训练,把理论知识运用到实际生活中。
十一、参考文献
(1)《单片机原理与接口技术》吴亦峰 陈德为 冯维杰 曹双贵 许艳 编造 出版社 电子工业出版社
(2) 《MCS-51单片机原理及应用实例》南建辉 熊鸣 王军茹 编著 出版社 北京清华大学出版社 版次 2004年3月第1版 2006年2月第3版次印刷
(3)《单片机原理、微机原理与接口技术》黄建新 北京化学工业出版社 2009
十二、程序清单
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit QB1=P2^0; //选择数码管
sbit QB2=P2^1;
sbit QB3=P2^2;
sbit QB4=P2^3;
sbit k1=P1^0; //k1按键,
sbit k2=P1^1; //k2按键,
sbit k3=P1^2; //k3按键,加1
sbit k4=P1^3; //k4按键,减1
sbit led4=P3^0; //LED灯
sbit led3=P3^1;
sbit led2=P3^2;
sbit led1=P3^3;
sbit what=P0;
uchar sec=1,minu,mstcnt; // 定义初始量
uchar set_2=1,set_1=1;
uchar mis,mig,ss,sg;
uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴显示
uchar code tabl[]={0x3F,0x06,0x5B,0x4F,0x66};
int a;
void delay(uint); //延时函数
void key_change(); // 扫描K1
void key_set(); // 扫描K2
void disp(uchar,uchar,uchar,uchar); //显示函数
void set_time(); //设置时间函数
uchar set_thax(); //设置通道函数
void timer0();
void haap();
void main() //主函数
{
EA=1; //系统允许有开放的中断
ET0=1; //允许T0中断
TR0=1; //开启中断,启动定时器
TMOD=0x01;
TH0=0x00;
TL0=0x01;
while(1)
{
sg=sec%10; //通道个位
mis=minu/10; //显示时间十位
mig=minu%10;
key_set(); //扫描K2
key_change(); //扫描K1
if(set_1==1) //设置显示条件
{haap();}
if(k1==1&&k2==1) //正常显示
{
delay(10);
if(k1==1&&k2==1)
{ sg=sec;
disp(sg,mis,mig,ss);
}
}
key_change();
if(set_1 ==2) //启动条件
{
timer0();
}
key_change();
if(set_1==3)
{minu=0;}
}
}
void haap() //设置显示函数
{
if(set_1==1)
{
delay(10);
key_set();
if(set_2==1)
{
delay(10);
set_time();
}
key_set();
if(set_2==2)
{
delay(10);
set_thax();
}
}
}
void timer0() interrupt 1 using 0 //启动函数
{
TH0=0x01;
TMOD = 0x01;
if(set_1==2)
{
delay(10);
mstcnt++;
if(mstcnt==20)
{
mstcnt=0;
if (minu==0)
{
minu=0;
set_thax();
if(a==1)
{
led1=0;
led2=1;
led3=1 ;
led4=1 ;
}
else
{
if(a==2)
{
led1=1;
led2=0;
led3=1 ;
led4=1 ;
}
else
{
if(a==3)
{
led1=1;
led2=1;
led3=0 ;
led4=1 ;
}
else
if(a==4)
{
led1=1;
led2=1;
led3=1 ;
led4=0 ;
}
}
}
}
else
{
minu--;
}
}
if(minu==0)
{
minu=0;
}
}
}
void key_change() //k1按键扫描
{
if(k1==0)
{
delay(20);
if(k1==0)
{
set_1++;
while(k1!=1);
if(set_1==4)
{set_1=1;}
}
}
}
void key_set() //k2按键扫描
{
if(k2==0)
{
delay(20);
if(k2==0)
{
set_2++;
while(k2!=1);
if(set_2==3)
{set_2=1;}
}
}
}
void disp(uchar sg,uchar mis,uchar mig,uchar ss) //显示函数
{
QB1=0;
QB2=1;
QB3=1;
QB4=1;
P0=table[sg]; //第1个数码管显示通道
delay(10); //延时一小会
QB1=1;
QB2=1;
QB3=0;
QB4=1;
P0=table[mis]; //第3个数码管显示十位
delay(10);
QB1=1;
QB2=1;
QB3=1;
QB4=0;
P0=table[mig]; //第4个数码管显示个位
delay(10);
QB1=1;
QB2=1;
QB3=1;
QB4=1;
P0=table[ss]; //第2个数码管不显示
delay(10);
}
void set_time() //设置时间函数
{
key_set();
if(set_2==1)
{
delay(10);
if(k3==0) //K3加1
{
delay(30);
if(k3==0)
{
delay(300);
minu++;
if(minu==100)
{minu=1; }
}
}
if(k4==0) //K4减1
{
delay(30);
if(k4==0)
{
delay(300);
minu--;
if(minu==-1)
{
minu=99;
}
}
}
}
}
uchar set_thax() //设置通道函数
{
key_set();
if(set_2==2)
{
delay(10);
if(k3==0) //K3加1
展开阅读全文