51单片机4位数码管计数器
时间: 2023-05-26 08:06:50 浏览: 82
以下是一种可以使用TM51单片机驱动4位数码管的计数器代码:
```
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK = P3^0; // 74HC595 shift register
sbit RCLK = P3^1; // 74HC595 shift register
sbit DIO = P3^2; // 74HC595 shift register
uchar code Tab[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
}; // 7-segment display digital code table
void Write74HC595(uchar dat)
{
uchar i;
for(i=0; i<8; i++) {
if(dat & 0x80)
DIO = 1;
else
DIO = 0;
dat <<= 1;
SCLK = 0;
_nop_();
_nop_();
_nop_();
SCLK = 1;
}
_nop_();
RCLK = 0;
_nop_();
_nop_();
_nop_();
RCLK = 1;
}
void Display(uchar num)
{
uchar i, j;
uchar buffer[4] = {0};
for(i=0; num; i++) {
buffer[i] = num % 10;
num /= 10;
}
for(j=0; j<4; j++) {
Write74HC595(0x01 << j);
Write74HC595(Tab[buffer[j]]);
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void main()
{
uint cnt = 0;
while(1) {
Display(cnt++);
if(cnt >= 10000)
cnt = 0;
}
}
```
这个计数器使用了一个74HC595移位寄存器来驱动4位数码管。首先,它定义了一个7段数码管的数字表,然后使用`Write74HC595`函数来将数据写入74HC595。在`Display`函数中,将要显示的数字先转换为每一位数字,然后在循环中使用`Write74HC595`函数将数字写入74HC595,同时使用移位寄存器的输出来选择要显示的位数。在主循环中,计数器不断递增并显示在4位数码管上,当计数器超过9999时将其归零。
需要注意的是,在使用74HC595时需要先将RCLK置为0,才能将数据写入寄存器中心;同时,每写入一位数据时也需要为RCLK和SCLK提供时钟信号。因此,如果想要保证显式质量,可以在写入一位数据后等待一段时间后再写入下一位数据。此外,如果使用的是共阴极的数码管,需要在表中存储每个数字的反码。