(时间管理)单片机简易秒
表正计时时间可设置倒计
时时间可查询
第一章 设计内容和要求
设计任务
用 AT89C52设计一个 4位的 LED数码作为多功能“秒表”。
设计目的
1.学习数码管显示的结构和工作流程,实现数码管分组显示数字组合。
2.学习有关单片机的内容,进一步了解 AT89C52芯片的相关功能。
3.复习 C语言的相关知识。
4.培养自学能力和探索解决问题的能力。
设计要求
显示时间为 00分 00秒-59分 59秒,每 1秒自动加 1,另外设计一个“开始
/暂停”键、一个“记录/查询”键、一个“清零”键、一个“模式切换”键、一
个“时间设置”键、一个“复位”键。秒表要求正计时时,可记录并且查询 10
组数据,倒计时时,时间用户可设置,并且时间到时蜂鸣器报警。
设计创新
在基本设计基础上添加了正向查询 10条记录后蜂鸣器同时报警。
设计意义
简易秒表具有读取方便,显示直观,功能多样,电路简洁,成本低廉等诸多
优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。本次设计将基于单
片机的工作原理,设计简易秒表的基本电路,深入的了解其工作原理,掌握其基
本的工作特点。同时简易秒表在生活中应用广泛,从实际出发,不断创新。
第二章 方案设计与选择
技术可行性
20世纪以来,微电子,IC集成电路行业发展迅速,其中单片机行业发展最
引人注目。单片机利用大规模集成电路技术把中央处理器和数据存储器(RAM),
程序存储器(ROM)及其他 I/O通信口集成在一块芯片上,构成最小的计算机系
统。如今的单片机发展集成了更多的特殊功能单元,例如 A/D,D/A转换器,通
信控制,DMA,PWM控制输出单元等。因此,只要外加一些扩展电路及必要的通
道接口就可以构成各种计算机应用系统。
单片机除了具备体积小,价格低,速度快,用途广,可靠性高等特点,在硬
件结构和指令设置上还有以下独特之处:
1.存储器 ROM和 RAM是严格分工的。前者存放程序,常数和数据表格,后者
存放临时数据和变量。
2.采用面向控制的指令系统,构成的应用系统有较大的可靠性。大部分测控
功能由软件实现,故具有柔性特征,不须改变硬件系统就能适当的改变系统功能。
3单片机的硬件功能具有广泛的通用性。
4.品种规格的系列化。
单片机的选择
方案一:采用 AT89C52单片机
AT89C52是一种低功耗、高性能 CMOS8位微控制器,具有 8K在系统可编程
Flash存储器。使用 Atmel公司高密度非易失性存储器技术制造,与工业 80C51
产品指令和引脚完全兼容。片上 Flash允许程序存储器在系统可编程,亦适于常
规编程器。在单芯片上,拥有灵巧的 8位 CPU和在系统可编程 Flash,使得 AT89C52
为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。该芯片且具备在线
编程可擦除技术,当在对电路停止调试时,因为顺序的过错修正或对步伐的心删
功能需要烧进程序时,没有需要对芯片屡次插拔,所以不会对芯片形成破坏。
方案二:采用 FTC10F04单片机
FTC10F04单片机还带有非易失性 Flash程序存储器。它是一种高性能、低
功耗的 8位 CMOS微处理芯片,市场应用最多。其主要特点如下:8KB Flash
ROM,可以擦除 1000次以上,数据保存 10年。
方案三:采用 8051单片机
8051单片机最早由 Intel公司推出,内部具有 4KB ROM存储空间。其后多
家公司购买了 8051的内核,使得以 8051为核心的 MCU系列单片机在世界上产量
最大,应用也最广泛。有人推测 8051可能最终形成事实上的标准 MCU芯片。LG
公司生产的 GMS90系列单片机,与 Intel MCS-51系列、Atmel 89C51/52,89C2051
等单片机兼容,CMOS技术,高达 40MHZ的时钟频率。应用于:多功能电话,智
能传感器,电度表,工业控制,防盗报警装置,各种计费器,各种 IC卡装置、
DVD、VCD、CD-ROM。
由于本系统对 CPU运算速度要求很高,需要执行很复杂的运算,方案一,三
成本比较低,适合做设计,方案二运算速度高,性能好,所以三种方案都有可取
之处。本次设计选用方案一作为主方案,设计以 AT89C52为主控电路的方案电路。
显示模块的选择
方案一:使用液晶显示屏显示时间数字。 液晶显示屏(LCD)具有轻薄短小、
低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,
画面效果好,分辨率高,抗干扰能力强等特点。但由于液晶是以点阵的模式显示
各种符号,需要利用控制芯片创建字符库,编程工作量大,控制器的资源占用较
多,其成本也偏高。在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片,
不易维护。
方案二:使用传统的 LED数码管显示。 数码管具有:低能耗、低损耗、低
压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,
易于维护,同时其精度比较高,称重轻,精确可靠,操作简单。数码管采用 BCD
编码显示数字,程序编译容易,资源占用较少。
根据以上的论述,采用方案二。在本系统中,我们采用了四位一体数码管串
口的动态显示,因选用四位一体共阳数码管,所以要加共阳的驱动,采用 pnp的
驱动。
键盘模块的选择
在对倒计时时间可设置,对正计时、倒计时的模式选择时,清零时都需要用
按键。
方案一:使用独立式键盘。独立式键盘是指直接用 I/O口线构成的单个按键
电路。独立式按键电路配置灵活,软件结构简单。
方案二:使用矩阵式键盘。矩阵式键盘是由行线和列线组成,按键位于行、
列的交叉点上,行线、列线分别连接到按键开关的两端。其特点是简单且不增加
成本,这种键盘适合按键数量较多的场合。
根据以上的论述,因本系统需要的按键不多,只需要开始/暂停”键、“记录
/查询”键、 “清零”键、 “模式切换”键、 “时间设置”键。所以采用方案
一独立式键盘。
时钟电路的选择
时钟电路常用的有内部时钟方式和外部时钟方式,但因为本设计中只需要一
片单片机,所以采用内部时钟方式比较简单。
第三章 系统总体结构
系统结构框图
图 2-1
图3-1
各框图实现功能
单片机模块
按照系统设计功能的要求,初步确定系统由主控模块,存储模块,驱动模块,
显示模块和键盘接口模块组成,如图3-1。这些模块中单片机占主控地位,采
用 AT98C52芯片。
按键模块
键盘电路模块主要是对输出显示进行控制调节作用,采用普通独立按钮元件,
共 5个,“开始/暂停”键、“记录/查询”键、 “清零”键、 “模式切换”键、
“时间设置”键。本设计选择了按钮电平复位电路,其他几个按钮则是通过单片
机判断高低电平的不同来控制按钮。
显示输出
存储
显示模块
显示输出部分所用的数码管有共阴极和共阳极两类数码管之分,不管使用何
种数码管,P0口作为 I/O使用时都是需要上拉电阻才能驱动数码管。另外,因
为单片机的 4个并行 I/O口的输出电流一般是 1mA,短路电流为 4mA左右,而数
码管的最少驱动电流也需要 10mA,因而不管在使用共阴数码管时,单片机输出
口也必须使用上拉电阻提高输出电流,才能驱动数码管。本电路中采用的是共阴
极数码管。驱动部分主要是数码管分组显示的选择控制,本电路中通过 P1口和 P2
口的配合进行数码管的选通。
在显示模块中,它的连接方式为 8位数码管的各段控制口 a,b,c,d,e,f,g,dp
分别需接到 P0口。数码管的显示码是由 P0口输入的,位选端是通过 P2口控制
的。数码管的显示编码已经编好放在计算机的内存里,时间的显示可以通过软件
的计算把显示码调出显示。显示模块直接用数码管来显示时间。先将显示码存入
数组中,指向最左边一位,然后取出要显示的数据,指向换码表首地址,取出显
示码,从 P0口输出显示码,P2口输入位选码,
图3-2 数码管笔段分布图
驱动模块
驱动部分电路选择S8050芯片,通过与单片机的连接,将电平拉高才能
使发光管正常发光。
第四章 硬件设计
由图 3-1系统结构框图可知硬件选择如下:AT89C52芯片,LED数码管组,
数码管驱动三极管,电阻,按钮等外围应用电路构成。下面介绍各外围电路。
单片机基本引脚接线图
AT89C52的基本连接电路如图,有复位电路,内部时钟电路,VCC,VSS的连
接,其余控制电路根据程序设计分别连至个 I/O口实现功能。图3-1为 AT89C52
的引脚图,在设计中大部分采用40引脚的双列直插式芯片。图3-2介绍的是
AT89C52作为基本连接电路中。
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口也可作为 AT89C52的一些特殊功能口,P口管脚备选功能
RXD(串行输入口) TXD(串行输出口)
/INT0(外部中断 0) /INT1(外部中断 1)
T0(记时器 0外部输入) T1(记时器 1外部输入)
/WR外部数据存储器写选通 /RD外部数据存储器读选通
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
端保持高电平时,此间内部程序存储器。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
图4-1 AT89C52引脚图
图4-2 AT89C52基本电路接线图
时钟电路
图 4-3 时钟电路
时钟电路的晶振频率越高,系统的时钟频率越高,单片机的运行速度也就越快。
如图3-2中的 XTAL1和 XTAL2引脚间的部分,晶振频率根据设计需要设为
,根据谐振性质,电路中的电容 C1、C2选择为 30pF。该电容的的大
少会影响振荡器频率的高低、振荡器的稳定性和起振的快速性。
按钮电路
本设计采用独立按钮,按键未按下时,端口为电阻上拉高电平,按键被按下
时,端口为低电平并送到相应控制端口。如图4-3所示,一共设置为五个按钮。
本次设计采用独立按键,同时应用行列式键盘中的 11、21、41、81.一行实
现独立式键盘,可方便焊接,再接一个按钮即可实现五个按钮的控制。
复位电路
本电路中采用上电复位电路,上电瞬间,电容充电电流最大,电容相当于短
路,RST端为高电平,自动复位;电容两端的电压达到电源电压时,电容充电电
流为零,电容相当于开路,RST端为低电平,程序正常运行。如图4-2中 RST
引脚的接线。
显示电路
发光二极管(LED)由特殊的半导体材料砷化镓、磷砷化镓等制成,可以单
独使用,也可以组装成分段式或点阵式 LED显示器件(半导体显示器)。分段式
显示器(LED数码管)由 7条线段围成 8字型,每一段包含一个发光二极管。外
加正向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就
可以显示各种字形或符号。LED数码管有共阳、共阴之分。图 4-2是共阳式、共
阴式 LED数码管的原理图和符号。
图 4-4 共阳式、共阴式 LED数码管的原理图和数码管的符号图
本设计电路为时,分,秒的显示,显示采用了四位一体的共极数码管。其中
这个数码管组都由 P0口控制输出显示,片选信号由 P2口实现,,由于为共阳极
数码管,片选=1时,该位所对应的数码管进行位驱动,其余为 0。电路开始时,
两个四位一体数码管组显示时间。LED显示器的显示控制方式按驱动方式可分成
静态显示方式和动态显示方式两种。对于多位 LED显示器,通常都是采用动态扫
描的方法进行显示。
图4-5 多位数码管的段驱动和位驱动的连接
驱动电路
电路中为共阳极数码管,所以选择9013NPN三极管进行电路驱动。如图4-6。
图4-6 利用三极管对数码管进行位驱动
电源
电源由小变压器通过 220V降压至 5V由导线引至电路两端获得。由于设计芯
片的工作电压为5V,所以若想直接从住宅供电获取,则可采用小型变压器,高
压侧由导线接至插头,低压侧可用导线连接杜邦线,直接接在芯片上获得所需工
作电压。
或者采用干电池直接提供5V电压,可根据自身条件选择。
第五章 软件设计
系统的软件设计也是工具系统功能的设计。单片机软件的设计主要包括执行
软件(完成各种实质性功能)的设计和监控软件的设计。单片机的软件设计通常
要考虑以下几个方面的问题:
(1)根据软件功能要求,将系统软件划分为若干个相对独立的部分,设计
出合理的总体结构,使软件开发清晰、简洁和流程合理;
(2)培养良好的编程风格,如考虑结构化程序设计、实行模块化、子程序
化。既便于调试、链接,又便于移植和修改;
(3)建立正确的数学模型,通过仿真提高系统的性能,并选取合适的参数;
(4)绘制程序流程图;
(5)合理分配系统资源;
(6)为程序加入注释,提高可读性,实施软件工程;
(7)注意软件的抗干扰设计,提高系统的可靠性。
软件系统框图
开始
赋初值
计时
按键模块
单片机
显示模块
蜂鸣器
返回
图 5-1
Y
N
主程序流程图
图 5-2
系统主程序
#include <>
#define uc unsigned char
#define ui unsigned int
void display();
char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//数字对应显示码表
char code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//小数
点
char code index[]={0x10,0x20,0x40,0x80};//{0xef,0xdf,0xbf,0x7f}; //每位数
字对应数码管显示位置
uc num[8]; //每位数字存放数组
uc val[10][4];//存储的记录 [10]为记录序列,[8]为每组记录中的数字
char val_index;//记录序列标志位
uc set_index,ok_flag,timing;
bit mode=1;//运行模式,1为正向计数,0为反向计数。
bit fin_flag=0;//完成标志位,当反向计数结束时,此位为高电平,触发蜂鸣器
bit set_shan;
sbit beep=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P3^5;
sbit key4=P3^6;
sbit key5=P3^7;
void delay(ui z)
{
ui i,j;
for(i=0;i<z;i++)
Y
for(j=0;j<121;j++);
}
void init()
{
TMOD=0x11;
TH0=0x4b;
TL0=0xff;
TH1=0x4b;
TL1=0xff;
ET1=1;
TR1=1;
ET0=1;
TR0=0;
EA=1;
val_index=0;
}
void clr()
{
uc i;
for(i=0;i<8;i++)
num[i]=0;
}
void setup()
{
ok_flag=0xff;
set_index=0;
while (ok_flag)
{
display();
if(key1==0) //按动 KEY1设置值加 1
{
delay(5);
if(key1==0)
{
if
((set_index==0)|(set_index==2)|(set_index==4)|(set_index==6))
{
num[set_index]++;
if(num[set_index]==10)
num[set_index]=0;
}
else
if((set_index==1)|(set_index==3)|(set_index==5)|(set_index==7))
{
num[set_index]++;
if(num[set_index]==6)
num[set_index]=0;
}
while(!key1) display();
}
}
if(key2==0) //按动 KEY2设置位置加 1
{
delay(5);
if(key2==0)
{
set_index++;
if(set_index==8)
set_index=0;
while(!key2) display();
}
}
if(key5==0) //按动 KEY5设置结束
{
delay(5);
if(key5==0)
{
ok_flag=0x00;
mode=0;
while(!key5) display();
}
}
}
}
void display()
{
uc i;
if(ok_flag!=0xff)
{
if(timing==0)
{
for(i=0;i<4;i++)
{
P0=0xff;
P2=index[i];
if(i==2)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
}
}
else
{
if(set_shan==0)
{
for(i=0;i<4;i++)
{
P0=0xff;
P2=index[i];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
}
}
else if(set_shan==1)
{
for(i=0;i<4;i++)
{
P0=0xff;
P2=index[i];
if(i==2)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
}
}
}
}
else
{
if(set_shan==0)
{
if(set_index==0)
{
for(i=0;i<4;i++)
{
if(i==0)
{
P2=index[0];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
else
{
P2=index[i];
if(i==2)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
else if(set_index==1)
{
for (i=0;i<4;i++)
{
if(i==1)
{
P2=index[1];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
else
{
P2=index[i];
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
else if(set_index==2)
{
for (i=0;i<4;i++)
{
if(i==2)
{
P2=index[2];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
else
{
P2=index[i];
if(i==2)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
else if(set_index==3)
{
for (i=0;i<4;i++)
{
if(i==3)
{
P2=index[3];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
else
{
P2=index[i];
if(i==2)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
else if(set_index==4)
{
for (i=4;i<8;i++)
{
if(i==4)
{
P2=index[0];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
else
{
P2=index[i-4];
if(i==6)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
else if(set_index==5)
{
for (i=4;i<8;i++)
{
if(i==5)
{
P2=index[1];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
else
{
P2=index[i-4];
if(i==6)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
else if(set_index==6)
{
for (i=4;i<8;i++)
{
if(i==6)
{
P2=index[2];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
else
{
P2=index[i-4];
if(i==6)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
else if(set_index==7)
{
for (i=4;i<8;i++)
{
if(i==7)
{
P2=index[3];
P0=tab[10];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
else
{
P2=index[i-4];
if(i==6)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
}
else
{
for (i=0;i<4;i++)
{
P2=index[i];
if(i==2)
P0=tab1[num[i]];
else
P0=tab[num[i]];
delay(2); //修改此参数可修改刷新频率
P0=0xff;
}
}
}
}
void alarm()
{
if((num[4]==0)&&(num[5]==0)&&(num[6]==0)&&(num[7]==0))
{timing=0;}
else
{
if((num[4]==num[0])&&(num[6]==num[2])&&(num[5]==num[1])&&(num[7]==num[3]))
{timing=1;}
}
}
void main()
{
uc h,g,k;
init();
clr();
while(1)
{
display(); //刷屏显示数码管
alarm();
if(key1==0) //开始/暂停按钮
{
delay(5);
if(key1==0)
{
TR0=~TR0;
while(!key1) display();
}
}
if(key2==0) //记录按钮
{
delay(5);
if(key2==0)
{
if(TR0==1)//当在运行中按下记录键则存储记录
{
for(g=1;g<10;g++)
{
for(k=0;k<4;k++)
{
val[g-1][k]=val[g][k];
}
}
for(h=0;h<4;h++)
{
val[9][h]=num[h];//将当前时间存储
}
}
else//在停止状态下按下记录键查看记录,按动一次序列递减一次,
即查看上一次记录
{
for(h=0;h<4;h++)
num[h]=val[val_index][h];//将当前时间存储
val_index--;
if(val_index<0)
val_index=9;
}
while(!key2) display();
}
}
if(key3==0) //复位按钮
{
delay(5);
if(key3==0)
{
clr();
while(!key3) display();
}
}
if((key4==0)&&(TR0==0)) //模式选择按钮,仅在停止状态下有效
{
delay(5);
if(key4==0)
{
mode=~mode;
while(!key4) display();
}
}
if((key5==0)&&(TR0==0)) //时间设置,仅在停止状态下有效
{
delay(5);
if(key5==0)
{
while(!key5)
display();
setup();
}
}
}
}
void T0_time() interrupt 1
{
uc m;
TH0=0x4b; //定时器定时时间为 50ms
TL0=0xff;
m++;
if(m==20)
{
m=0;
if(mode==1) //正向计数
{
num[0]++;
if(num[0]==10)
{
num[0]=0;
num[1]++;
if(num[1]==6)
{
num[1]=0;
num[2]++;
if(num[2]==10)
{
num[2]=0;
num[3]++;
if(num[3]==10)
num[3]=0;
}
}
}
}
else
{
num[0]--;
if(num[0]>9)
{
num[0]=9;
num[1]--;
if(num[1]>5)
{
num[1]=5;
num[2]--;
if(num[2]>9)
{
num[2]=9;
num[3]--;
if(num[3]>9)
{
num[3]=0;
TR0=0;
fin_flag=1;
clr();
}
}
}
}
}
}
}
void T1_time() interrupt 3
{
uc shan,beep_stop;
TH1=0x4b;
TL1=0xff;
shan++;
beep=0;
if(shan==10)
{
shan=0;
set_shan=~set_shan;
if((fin_flag)||(timing==1)) //当反向计数完成时 或计时时间到时
{
beep_stop++;
beep=1;
if(beep_stop==10)
{
fin_flag=0;
timing=0;
beep_stop=0;
beep=0;
}
}
}
}
第六章 系统调试
单片机应用系统的调试包括硬件和软件两部分,但是他们并不能完全分开。一
般的方法是排除明显的硬件故障,再进行综合调试,排除可能的软/硬件故障。
硬件调试
拿到电路板后,首先要检查加工质量,并确保没有任何方面的错误,如短路
和断路,尤其要避免电源短路;元器件在安装前要逐一检查,用万用表测其数值,
看是否与所用相同;完成焊接后,应先空载上电(芯片座上不插芯片),并检查
各引脚的电位是否正确。若一切正常,方可在断电的情况下将芯片插入,再次检
查各引脚的电位及其逻辑关系。将万用表的探针放到单片机接电源的引脚上检测
一下,看是否符合要求。
1.数码管组各段的确定:将万用表调到标有二极管的档位,由于已知数码管
为共阳极电路,则先将两表笔放到任意两端测量,若此时二极管均不发光,则二
者为两位一体的数码管组的位驱动端。确认好后将黑表笔放于位驱动的一端,红
表笔依次触碰其他管脚,观察对应发光段,即可确定各管脚的标号,操作以来十
分方便。
2.当元件焊接好时,我接通电源,首先发现数码管不亮,完全没有显示,所
以我用万用表测量 p0口的电压,发现端口都有电压,但是偏小,只有 左右,
然后考虑到共阳的驱动,重新加了驱动电路,数码管有显示,但是也存在蜂鸣器
不报警的问题,所以又单独对蜂鸣器的电路进行了分析,最后发现时由于粗心焊
接了错误的电源线导致的,改正之后板子正常工作了。
软件调试
软件调试是通过对程序的连接、执行来发现程序中存在的语法错误与逻辑
错误并加以排除纠正的过程,也可以通过 keil软件进行仿真,能大大的减少设
计过程中的错误。
第七章 设计小结
这次在科研实践的过程中,我受益匪浅。首先,我意识到平时扎实的基础
是关键,只有平时学得牢,在面对时思路才会敏捷,在面对问题时才会快速找到
症结所在并找到解决之道。其次,程序设计是个很复杂的过程,在大的构思实现
之后我们往往还要在很多的细节上对程序加以改进。
在过去的大学学习中,我们大多数接触的是专业课,我们在课堂上学习的
也都是专业课的理论知识,为了锻炼我们的实践能力把所学的专业理论知识运用
到实践中去,这次科研实践为我们搭建了这样一个练习的平台。
在这次科研实践中,我们培养了在实践中研究问题、分析问题和解决问题
的能力,并意识到程序设计不仅要注重整体,更要注重细节;当程序运行过程中
遇到问题时,我们要打开思路,发挥创新精神,力求用最有效简洁的方法解决;
遇到难以解决的困难时,我们要多多请教书本、老师、同学,坚持不懈,就算程
序运行失败了也不要气馁。
这一次的科研实践,让我体会到知识的应用所带来的成就感。与此同时,科
研实践也使我们体会到了团结的力量,再复杂的程序在我们的讨论中也可以得到
答案。科研实践所带来的经验可以让我更好的学习。
参考文献
(1)《51系列单片机高级实例开发指南》 李军著 北京航空航天大学出
版社
(2)《单片机原理与实用技术》 付晓光著 清华大学出版社
(3)《AT89系列单片机原理与接口技术》 王幸之著 北京航空航天大学
出版社
(4)《单片机应用系统设计技术》 张齐 朱西宁 著 电子工业出版社
附录 1:元器件清单
序号 名称 型号、参数 备注 价格/元 数量
1 CPU STC89C52 DIP40封装 1
2 管座 DIP-40 1
3 晶振 49S型 1
4 整流桥 2W10 2A圆桥 1
5 稳压 IC LM7805 TO-220 1
6 元片电容 30pF 2
7 电解电容 1000uf/16V 1
8 电解电容 470uf/16V 1
9 电解电容 10uf/16V 1
10 独石电容 2
11 按钮 6*6按钮-4p 6mm*6mm 5
12 自锁开关 8*8自锁按钮-6P 8mm*8mm 1
13 跳线 5 1
14 电阻 10K/ 金属膜 1/4W 1
15 排阻 A10-103 或 A09-103 直插 1
16 单排排针 直针 1*40 1
17 变压器 220/9V 1
18 电源线 1
19 数码管 四位一体 共阳 1
20 三极管 9013 6
21 电阻 6
22 蜂鸣器 1
23 总价
附录 2:仿真图
附录 3:原理图
附录 4:实物图
蜂
鸣