⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shumaguangps.txt

📁 数码管GPS显示
💻 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 + -