STM32实时钟设计精编版.docx

上传人:b****4 文档编号:27283530 上传时间:2023-06-28 格式:DOCX 页数:24 大小:221.11KB
下载 相关 举报
STM32实时钟设计精编版.docx_第1页
第1页 / 共24页
STM32实时钟设计精编版.docx_第2页
第2页 / 共24页
STM32实时钟设计精编版.docx_第3页
第3页 / 共24页
STM32实时钟设计精编版.docx_第4页
第4页 / 共24页
STM32实时钟设计精编版.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

STM32实时钟设计精编版.docx

《STM32实时钟设计精编版.docx》由会员分享,可在线阅读,更多相关《STM32实时钟设计精编版.docx(24页珍藏版)》请在冰豆网上搜索。

STM32实时钟设计精编版.docx

STM32实时钟设计精编版

STM32实时钟设计  

实现功能:

1、定时器用于实时钟的月日、时分和秒计时;

2、2个按键用于实时钟的显示切换和设置;

3、LCD用于实时钟的月日、时分和秒显示;

4、通过UART接口在微机上显示和设置实时钟。

按键要求:

程序如下:

 #include"stm32f10x.h"

#include"misc.h"

//#include"uart_my.h"

#include"stdio.h"

#include"stm32f10x_exti.h"

//#defineNVIC_SETENA1(*(volatileunsignedlong*)(0xe000e104))

intRx=0;

intreceive=0;

u8temp;

inttime[6];

intled=0x200;

intlcddata[5][2]={0};

intrunnian=1,flag=2,dian=0,flag2=1,timer=0;

charrtc[30];

charno=0;

charlcd_code[16]=  //编码

  {               

   0xeb,//0

   0x0a,//1

   0xad,//2

   0x8f,//3

   0x4e,//4

   0xc7,//5

   0xe7,//6

   0x8a,//7

   0xef,//8

   0xcf,//9

   0x7e,//A

   0x37,//B

   0x71,//C

   0x1f,//D

   0x75,//E

   0x74//F

  };

//privatefunction

voidLCD_Write(intdata,intbit);

voidSystick_Proc(void);

voidLcd_Proc(void);

voidlcd_display0(void);

voidlcd_display1(void);

voidlcd_display2(void);

voidlcd_display3(void);

voidlcd_display4(void);

voidlcd_display5(void);

voidlcd_display6(void);

voidUart_IO_Config(void);

voidLCD_IO_Config(void);

voidLed_IO_Config(void);

voidUart_IO_Config(void);

voidButton_IO_Config(void);

voidEXTILineConfig(void);

voidNVIC_Configuration(void);

voidUart_Init(void);

voidLCD_Init(void);

voidSystick_Init(void);

voidLED_Proc(void);

voidLcd_Proc(void);

voidUart(void);

voiduartPuts(u8*s);

voidUart_r(void);

voidUSART_GetS_Time(void);

intmain(void)

{

 //SystemInit();

 //Systick_Init();

 SystemInit();

 SysTick_Config(9000000);

 LCD_IO_Config();

 Led_IO_Config();

 Uart_IO_Config();

 Button_IO_Config();

 EXTILineConfig();

 NVIC_Configuration();

 Uart_Init();

 LCD_Init();

 while

(1)

 {

 Systick_Proc();

 Lcd_Proc();

 Uart_r();

 }

}

voidSystick_Proc(void)

{

  if(NVIC_STCSR&0x10000)

  {  

dian^=1;

    if((++time[0])>=60)

{time[0]=0;

if((++time[1])>=60)

{time[1]=0;

if((++time[2])>=24)

time[2]=0;

switch(time[4])

{

case1:

case3:

case5:

case7:

case8:

case10:

case12:

if(++time[3]>=32){if(++time[4]>=13)time[4]=1;}break;

case2:

if(runnian){if(++time[3]>=30){if(++time[4]>=13)time[4]=0;}}

else{if(++time[3]>=29){if(++time[4]>=13)time[4]=0;}}break;

case4:

case6:

case9:

case11:

if(++time[3]>=31){if(++time[4]>=13)time[4]=0;}break;

default:

break;//time[4]=0;time[3]=0;

}

}

sprintf(rtc,"%d-%d%d:

%d:

%d",time[4],time[3],time[2],time[1],time[0]);  //格式化输入出处

//sprintf(rtc2,"",);

}

lcddata[0][0]=time[0]%10;

lcddata[0][1]=time[0]/10;

lcddata[1][0]=time[1]%10;

lcddata[1][1]=time[1]/10;

lcddata[2][0]=time[2]%10;

lcddata[2][1]=time[2]/10;

lcddata[3][0]=time[3]%10;

lcddata[3][1]=time[3]/10;

lcddata[4][0]=time[4]%10;

lcddata[4][1]=time[4]/10;

//之前开始以分钟之后才能显示 放在前边

sprintf(rtc,"日期与时间是:

%d-%d%d:

%d:

%d",time[4],time[3],time[2],time[1],time[0]);  //格式化输入出处

Uart();

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,0xd);

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,0xa);

LED_Proc();

}

}

voidLcd_Proc(void)

{   /*inttemp[8];

    temp[0]=((lcd_code[min_display_h]&0xf0)>>4);//分钟十位高四位

  temp[1]=(lcd_code[min_display_h]&0x0f);//分钟十位低四位

  temp[2]=((lcd_code[min_display_l]&0xf0)>>4);//分钟个位高四位

  temp[3]=(lcd_code[min_display_l]&0x0f);//分钟个位低四位

  temp[4]=((lcd_code[sec_display_h]&0xf0)>>4);//秒钟十位高四位

  temp[5]=(lcd_code[sec_display_h]&0x0f);//秒钟十位低四位

  temp[6]=((lcd_code[sec_display_l]&0xf0)>>4);//秒钟个位高四位

  temp[7]=(lcd_code[sec_display_l]&0x0f);//秒钟个位低四位*/

  switch(flag)

  {  

  case0:

lcd_display0();break;

case1:

lcd_display1();break;

  case2:

lcd_display2();break;

  case3:

lcd_display3();break;

  case4:

lcd_display4();break;

  case5:

lcd_display5();break;

  case6:

lcd_display6();break;

default:

break;

  }

}

voidlcd_display0(void)//时分显示

{

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[2][1]]+(dian<<4),17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[2][0]],17);//移位这一块

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[1][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[1][0]],17);

}

  

voidlcd_display1(void)//月日显示

{

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[4][1]],17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[4][0]],17);//移位这一块

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[3][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[3][0]],17);

}

voidlcd_display2(void)//分秒显示

{

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[1][1]]+(dian<<4),17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[1][0]],17);//移位这一块

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[0][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[0][0]],17);

}

voidlcd_display3(void)//月设置显示

{

if(dian)

{

LCD_Write((5<<14)+(0<<8)+no,17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+no,17);//移位这一块

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[3][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[3][0]],17);

}

else

{

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[4][1]],17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[4][0]],17);//移位这一块

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[3][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[3][0]],17);

}

}

voidlcd_display4(void)//天设置显示

{

if(dian)

{

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[4][1]],17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[4][0]],17);//移位这一块

LCD_Write((5<<14)+(4<<8)+no,17);

LCD_Write((5<<14)+(6<<8)+no,17);

}

else

{

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[4][1]],17);

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[4][0]],17);

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[3][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[3][0]],17);

}

}

voidlcd_display5(void)//时设置显示

{

if(dian)

{

LCD_Write((5<<14)+(0<<8)+no,17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+no,17);//移位这一块

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[1][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[1][0]],17);

}

else

{

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[2][1]],17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[2][0]],17);//移位这一块

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[1][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[1][0]],17);

}

}

voidlcd_display6(void)//分设置显示

{

if(dian)

{

LCD_Write((5<<14)+(4<<8)+no,17);//移位出现问题

LCD_Write((5<<14)+(6<<8)+no,17);//移位这一块

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[2][1]],17);

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[2][0]],17);

}

else

{

LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[2][1]],17);//移位出现问题

LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[2][0]],17);//移位这一块

LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[1][1]],17);

LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[1][0]],17);

}

}

voidLCD_IO_Config(void)

{

 GPIO_InitTypeDefGPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);

 GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;

   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

   GPIO_Init(GPIOC,&GPIO_InitStructure);

}

voidButton_IO_Config(void)

{

 GPIO_InitTypeDefGPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

 GPIO_InitStructure.GPIO_Pin= GPIO_Pin_14|GPIO_Pin_15;

   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置错误

   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

   GPIO_Init(GPIOB,&GPIO_InitStructure);

}

   

voidLed_IO_Config(void)

{

  GPIO_InitTypeDefGPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

  /*ConfigurePC.06,PC.07,PC.08andPC.09asoutputpush-pull*/

  GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

  GPIO_Init(GPIOC,&GPIO_InitStructure);

}

voidUart_IO_Config(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

   USART_ClearITPendingBit(USART1,USART_IT_TC|USART_IT_RXNE);//RX

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //接收

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA,&GPIO_InitStructure);

  //TX

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//发送

  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

  GPIO_Init(GPIOA,&GPIO_InitStructure);

}

voidEXTILineConfig(void)

{

 EXTI_InitTypeDefEXTI_InitStructure;

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);

 EXTI_InitStructure.EXTI_Line=EXTI_Line14|EXTI_Line15;

 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

 EXTI_InitStructure.EXTI_LineCmd=ENABLE;

 EXTI_Init(&EXTI_InitStructure);

}

voidNVIC_Configuration(void)

{

  

 NVIC_InitTypeDefNVIC_InitStructure;

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//抢占优先级组4

 //2位抢占优先级2位子优先级

  /*EnabletheEXTI14InterruptonPB.14*///sw3输入时间

 NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//对于相同中断号的中断无法设置抢断优先级

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

 NVIC_Init(&NVIC_InitStructure);

  /*EnabletheEXTI15InterruptonPB.15//sw2led方向

 NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;

 NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;

 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

 NVIC_Init(&NVIC_InitStructure

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1