用51单片机C语言代码设计数字电子时钟电路: 功能要求: 1. 基本功能: (1) 用 6 位数码管显示,显示格式:时.分.秒,开机缺省时间显示 11.59.58。 (2) 12/24 小时制切换(按键切换)。 2. 扩展功能: (1) 可校准:按键设置时钟(时分秒)初始值。 (2) 秒表功能:按键启动、停止,最大计时 999.9 秒(4 位数码管显 示),秒表功能模式时时钟正常运行,不受影响。
时间: 2024-03-13 07:47:37 浏览: 343
好的,这是一个基于8051单片机的数字电子时钟的C语言代码设计方案,包括基本功能和扩展功能:
```
#include <reg52.h> // 引入头文件
#define uchar unsigned char // 宏定义
#define uint unsigned int
// 数码管段选编码
uchar code DIGITS[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
// 变量定义
uchar hour = 11, minute = 59, second = 58; // 时间
uchar mode = 0; // 模式:0-时钟模式;1-秒表模式
uchar start = 0; // 秒表开始标志
uint count = 0; // 秒表计数器
// 函数声明
void display(); // 数码管显示函数
void delay(uint x); // 延时函数
void getTime(); // 获取时间函数
void setTime(); // 设置时间函数
void button(); // 按键处理函数
void stopwatch(); // 秒表计时函数
void main() {
TMOD = 0x01; // 定时器0,工作模式1
TH0 = 0x3c; // 定时器0,计数初值
TL0 = 0xb0;
TR0 = 1; // 定时器0,开始计数
ET0 = 1; // 定时器0,允许中断
EA = 1; // 全局中断允许
while (1) {
button(); // 按键处理
if (mode == 0) {
getTime(); // 获取时间
} else {
stopwatch(); // 秒表计时
}
display(); // 数码管显示
}
}
void display() {
if (hour > 12) { // 12小时制,下午显示P
P1 = DIGITS[hour - 12];
P2 = 0x08;
} else {
P1 = DIGITS[hour];
P2 = 0x00;
}
P1 = P1 + (DIGITS[minute] << 8); // 显示分和秒
P3 = DIGITS[second];
}
void delay(uint x) {
uint i, j;
for (i = x; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void getTime() {
if (TR0 == 1) { // 判断是否到1秒
TR0 = 0; // 停止定时器0
count++; // 秒表计数器加1
second++; // 秒加1
if (second == 60) { // 分钟加1
second = 0;
minute++;
}
if (minute == 60) { // 小时加1
minute = 0;
hour++;
}
if (hour == 24) { // 24小时制
hour = 0;
}
TH0 = 0x3c; // 重置定时器0
TL0 = 0xb0;
TR0 = 1; // 开始定时器0
}
}
void setTime() {
uchar i;
while (1) { // 进入设置模式
display(); // 数码管显示当前时间
if (P1_0 == 0) { // 按键1:小时加1
delay(10); // 延时去抖动
if (P1_0 == 0) {
hour++;
if (hour == 24) {
hour = 0;
}
}
}
if (P1_1 == 0) { // 按键2:分钟加1
delay(10);
if (P1_1 == 0) {
minute++;
if (minute == 60) {
minute = 0;
}
}
}
if (P1_2 == 0) { // 按键3:秒钟加1
delay(10);
if (P1_2 == 0) {
second++;
if (second == 60) {
second = 0;
}
}
}
if (P1_3 == 0) { // 按键4:退出设置模式
delay(10);
if (P1_3 == 0) {
for (i = 0; i < 10; i++) { // 短暂闪烁
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
delay(100);
display();
delay(100);
}
return; // 返回正常模式
}
}
}
}
void button() {
if (P1_4 == 0) { // 按键5:切换12/24小时制
delay(10);
if (P1_4 == 0) {
if (mode == 0) { // 时钟模式,切换12/24小时制
hour = hour + 12;
if (hour == 24) {
hour = 0;
}
}
if (mode == 1) { // 秒表模式,启动/停止秒表
if (start == 0) {
start = 1;
} else {
start = 0;
}
}
}
}
if (P1_5 == 0) { // 按键6:进入设置模式
delay(10);
if (P1_5 == 0) {
for (uint i = 0; i < 1000; i++) { // 长暂闪烁
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
delay(10);
display();
delay(10);
}
setTime(); // 进入设置模式
}
}
}
void stopwatch() {
if (start == 1) { // 秒表开始计时
count++;
if (count == 10000) { // 最大计时999.9秒
count = 0;
start = 0;
}
}
P1 = DIGITS[count / 1000];
P2 = 0x10;
P1 = P1 + (DIGITS[count / 100 % 10] << 8);
P2 = P2 + 0x08;
P1 = P1 + (DIGITS[count / 10 % 10] << 16);
P2 = P2 + 0x04;
P1 = P1 + (DIGITS[count % 10] << 24);
P2 = P2 + 0x02;
}
```
以上是一个基于8051单片机的数字电子时钟的C语言代码设计方案,包括基本功能和扩展功能。代码中包含了数码管显示、按键处理、定时器、计时器等功能的实现,可以根据实际需求进行修改和调整。
阅读全文