STC89c52单片机制作数码管千位计数器代码
时间: 2023-12-14 08:39:30 浏览: 103
51单片机STC89C52RC开发板例程之按键计数器.rar
下面是一个简单的STC89C52单片机实现数码管千位计数器的代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DIO = P0^0; // 数码管数据引脚
sbit CLK = P0^1; // 数码管时钟引脚
sbit EN = P0^2; // 数码管使能引脚
uint num = 0; // 计数器数值
void delay(uint x) // 延时函数,用于控制数码管显示时间
{
uint i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
void sendByte(uchar dat) // 发送一个字节到数码管
{
uchar i;
for(i = 0; i < 8; i++)
{
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
_nop_();
CLK = 0;
_nop_();
}
}
void init() // 初始化函数,设置计数器中断和定时器
{
TMOD = 0x01; // 定时器0,模式1,16位定时器
TH0 = 0xB1; // 定时器初始值设为0xB1B1,1ms定时
TL0 = 0xB1;
ET0 = 1; // 开启定时器中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void main()
{
init(); // 初始化
while(1)
{
EN = 0; // 数码管使能
sendByte(0x7F); // 点亮千位数码管
sendByte(num / 1000); // 发送千位数码管的数字
EN = 1; // 数码管禁能
delay(5); // 延时
num++; // 计数器加1
if(num >= 10000) // 如果计数器超过9999,重新从0开始计数
num = 0;
}
}
void T0_ISR() interrupt 1 // 定时器0中断处理函数
{
TH0 = 0xB1; // 重新加载定时器初值
TL0 = 0xB1;
static uint cnt = 0;
cnt++;
if(cnt >= 10) // 每10ms计数器加1
{
cnt = 0;
num++;
if(num >= 10000)
num = 0;
}
}
```
这个代码使用定时器中断来实现计数器的计数,并且每隔10ms计数器加1,同时使用延时函数来控制数码管显示时间。如果想要调整计数速度和显示时间,可以根据需要修改定时器初值和延时时间。
阅读全文