用51单片机跟MAX7219实现0~99的秒表
时间: 2023-11-20 13:07:17 浏览: 60
以下是基于AT89C51单片机与MAX7219芯片的0~99秒表设计程序:
1. 定义端口和变量:
```
#define CLK P3_7 //最高位
#define CS P3_6 //中间位
#define DIN P3_5 //最低位
unsigned char code nums[10] = { //数码管显示0~9的编码
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
unsigned char sec = 0; //秒数计数器
unsigned char min = 0; //分钟计数器
```
2. MAX7219初始化:
```
void MAX7219Init()
{
MAX7219SendCmd(0x09, 0x00); //译码方式为BCD码
MAX7219SendCmd(0x0A, 0x03); //亮度设置为最大值
MAX7219SendCmd(0x0B, 0x07); //扫描限制为8个数码管
MAX7219SendCmd(0x0C, 0x01); //显示模式为正常模式
MAX7219SendCmd(0x0F, 0x00); //显示测试关闭
}
```
3. MAX7219发送命令:
```
void MAX7219SendCmd(unsigned char addr, unsigned char data)
{
CS = 0; //拉低片选
SPIWrite(addr); //发送地址
SPIWrite(data); //发送数据
CS = 1; //拉高片选
}
```
4. SPI总线发送数据:
```
void SPIWrite(unsigned char dat)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
CLK = 0; //拉低时钟
DIN = dat & 0x80; //发送最高位
dat <<= 1; //左移一位,准备发送下一位
CLK = 1; //拉高时钟
}
}
```
5. 显示时间:
```
void DisplayTime(unsigned char min, unsigned char sec)
{
MAX7219SendCmd(1, nums[sec % 10]); //显示秒数个位
MAX7219SendCmd(2, nums[sec / 10]); //显示秒数十位
MAX7219SendCmd(3, nums[min % 10]); //显示分钟个位
MAX7219SendCmd(4, nums[min / 10]); //显示分钟十位
}
```
6. 主函数:
```
void main()
{
MAX7219Init(); //MAX7219芯片初始化
while(1)
{
DisplayTime(min, sec); //显示当前时间
Delay1ms(); //延时1毫秒
sec++; //秒数计数器加1
if(sec == 60) //如果秒数计数器达到60
{
sec = 0; //秒数清零
min++; //分钟计数器加1
}
if(min == 100) //如果分钟计数器达到100
{
min = 0; //分钟计数器清零
}
}
}
```
注意:以上程序只是秒表的基本设计,还需要根据具体需求进行修改和完善。同时,MAX7219芯片的电路连接也需要按照数据手册进行正确的接线。