借用了原子哥的程序,自己修改后又加入了北斗模塊,通過北斗讀取實時的時間顯示到液晶上。
單片機源程序如下:
- #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)
2019-1-20 14:10 上傳
點擊文件名下載附件
程序源碼 下載積分: 黑幣 -5
|