51单片机用c语言使用定时计数器实现两位数码管显示0~59秒的两位数秒表
时间: 2023-07-16 11:11:38 浏览: 236
这里给出一个简单的实现,使用定时器0作为计数器,每秒钟中断一次,然后在中断处理函数中更新数码管的显示。
首先需要定义数码管的引脚连接:
```c
#define LED1 P2_0 // 数码管第一位
#define LED2 P2_1 // 数码管第二位
```
然后定义计数器变量和中断处理函数:
```c
volatile unsigned char count = 0; // 计数器变量
void timer0_isr() interrupt 1 {
TH0 = 0x4C; // 定时器0初值,每1ms中断一次
TL0 = 0x00;
count++; // 计数器加1
if (count > 59) count = 0; // 计数器归零
LED1 = count / 10; // 显示十位
LED2 = count % 10; // 显示个位
}
```
在主函数中进行定时器的初始化和启动:
```c
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x4C; // 定时器0初值,每1ms中断一次
TL0 = 0x00;
ET0 = 1; // 允许定时器0中断
EA = 1; // 打开总中断开关
TR0 = 1; // 启动定时器0
while (1); // 程序循环
}
```
这样就可以实现一个简单的秒表了。注意,此程序中没有按键处理,如果需要添加按键控制,可以在中断处理函数中处理按键事件。
相关问题
stc89c51单片机使用C语言编程实现使用计数器显示0~59秒的两位秒表
下面是使用STC89C51单片机和C语言编写的秒表程序,它可以在数码管上显示0~59秒的计时器:
```c
#include <reg51.h>
// 数码管段选引脚定义
sbit seg_a = P1^0;
sbit seg_b = P1^1;
sbit seg_c = P1^2;
sbit seg_d = P1^3;
sbit seg_e = P1^4;
sbit seg_f = P1^5;
sbit seg_g = P1^6;
sbit seg_dp = P1^7;
// 数码管位选引脚定义
sbit dig_1 = P2^0;
sbit dig_2 = P2^1;
// 定义计数器变量
unsigned int counter = 0;
// 延时函数
void delay(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++);
}
// 数码管显示函数
void display(unsigned int num)
{
// 数码管0~9对应的段选信号
unsigned char table[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
// 将个位和十位分别取出
unsigned char ones = num % 10;
unsigned char tens = num / 10 % 10;
// 数码管位选
dig_1 = 0;
dig_2 = 1;
// 数码管段选
seg_dp = 1;
seg_a = table[ones] & 0x01;
seg_b = table[ones] & 0x02;
seg_c = table[ones] & 0x04;
seg_d = table[ones] & 0x08;
seg_e = table[ones] & 0x10;
seg_f = table[ones] & 0x20;
seg_g = table[ones] & 0x40;
delay(1);
// 数码管位选
dig_1 = 1;
dig_2 = 0;
// 数码管段选
seg_dp = 0;
seg_a = table[tens] & 0x01;
seg_b = table[tens] & 0x02;
seg_c = table[tens] & 0x04;
seg_d = table[tens] & 0x08;
seg_e = table[tens] & 0x10;
seg_f = table[tens] & 0x20;
seg_g = table[tens] & 0x40;
delay(1);
}
void main()
{
// 设置定时器0工作方式
TMOD &= 0xF0;
TMOD |= 0x01;
// 设置定时器初值
TH0 = 0xFC;
TL0 = 0x67;
// 启动定时器0
TR0 = 1;
while(1)
{
// 判断定时器是否溢出
if(TF0)
{
TF0 = 0;
// 计数器加1
counter++;
// 如果计数器大于等于60,则归零
if(counter >= 60)
counter = 0;
// 在数码管上显示计数器的值
display(counter);
}
}
}
```
该程序使用定时器0来进行计时,每1秒钟定时器就会溢出一次,此时计数器加1,并在数码管上显示计数器的值。当计数器的值大于等于60时,将其归零。数码管的显示函数通过控制段选和位选信号来实现。
需要注意的是,该程序中的延时函数只是简单地进行了一个粗略的延时,如果需要更精确的延时可以使用定时器或其他方法。另外,由于定时器0的计时精度较低,因此在长时间计时时可能会有一定的误差。
stc89c51单片机使用C语言编程实现使用计数器显示0~59秒的两位秒表程序
以下是使用 STC89C51 单片机和 C 语言编写的秒表程序。该程序使用定时器中断来计时,并通过数码管显示时间。
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1 = P2^0;
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
uchar seconds = 0;
uchar minutes = 0;
void delay(uint ms) // 延时函数
{
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display() // 显示函数
{
uchar d1, d2, d3, d4;
d1 = seconds % 10;
d2 = seconds / 10;
d3 = minutes % 10;
d4 = minutes / 10;
D1 = 0; P0 = d1; D1 = 1;
D2 = 0; P0 = d2; D2 = 1;
D3 = 0; P0 = d3; D3 = 1;
D4 = 0; P0 = d4; D4 = 1;
}
void timer0() interrupt 1 // 定时器中断函数
{
TH0 = 0xFC;
TL0 = 0x67;
seconds++;
if(seconds >= 60)
{
seconds = 0;
minutes++;
}
display();
}
void main()
{
TMOD = 0x01; // 定时器0,模式1
TH0 = 0xFC; // 定时100us
TL0 = 0x67;
ET0 = 1; // 打开定时器中断
EA = 1; // 打开总中断
TR0 = 1; // 开始计时
while(1);
}
```
在上面的程序中,我们使用了数码管的共阴极接法,即 D1 ~ D4 分别对应 P2.0 ~ P2.3,需要通过设置 P2 端口的相应位来控制数码管的亮灭。在 `display()` 函数中,我们通过取模运算和除法运算来得到秒和分的个位和十位,然后将其分别显示在数码管上。
在 `timer0()` 函数中,我们每隔 100us 就会触发一次定时器中断。在中断服务程序中,我们将秒数加一,并判断是否需要将分钟数加一。然后调用 `display()` 函数更新数码管的显示。
最后,在 `main()` 函数中,我们打开定时器中断和总中断,并开始计时。由于程序没有其他操作,因此可以使用一个空循环来保持程序的运行。
阅读全文