51 单片机定时器数码管 从1数到100(带三个按键控制开始,暂停,复位)
时间: 2024-02-26 16:58:13 浏览: 134
以下是一个基于51单片机的定时器和数码管的计数器程序,可以实现从1数到100,并且带有三个按键控制开始、暂停和复位:
```c
#include <reg52.h>
sbit KEY_START = P3^0; // 开始键
sbit KEY_PAUSE = P3^1; // 暂停键
sbit KEY_RESET = P3^2; // 复位键
sbit DIG_A = P1^0; // 数码管a段
sbit DIG_B = P1^1; // 数码管b段
sbit DIG_C = P1^2; // 数码管c段
sbit DIG_D = P1^3; // 数码管d段
sbit DIG_E = P1^4; // 数码管e段
sbit DIG_F = P1^5; // 数码管f段
sbit DIG_G = P1^6; // 数码管g段
sbit DIG_DP = P1^7; // 数码管小数点
unsigned char code DIG_TAB[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 // 数码管0~9的编码
};
unsigned int cnt = 0; // 计数器,从1到100
unsigned char flag_start = 0; // 标志位,表示是否开始计数
unsigned char flag_pause = 0; // 标志位,表示是否暂停计数
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = 0; i < t; i++)
{
for (j = 0; j < 120; j++);
}
}
void display(unsigned int num) // 数码管显示函数
{
unsigned char i;
unsigned char dig[4]; // 数码管位数
dig[0] = num / 1000; // 千位
dig[1] = num / 100 % 10; // 百位
dig[2] = num / 10 % 10; // 十位
dig[3] = num % 10; // 个位
for (i = 0; i < 4; i++)
{
switch (i)
{
case 0:
DIG_DP = 1; // 小数点位不亮
break;
case 1:
DIG_DP = 0; // 小数点位亮
break;
case 2:
DIG_DP = 1;
break;
case 3:
DIG_DP = 1;
break;
}
P0 = DIG_TAB[dig[i]]; // 显示数码管
switch (i)
{
case 0:
DIG_A = 0;
break;
case 1:
DIG_B = 0;
break;
case 2:
DIG_C = 0;
break;
case 3:
DIG_D = 0;
break;
}
delay(1); // 等待一段时间
DIG_A = 1;
DIG_B = 1;
DIG_C = 1;
DIG_D = 1;
}
}
void timer0_init() // 定时器初始化函数
{
TMOD |= 0x01; // 定时器0工作在模式1下
TH0 = (65536 - 50000) / 256; // 定时50ms
TL0 = (65536 - 50000) % 256;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void main()
{
timer0_init(); // 定时器初始化
while (1)
{
if (!KEY_START) // 如果按下开始键
{
flag_start = 1; // 标志位表示开始计数
}
if (!KEY_PAUSE) // 如果按下暂停键
{
flag_pause = !flag_pause; // 标志位表示是否暂停计数
}
if (!KEY_RESET) // 如果按下复位键
{
cnt = 0; // 计数器清零
flag_start = 0; // 标志位表示停止计数
flag_pause = 0;
display(cnt); // 显示数码管为0
}
}
}
void timer0_isr() interrupt 1 // 定时器0中断函数
{
if (flag_start && !flag_pause) // 如果开始计数且未暂停计数
{
cnt++; // 计数器加1
if (cnt > 100) // 如果计数到100
{
cnt = 0; // 计数器清零
}
display(cnt); // 显示数码管
}
}
```
在上述代码中,使用了定时器0来实现计数器的计数和数码管的显示。当按下开始键时,标志位flag_start被设置为1,计数器cnt开始自增并且定时器开始工作。当按下暂停键时,标志位flag_pause被设置为1,计数器cnt停止自增。当按下复位键时,计数器cnt清零,标志位flag_start和flag_pause被设置为0,数码管显示为0。
需要注意的是,在实际应用中,需要根据具体的电路和数码管类型来修改代码中涉及到的引脚、数码管显示方式等参数。
阅读全文