📄 shumaguangps.txt
字号:
/*************************************
数码显示GPS时钟
*************************************/
//包含头文件
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#define DSP_PORT PORTA
#define DSP_DDR DDRA
#define SEG_PORT PORTC
#define SEG_DDR DDRC
#define TIME_AREA 8
#define t0_tcnt 0xf7 //t0定时1ms
//串口中断需要的变量
unsigned char seg_count; //逗号计数器
unsigned char byte_count; //位数计数器
unsigned char cmd_number; //命令类型
unsigned char mode; //0:结束模式,1:命令模式,2:数据模式
volatile unsigned char buf_full; //1:整句接收完成,相应数据有效。0:缓存数据无效。
unsigned char cmd[5]; //命令类型存储数组
prog_uchar D_TAB[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x00}; //码表
volatile unsigned char seg=0;
volatile unsigned char dsp_buf[8];
volatile unsigned char time[6];
volatile unsigned char use_sat[2];
volatile unsigned char Buse_sat;
void sys_init(void);
int main(void)
{
unsigned char hour;
sys_init(); //系统初始
dsp_buf[2]=10;
dsp_buf[5]=10;
while(1)
{
if(buf_full&0x01)
{
Buse_sat=(use_sat[0]-0x30)*10+use_sat[1]-0x30;
buf_full&=~0x01;
}
if(buf_full&0x08)
{
dsp_buf[0]=1;
hour=(time[0]-0x30)*10+time[1]-0x30+8;
if(hour>=24) hour-=24;
dsp_buf[0]=hour/10;
dsp_buf[1]=hour%10;
dsp_buf[3]=time[2]-0x30;
dsp_buf[4]=time[3]-0x30;
dsp_buf[6]=time[4]-0x30;
dsp_buf[7]=time[5]-0x30;
buf_full&=~0x08;
}
}
}
SIGNAL (SIG_OVERFLOW0)
{
SEG_PORT=0xff;
DSP_PORT=pgm_read_byte(&D_TAB[dsp_buf[seg]]);
if(Buse_sat<=8)
{
if(seg>=(8-Buse_sat)) DSP_PORT&=0x7f;
}
else
{
if(seg==0) DSP_PORT&=0x7f;
if(seg>=(16-Buse_sat)) DSP_PORT&=0x7f;
}
SEG_PORT=~_BV(seg);
seg++;
if(seg>=8)
{
seg=0;
}
TCNT0=t0_tcnt;//定时10ms
}
//串口接收中断
SIGNAL(SIG_UART_RECV) //串口接收中断服务程序
{
unsigned char tmp;
tmp=UDR;
switch(tmp){
case '$':
cmd_number=0; //命令类型清空
mode=1; //接收命令模式
byte_count=0; //接收位数清空
break;
case ',':
seg_count++; //逗号计数加1
byte_count=0;
break;
case '*':
switch(cmd_number){
case 1:
buf_full|=0x01;
break;
case 4:
buf_full|=0x08;
break;
}
mode=0;
break;
default:
if(mode==1){
//命令种类判断
cmd[byte_count]=tmp; //接收字符放入类型缓存
if(byte_count>=4){ //如果类型数据接收完毕,判断类型
if(cmd[0]=='G'){
if(cmd[1]=='P'){
if(cmd[2]=='Z'){
if(cmd[3]=='D'){
if(cmd[4]=='A'){
cmd_number=4;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
else if(cmd[2]=='G'){
if(cmd[3]=='G'){
if(cmd[4]=='A'){
cmd_number=1;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
}
}
}
}
else if(mode==2){
//接收数据处理
switch (cmd_number){
case 1: //类型1数据接收。GPGGA
switch(seg_count){
case 7: //定位使用的卫星数
if(byte_count<2){
use_sat[byte_count]=tmp;
}
break;
}
break;
case 4: //类型4数据接收。GPZDA
switch(seg_count){
case 1:
if(byte_count<6){ //时间处理
time[byte_count]=tmp;
}
break;
}
break;
}
}
byte_count++; //接收数位加1
break;
}
}
//系统初始化
void sys_init(void)
{
//端口初始化
DSP_DDR=0xff;
DSP_PORT=0xff;
SEG_DDR=0xff;
SEG_PORT=0xff;
//定时器timer0初始化
TCNT0=t0_tcnt;//定时1ms
TCCR0=(1<<CS02)|(1<<CS00);//1024分频,7372800/1024=7200
TIMSK|=1<<TOIE0;//允许t0溢出中断
//串口初始化
UCSRC = (1<<URSEL) | 0x06; //异步,8位数据,无奇偶校验,一个停止位,无倍速
UBRRL= (F_CPU/9600/16-1)%256; //UBRR= (F_CPU/(BAUDRATE*16))-1;
UBRRH= (F_CPU/9600/16-1)/256;
UCSRA = 0x00; //使能接收中断,使能接收
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
sei();
}
/*
$GPZDA,024519.45,28,01,2007,,*62
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -