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

📄 isr.c

📁 a gps program
💻 C
字号:

#include "includes.h"
#include "uart.h"

sbit MPH1 = P1^2;
sbit MPM1 = P1^3;

uchar idata SendBuf[64];
uchar idata SendCoun, SendLen;

uchar data Clock0, Clock1;

void CPUInit(void)
{
    // 定时器1作为串行口的波特率发生器
    // 定时器0分成两个独立的计数器
    TMOD = 0x27;
	//TMOD = 0x21;
    TH0 = 0x00;
    ET1 = 1;            // 使能TH0中断
    TR1 = 1;            // 启动计数器
    TL0 = 0x00;         
    ET0 = 1;
    TR0 = 0;
    TH1 = 0xfd; 
    TL1 = 0xfd;
    //T2CON = 0x00;
    RCLK = 1;
	//TCLK = 1;
    RCAP2H = (65536 - OSC / 32 / BAUD_RXD) / 256;
    RCAP2L = (65536 - OSC / 32 / BAUD_RXD) % 256;
    TR2 = 1;
    //PCON = 0x80;
    SM0 = 0; SM1 = 1;   // 串行通信方式1
    IT0 = 1; IT1 = 1;   // 外部中断下降沿触发
    PX1 = 1;            // 外部中断1高优先级
    EX0 = 1; EX1 = 1;
    ES = 1; REN = 1;
    EA = 1;
}

// 
// 测量周波
//
void ext_int0(void) interrupt 0 using 3
{
    if (!FlagAC) {
        TR0 = !TR0;
        if (TR0 == 0) {
            ACData[ACCoun] = Timer_20;
            Timer_20 = 0;
            ACCoun++;
            if (ACCoun >= 5)
                FlagAC=1;
        }
    }
}

void timer0(void) interrupt 1 using 3
{
    TL0 = 255;
	Timer_20++;
	MS20++;
	if (MS20 >= 0) {
	    SecAC += 1;
		MS20 = 0;
	}
}

void ext_int1(void) interrupt 2 using 2
{ 
}

//
// 定时器1的中断被TH0借用
// 计数周期为主频的1/12
//
void timer1(void) interrupt 3 using 2
{ 
    Clock0++;
    Clock1++;
}

/*串行接收子函数 中断方式*/
void uart0(void) interrupt 4 using 1
{
    uchar temp;
    if (TI == 1) {
        TI = 0;
        SendCoun++;
        if (SendCoun < SendLen)
            SBUF = SendBuf[SendCoun];
    }
    if (RI == 1) {
        temp = SBUF;
        RI = 0;
        if (FlagStart == 0 && FlagStop == 0) {
            switch(GetCoun) {
                case 0:
                    if (temp == '$')    //$GPRMC 数据包的头,用来判断是否
                        GetCoun++;     //是你要收的数据
                    else
                        GetCoun = 0;
                    break;
                case 1:
                    if (temp == 'G')
                        GetCoun++;
                    else
                        GetCoun = 0;
                    break;
                case 2:
                    if (temp == 'P') {
                        FlagType = 0;
                        GetCoun++;
                    }
                    else if (temp == 'G') {
                        FlagType = 1;
                        GetCoun++;
                    }
                    else
                        GetCoun = 0;
                    break;
                case 3:
                    if (FlagType == 0) {
                        if (temp == 'R')
                            GetCoun++;
                        else
                            GetCoun = 0;
                    }
                    else {
                        if (temp == 'G')
                            GetCoun++;
                        else
                            GetCoun = 0;
                    }
                    break;
                case 4:
                    if (FlagType == 0) {
                        if (temp == 'M')
                            GetCoun++;
                        else
                            GetCoun = 0;
                    }
                    else {
                        if (temp == 'A')
                            GetCoun++;
                        else
                            GetCoun = 0;
                    }
                    break;
                case 5:
                    if (FlagType == 0) {
                        if (temp == 'C') {
                            GetCoun++;
                            FlagStart = 1;
                        }
                        else
                            GetCoun = 0;
                    }
                    else {
                        if (temp == 'A') {
                            GetCoun++;
                            FlagStart = 1;
                        }
                        else
                            GetCoun = 0;
                    }
                    break;
                default:
                    break;
            }
        }
        else if (FlagStart == 1 && FlagStop == 0) {
            if (FlagType == 0) {
                if (GetCoun >= 7 && GetCoun <= 12) {  //时间:时分秒
                    Time[GetCoun - 7] = temp;
                    GetCoun++;
                }
                else if (GetCoun == 14) {  //是否同步,‘A’同步,‘V’
                    if (temp == 'A')
                        FlagSYN=1;
                    else
                        FlagSYN=0;
                    GetCoun++;
                }
                else if (GetCoun >= 16 && GetCoun <= 24) { //纬度
                    Latitude[GetCoun - 16] = temp;
                    GetCoun++;
                }
                else if (GetCoun >= 28 && GetCoun <= 37) { //经度
                    Longitude[GetCoun - 28] = temp;
                    GetCoun++;
                }
                else if (GetCoun >= 53 && GetCoun <= 58) { //日期:日月年
                    Date[GetCoun - 53] = temp;
                    GetCoun++;
                }
                else if(GetCoun > 58) {
                    FlagStop = 1;
                    GetCoun = 0;
                }
                else {
                    GetCoun++;
                }
            }
            else {
                if (GetCoun >= 12 && GetCoun <= GetCoun <= 13) {
                    Planet[GetCoun - 12] = temp;
                    GetCoun++;
                }
                else if (GetCoun > 13) {
                    FlagStop = 1;
                    GetCoun = 0;
                }
                else {
                    GetCoun++;
                }
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -