借用了原子哥的程序,自己修改后又加入了北斗模块,通过北斗读取实时的时间显示到液晶上。
单片机源程序如下:
- #include "stm32f10x.h"
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "gps.h"
- #define LCD_1602RS GPIO_Pin_12
- #define LCD_1602RW GPIO_Pin_13
- #define LCD_1602EN GPIO_Pin_14
- unsigned char USART_Buff[12];
- unsigned char table[5]= "times";
- unsigned char a;
- u8 i = 0;
- u8 res=0;
- u8 flag_M=0;
- u8 flag_C=0;
- u8 flag = 0;
- u8 j = 0;
- u8 t = 0;
- //串口初始化
- void My_USART1_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStrue;
- USART_InitTypeDef USART_InitStrue;
- NVIC_InitTypeDef NVIC_InitStrue;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使用相应的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
- GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
- GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
- GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
- GPIO_Init (GPIOA,&GPIO_InitStrue); //初始化IO口
-
- GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING ;
- GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
- GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
- GPIO_Init (GPIOA,&GPIO_InitStrue); //初始化IO口
-
- USART_InitStrue.USART_BaudRate=9600;
- USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
- USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
- USART_InitStrue.USART_Parity=USART_Parity_No;
- USART_InitStrue.USART_StopBits=USART_StopBits_1;
- USART_InitStrue.USART_WordLength=USART_WordLength_8b;
-
- USART_Init(USART1,&USART_InitStrue);
- USART_Cmd(USART1,ENABLE); //使能串口1
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启接受中断
-
- NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
- NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
- NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
- NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
- NVIC_Init(&NVIC_InitStrue); //中断优先级的设置
- }
- //写命令
- void LCD1602_Write_Cmd(unsigned char cmd)
- {
- GPIO_ResetBits(GPIOF,LCD_1602RS); //RS 0
- delay_us(2);
- GPIO_ResetBits(GPIOF,LCD_1602RW); //RW 0
-
- GPIO_Write(GPIOD, cmd);
- GPIO_ResetBits(GPIOF,LCD_1602EN); //E 0
- delay_us(2);
- GPIO_SetBits(GPIOF,LCD_1602EN); //E 1
- delay_us(2);
- GPIO_ResetBits(GPIOF,LCD_1602EN); //E 0
- }
-
-
- //写数据
- void LCD1602_Write_Date(unsigned char dat)
- {
- GPIO_SetBits(GPIOF,LCD_1602RS); //RS 1 RS高是数据,低是命令
- delay_us(2);
- GPIO_ResetBits(GPIOF,LCD_1602RW); //RW 0
- GPIO_Write(GPIOD, dat);
- GPIO_ResetBits(GPIOF,LCD_1602EN); //E 0
- delay_us(2);
- GPIO_SetBits(GPIOF,LCD_1602EN); //E 1
- delay_us(2);
- GPIO_ResetBits(GPIOF,LCD_1602EN); //E 0
- delay_us(2);
- }
-
- //VO 11
- //RS 12
- //RW 13
- //E 14
-
- int main(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- SystemInit(); //系统时钟初始化
- delay_init(); //延时函数初始化
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOF, ENABLE); //使能PF,PD端口时钟
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD0~7
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIOF 11,14,13,12
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
-
- delay_ms(300);
- //液晶初始化
- LCD1602_Write_Cmd(0x38); //显示16*2
- delay_us(10);
- LCD1602_Write_Cmd(0x0c);
- delay_us(10);
- LCD1602_Write_Cmd(0x06); //读写字符后地址加1,屏显不移动
- delay_us(10);
- LCD1602_Write_Cmd(0x01); //清屏,数据指针清零
- delay_us(10);
- LCD1602_Write_Cmd(0x80); //设置数据地址指针初始值
- delay_us(2);
- My_USART1_Init();
- GPIO_ResetBits(GPIOA,GPIO_Pin_10);
- while(1)
- {
- delay_ms(1);
- if(flag == 1)
- {
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC));
- flag=0;
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC));
-
- for(i = 0;i<5;i++)
- {
- LCD1602_Write_Cmd(0x80+i+5);
- delay_ms(10);
- LCD1602_Write_Date(table[i]);
- delay_ms(10);
-
- }
-
- //显示时间
- for(j =3;j<5;j++) //h
- {
- LCD1602_Write_Cmd(0xc0+j-1);
- delay_ms(10);
- LCD1602_Write_Date(USART_Buff[j]);
- delay_ms(10);
- USART_SendData(USART1,USART_Buff[j]);
- }
- LCD1602_Write_Cmd(0xc0+4);
- delay_ms(10);
- LCD1602_Write_Date(':');
- delay_ms(10);
- for(j =5;j<7;j++) //m
- {
- LCD1602_Write_Cmd(0xc0+j);
- delay_ms(10);
- LCD1602_Write_Date(USART_Buff[j]);
- delay_ms(10);
- USART_SendData(USART1,USART_Buff[j]);
- }
- LCD1602_Write_Cmd(0xc0+7);
- delay_ms(10);
- LCD1602_Write_Date(':');
- delay_ms(10);
- for(j =7;j<12;j++) //s
- {
- LCD1602_Write_Cmd(0xc0+j+1);
- delay_ms(10);
- LCD1602_Write_Date(USART_Buff[j]);
- delay_ms(10);
- USART_SendData(USART1,USART_Buff[j]);
- }
- }
- delay_ms(1000);
- }
- }
- void USART1_IRQHandler(void)
- {
- if(USART_GetITStatus(USART1,USART_IT_RXNE))
- {
- USART_Buff[i++] = USART_ReceiveData(USART1);
- if(flag_M==1)
- {
- USART_SendData(USART1,0+0x30);
- if(USART_Buff[1] == 'C')
- {
- flag_C=1;
- }
- else
- {
- flag_M=0;
- i = 0;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
usart 1062 BS280 - prefer.7z
(190.6 KB, 下载次数: 53)
|