单片机实验报告,

2024-05-2601:24:31综合资讯0

2. 基于proteus的单片机开发实例16--简易秒表
2.1. 实验目的
本例旨在通过利用单片机的定时器/计数器功能,实现一个简单秒表功能,使用两位数码管来显示时间,可通过按键启动、停止和清零秒表。
2.2. 设计思路
简易秒表仅显示秒数,不涉及毫秒。当第一次按下按键时,秒表开始计时,数码管从00开始显示,每秒递增,直至99,然后重新从00开始。第二次按下按键可停止计时,数字停止变化。第三次按下按键清零,显示变为00。
2.3. 基础知识
本实例涉及定时器/计数器的定时功能、数码管显示原理以及按鍵识别原理。
该实例的程序代码较之前复杂,包含端口位和位变量定义,数组定义和初始化,函数定义以及C语言中switch和case语句的使用等。这些知识点将在后续讲解中详细介绍。
2.4. 电路设计
电路图如图1所示。单片机的P0和P1口连接两个共阳极数码管,用于显示时间。按键连接到P3.4端口,当按键未按下时,P3.4处于高电平,按下时变为低电平。
2.5. 程序设计
程序代码如下:

include <AT89x52.h>
sbit K1 = P3^4;
bit Key_State;
unsigned char DSY_CODE[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
unsigned char ViewData[2];
void Key_Event_Handle(void);
void T0_init(void);
void Display_DSY(unsigned char dat,unsigned char addr);
void show_timer(void) interrupt 1;
main()
{
Key_State = 0;
T0_init();
while(1)
{
Key_Event_Handle();
show_timer();
}
}
void Key_Event_Handle(void)
{
if (K1==0&&Key_State==0) //检测按键第一次按下
{
Key_State=1; //按键第一次按下标记
ET0=1; //开启定时器中断
}
else if(K1==0&&Key_State ==1) //按键第二次按下
{
Key_State=2; //按键第二次按下标记
ET0=0; //关闭定时器中断
}
else if (K1==0&&Key_State==2) //按键第三次按下
{
Key_State=0; //按键第三次按下标记
TH0=0; RC=0;
Display_DSY(0,1); //显示0
Display_DSY(0,0); //显示0
}
}
void T0_init(void)
{
TR0=1; //启动定时器0
TMOD=0x10; //设置定时器工作方式1:16位定时器模式
TH0=(65535-50000)/256; //设置初值
TL0=(65535-50000)%256;
ET0=0; //禁止定时器中断
EA=1; //允许所有中断
}
void Display_DSY(unsigned char dat,unsigned char addr)
{
unsigned char temp;
temp = DSY_CODE[dat];
switch(addr)
{
case 0:
P0=temp;
P1=0X08;
break;
case 1:
P0=temp;
P1=0X02;
break;
}
}
void show_timer(void) interrupt 1
{
static unsigned int dat =0;
static unsigned char i=1;
dat++;
if(dat==100)
{
dat=0;
}
if(dat%10==0)
{
Display_DSY(dat/10,i);
i=0;
}
Display_DSY(dat%10,i);
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
}

2.6. 仿真演示
编译程序后,将生成的hex文件加载到proteus电路中的单片机中进行仿真。仿真过程中,按下按键并观察数码管显示的变化,了解各个按键功能对应的时间显示变化。
仿真视频如下:
[仿真演示视频]
2.7. 总结
通过本实例,我们加深了对单片机定时器/计数器功能的理解,掌握了51单片机C语言编程中的位定义、数组定义、函数定义和switch、case语句的使用,为进一步提高编程能力奠定了基础。