📄 isr.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 + -