基于单片机的数字钟设计的代码
时间: 2023-08-10 14:07:16 浏览: 49
以下是基于单片机的数字钟设计代码,以常用的STM32为例:
```
#include "stm32f10x.h"
unsigned char code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码表
void delay(unsigned int i) //延时函数
{
while(i--);
}
void GPIO_Configuration(void) //GPIO初始化函数
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void main()
{
unsigned char sec,min,hour; //秒、分、时
unsigned char i, j;
GPIO_Configuration(); //GPIO初始化
while(1)
{
for(hour=0;hour<24;hour++) //小时循环
{
for(min=0;min<60;min++) //分钟循环
{
for(sec=0;sec<60;sec++) //秒循环
{
for(j=0;j<50;j++) //循环50次
{
for(i=0;i<8;i++) //循环8次,显示8位LED数码管
{
switch(i) //选择数码管
{
case 0:GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_ResetBits(GPIOA, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);break; //选择第1个数码管
case 1:GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);break; //选择第2个数码管
case 2:GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);break; //选择第3个数码管
case 3:GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);break; //选择第4个数码管
case 4:GPIO_SetBits(GPIOA, GPIO_Pin_4);GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);break; //选择第5个数码管
case 5:GPIO_SetBits(GPIOA, GPIO_Pin_5);GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7);break; //选择第6个数码管
case 6:GPIO_SetBits(GPIOA, GPIO_Pin_6);GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7);break; //选择第7个数码管
case 7:GPIO_SetBits(GPIOA, GPIO_Pin_7);GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);break; //选择第8个数码管
}
GPIO_SetBits(GPIOB, table[sec%10]); //显示秒个位
delay(1000); //延时1秒
GPIO_SetBits(GPIOB, table[sec/10]|0x80); //显示秒十位,最高位为1,表示显示冒号
delay(1000); //延时1秒
GPIO_SetBits(GPIOB, table[min%10]); //显示分个位
delay(1000); //延时1秒
GPIO_SetBits(GPIOB, table[min/10]); //显示分十位
delay(1000); //延时1秒
GPIO_SetBits(GPIOB, table[hour%10]); //显示时个位
delay(1000); //延时1秒
GPIO_SetBits(GPIOB, table[hour/10]|0x80); //显示时十位,最高位为1,表示显示冒号
delay(1000); //延时1秒
}
}
}
}
}
}
}
```
在该代码中,使用了一个数码管段码表来显示数字,循环显示了秒、分、时,并且在冒号的位置显示了一个点来分隔时间。同时,通过GPIO初始化函数将相关的IO口设置为输出模式,并通过GPIO_SetBits和GPIO_ResetBits函数来控制数码管的显示。