51单片机计时秒表59.99
时间: 2023-10-30 14:09:47 浏览: 95
51单片机计时秒表59.99是一种基于AT89C51单片机的多功能秒表系统,它利用单片机的定时器/计数器原理,结合显示电路、电源电路、LED数码管以及按键电路来设计计时器。该秒表系统采用6联式数码管显示时、分、秒,格式为*—**.**,范围从0分0.00秒到9分59.99秒。当按下启动键时,秒表开始计时;当按下暂停键时,秒表停止计时并暂停显示;当按下复位键时,秒表清零并停止计时。该秒表系统的设计使得软、硬件有机地结合起来,能够正确地进行计时和显示。而单片机内部带有定时器系统,通过设置与其相关的特殊功能寄存器来选择启用定时器或计时器,CPU一旦设置开启定时功能后,定时器便在晶振的作用下自动开始计时,当计数器记满后,会产生中断,即通知CPU进行相关处理。
相关问题
设计一个基于51单片机的秒表计时器,实现如下功能: 计时器的计时精度为百分之一秒,即0.01秒。 计时时间显示格式:hh.mm.ss.SS。其中:hh表示小时数,mm表示分钟数ss表示秒数SS表示百分秒数如“1.59.59.99”表示1小时59分59秒99分秒的代码
以下是基于51单片机的秒表计时器的代码:
```
#include <reg51.h>
#define uint unsigned int
uint tick_count = 0; // 计时器累计计数器
uint ss = 0; // 秒
uint mm = 0; // 分钟
uint hh = 0; // 小时
void delay_ms(uint x) // 延时函数,x为毫秒数
{
uint i, j;
for (i = x; i > 0; i--) {
for (j = 112; j > 0; j--);
}
}
void timer0_init() // 定时器0初始化函数
{
TMOD |= 0x01; // 设置为模式1(16位定时器)
TH0 = 0xFC; // 定时器初值为65536-10000=0xFC18
TL0 = 0x18;
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
}
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xFC;
TL0 = 0x18;
tick_count++; // 计时器累计计数器加1
}
void display_time() // 显示时间函数
{
uint i;
uint buf[8] = {0}; // 字符串缓存
buf[0] = hh / 10;
buf[1] = hh % 10;
buf[2] = mm / 10;
buf[3] = mm % 10;
buf[4] = ss / 10;
buf[5] = ss % 10;
buf[6] = tick_count / 10 % 10;
buf[7] = tick_count % 10;
for (i = 0; i < 8; i++) {
P0 = buf[i];
P2 &= 0x0F;
P2 |= i << 4;
delay_ms(2);
}
}
void main()
{
timer0_init();
while (1) {
if (tick_count >= 10000) { // 每10000次定时器中断为1秒
tick_count = 0;
ss++;
if (ss >= 60) {
ss = 0;
mm++;
if (mm >= 60) {
mm = 0;
hh++;
if (hh >= 24) {
hh = 0;
}
}
}
}
display_time(); // 显示时间
}
}
```
在此代码中,我们使用了定时器0来实现精确的计时。定时器0的时钟源为系统时钟12MHz,设置为模式1(16位定时器),初值为65536-10000=0xFC18,即定时10毫秒。每次定时器0中断服务函数被调用时,计时器累计计数器加1。当计时器累计计数器达到10000时,表示已经过去了1秒,此时秒数加1;当秒数达到60时,秒数清零,分钟数加1;当分钟数达到60时,分钟数清零,小时数加1;当小时数达到24时,小时数清零。
在显示时间函数中,我们将时间按照格式转换成字符串存储在缓存中,然后通过P0口输出数字,通过P2口控制数码管的位选。为了使数码管能够正常显示,我们还需要在每个位选之间加入一定的延时,这里我们使用了一个简单的延时函数```delay_ms```。
利用单片机实现00到59.99的计数秒表功能代码
我可以为你提供一个基于Arduino的程序来实现计数秒表功能。首先,你需要连接一块LCD显示屏和一个按钮到Arduino板。
下面是示例代码:
```
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //初始化LCD引脚
int buttonPin = 7; //按钮引脚
int buttonState = 0; //记录按钮状态
long startTime = 0; //记录起始时间
long elapsedTime = 0; //记录已经流逝的时间
float seconds = 0; //计算秒数
void setup() {
lcd.begin(16, 2); //设置LCD显示屏的列和行数
pinMode(buttonPin, INPUT); //设置按钮引脚为输入
lcd.print("Press button"); //打印提示消息
}
void loop() {
buttonState = digitalRead(buttonPin); //读取按钮状态
if (buttonState == HIGH) { //如果按钮被按下
if (startTime == 0) { //如果是第一次启动秒表
startTime = millis(); //记录起始时间
lcd.clear(); //清空LCD显示屏
} else { //如果不是第一次启动秒表
elapsedTime = millis() - startTime; //计算已经流逝的时间
seconds = (float)elapsedTime / 1000.0; //转换为秒数
lcd.setCursor(0, 1); //设置光标位置
lcd.print("Time: "); //打印提示消息
lcd.print(seconds, 2); //打印秒数,保留两位小数
}
delay(100); //延时,避免重复按下按钮
}
}
```
这段代码将在LCD显示屏上实现计数秒表功能。按下按钮后,它将启动秒表并开始计时。再次按下按钮,它将计算已经流逝的时间并显示在LCD屏幕上。
阅读全文