第一章 设计内容和要求
设计任务
用 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 使用时都是需要上拉电阻才能驱动数码管。另外,因
主控电路
(AT98C52)
显示输出
驱动控制
存储
键盘扫描电路
为单片机的 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芯片,通过与单片机的连接,将电平拉高才能
使发光管正常发光。
a
d
e
f b
c
g
h
第四章 硬件设计
由图 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
Y Y Y Y
N N N N
主程序流程图
图 5-2
系统主程序
#include <>
#define uc unsigned char
#define ui unsigned int
开始
系 统 初 始
化
按键扫描
S1 S2 S3 S4 S5
启动正计
时
启动倒计
时
暂停计时 模式切换 时间设置
显示时间
到达设定时间 蜂鸣
结束
蜂鸣
N
Y
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++)
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:仿真图
XTAL218
XTAL119
ALE30
EA31
PSEN29
RST9
39
38
37
36
35
34
33
32
10
11
12
13
14
17
16
15
28
21
22
23
24
25
26
27
U1
AT89C51
C1
30pF
C2
30pF
X1
CRYSTAL
C3
1nF
R1
10k
R2
10k
R3
10k
R4
10k
R5
10k
R6
10k
R7
10k
R8
10k
R9
R12
R13
10k
R14
10k
Q1
2N1711
Q2
2N1711
Q3
2N1711 Q4
2N1711
LS1
SOUNDER
Q5
2N1711
附录 3:原理图
附录 4:实物图