源程序.docx
《源程序.docx》由会员分享,可在线阅读,更多相关《源程序.docx(35页珍藏版)》请在冰豆网上搜索。
![源程序.docx](https://file1.bdocx.com/fileroot1/2023-1/10/c934d72d-cb24-4a0d-95fd-4e0b45461eeb/c934d72d-cb24-4a0d-95fd-4e0b45461eeb1.gif)
源程序
#include"Allhead.h"
#include"reg52.h"
//定义变量
#defineuncharunsignedchar
#defineunintunsignedint
//18B20定义
#definejump_ROM0xCC
#definestart0x44
#defineread_EEROM0xBE
//1602数据口
#defineLCM_DataP0
#defineBusy0x80//用于检测LCM状态字中的Busy标识
//NRF24L01定义
#defineTX_ADDR_WITDH5//发送地址宽度设置为5个字节
#defineRX_ADDR_WITDH5//接收地址宽度设置为5个字节
#defineTX_DATA_WITDH31//发送数据宽度1个字节
#defineRX_DATA_WITDH31//接收数据宽度1个字节
#defineR_REGISTER0x00//读取配置寄存器
#defineW_REGISTER0x20//写配置寄存器
#defineR_RX_PAYLOAD0x61//读取RX有效数据
#defineW_TX_PAYLOAD0xa0//写TX有效数据
#defineFLUSH_TX0xe1//清除TXFIFO寄存器
#defineFLUSH_RX0xe2//清除RXFIFO寄存器
#defineREUSE_TX_PL0xe3//重新使用上一包有效数据
#defineNOP0xff//空操作
#defineCONFIG0x00//配置寄存器
#defineEN_AA0x01//使能自动应答
#defineEN_RXADDR0x02//接收通道使能0-5个通道
#defineSETUP_AW0x03//设置数据通道地址宽度3-5
#defineSETUP_RETR0x04//建立自动重发
#defineRF_CH0x05//射频通道设置
#defineRF_SETUP0x06//射频寄存器
#defineSTATUS0x07//状态寄存器
#defineOBSERVE_TX0x08//发送检测寄存器
#defineCD0x09//载波
#defineRX_ADDR_P00x0a//数据通道0接收地址
#defineRX_ADDR_P10x0b//数据通道1接收地址
#defineRX_ADDR_P20x0c//数据通道2接收地址
#defineRX_ADDR_P30x0d//数据通道3接收地址
#defineRX_ADDR_P40x0e//数据通道4接收地址
#defineRX_ADDR_P50x0f//数据通道5接收地址
#defineTX_ADDR0x10//发送地址
#defineRX_PW_P00x11//P0通道数据宽度设置
#defineRX_PW_P10x12//P1通道数据宽度设置
#defineRX_PW_P20x13//P2通道数据宽度设置
#defineRX_PW_P30x14//P3通道数据宽度设置
#defineRX_PW_P40x15//P4通道数据宽度设置
#defineRX_PW_P50x16//P5通道数据宽度设置
#defineFIFO_STATUS0x17//FIFO状态寄存器
//L298定义
#defineqians1=0,s2=1,s3=0,s4=1;
#definestops1=0,s2=0,s3=0,s4=0;
#definezuos1=0,s2=1,s3=1,s4=0;
#defineyous1=1,s2=0,s3=0,s4=1;
sbiten1=P1^4;/*L298的EnableA*/
sbits1=P3^7;/*L298的Input1*/
sbits2=P1^5;/*L298的Input2*/
sbiten2=P1^1;/*L298的EnableB*/
sbits3=P2^6;/*L298的Input1*/
sbits4=P2^7;/*L298的Input2*/
//DS18B20数据口
sbitDQ=P1^7;
//蜂鸣器器控制脚
sbitSpeak=P1^6;
//1602管脚
sbitLCM_RW=P2^3;//1602定义引脚
sbitLCM_RS=P2^5;
sbitLCM_E=P2^1;
//NRF24L01管脚A
sbitCE=P1^7;//RX/TX模式选择端
sbitIRQ=P1^0;//可屏蔽中断端
sbitCSN=P1^2;//SPI片选端//就是SS
sbitMOSI=P1^1;//SPI主机输出从机输入端
sbitMISO=P1^5;//SPI主机输出从机输出端
sbitSCLK=P1^6;//SPI时钟端
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
//NRF24L01管脚B
sbitCE=P2^4;//RX/TX模式选择端
sbitIRQ=P1^2;//可屏蔽中断端
sbitCSN=P1^0;//SPI片选端//就是SS
sbitMOSI=P1^3;//SPI主机输出从机输入端
sbitMISO=P2^0;//SPI主机输出从机输出端
sbitSCLK=P2^2;//SPI时钟端
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
//求救开关按键
sbitKEY=P3^2;
//GPS变量
charcodeTIME_AREA=8;
uncharJD[10];
uncharWD[9];
unsignedcharJD_a;//经度方向
unsignedcharWD_a;//纬度方向
unsignedcharseg_count;//逗号计数器
unsignedchardot_count;//小数点计数器
unsignedcharbyte_count;//位数计数器
unsignedcharcmd_number;//命令类型
unsignedcharmode;//0:
结束模式,1:
命令模式,2:
数据模式
unsignedcharbuf_full;//1:
整句接收完成,相应数据有效。
0:
缓存数据无效。
unsignedcharcmd[5];//命令类型存储数组
unsignedintdsp_count;//刷新次数计数器
unsignedchartime_count;
charBhour;
bitpage;
bitspd_type;
//NRF24L01变量
unsignedcharRevTempDate[32];//最后一位用来存放结束标志
unsignedcharcodeRxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址
unsignedcharcodeTxAddr[]={0x44,0x43,0x10,0x10,0x01};//发送地址1发送给第三个24L01
unsignedcharbdatasta;//状态标志
//18B20变量
unsignedcharTMPH,TMPL;
externunsignedcharALL[32];//把经纬度和温度放在数组
//L298变量
intX=0,Y=0;
inth=15;
unsignedintlc=0;
unsignedintwendu2;
//串口变量
unchar*p;
uncharRevFlags[6];
//L298声明函数
voidYZ(unsignedintdel);
voidXZ(unsignedintdel);
voidSzhuan();
voidinitime();
voidNzhuan();
//中断声明函数
voidOutside_Init(void);
//nrf24l01声明函数
unsignedcharNRFACK();
unsignedcharNRFSPI(unsignedchardate);
unsignedcharNRFReadReg(unsignedcharRegAddr);
unsignedcharNRFWriteReg(unsignedcharRegAddr,unsignedchardate);
unsignedcharNRFReadRxDate(unsignedcharRegAddr,unsignedchar*RxDate,unsignedcharDateLen);
unsignedcharNRFWriteTxDate(unsignedcharRegAddr,unsignedchar*TxDate,unsignedcharDateLen);
voidNRFSetTxMode(unsignedchar*TxDate);
voidNRF24L01Int();
voidNRFSetRXMode();
voidCheckACK();
unsignedcharCheckACKTOK();
externvoidGetDate();
externunsignedcharbdatasta;
externunsignedcharRevTempDate[32];
//GPS声明函数
voidsys_init(void);
bitchk_key(void);
voidGETGPS();
//延时声明函数
voidDelay400Ms(void);
voidDelay5Ms(void);
voiddelay(unsignedintN);
voidDelay_1ms(unsignedinti);
voidCDelay(unsignedintdel);
voidNRFDelay(unsignedintt);
//1602声明函数
voidWriteDataLCM(unsignedcharWDLCM);
voidWriteCommandLCM(unsignedcharWCLCM,BuysC);
unsignedcharReadStatusLCM(void);
voidLCMInit(void);
voidLCD_cls(void);
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);
voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedchar*DData);
//18B20声明函数
unsignedcharread_bit(void);
voidwrite_bit(unsignedcharbitval);
unsignedcharread_byte(void);
voidwrite_byte(unsignedcharval);
voidvoice(void);
unsignedintReadTemperature();
//串口声明函数
voidSendByte(unsignedchardat);
voidSendStr(unsignedchar*s);
voidMAX232SendDate();
voidCom_Init(void);
externuncharRevFlags[6];
//延时函数代码
voidDelay5Ms(void)
{
unsignedintTempCyc=5552;//GPS延时
while(TempCyc--);
}
voidDelay400Ms(void)
{
unsignedcharTempCycA=5;
unsignedintTempCycB;//GPS延时
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
voiddelay(unsignedintN)
{
inti;
for(i=0;i;
}
voidDelay_1ms(unsignedinti)//1ms延时
{
unsignedcharx,j;
for(j=0;j
for(x=0;x<=148;x++);
}
voidCDelay(unsignedintdel)//小车行走延时
{
unsignedinti,j;
for(i=0;ifor(j=0;j<1827;j++)
;
}
voidNRFDelay(unsignedintt)//NRF延时
{
unsignedintx,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
//18B20代码
unsignedcharReset(void)
{
unsignedchardeceive_ready;
DQ=0;
delay(29);
DQ=1;
delay(3);
deceive_ready=DQ;
delay(25);
return(deceive_ready);
}
unsignedcharread_bit(void)
{
unsignedchari;
DQ=0;
DQ=1;
for(i=0;i<3;i++);
return(DQ);
}
voidwrite_bit(unsignedcharbitval)
{
DQ=0;
if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
unsignedcharread_byte(void)
{
unsignedchari,m,receive_data;
m=1;
receive_data=0;
for(i=0;i<8;i++)
{
if(read_bit())
{
receive_data=receive_data+(m<
}
delay(6);
}
return(receive_data);
}
voidwrite_byte(unsignedcharval)
{
unsignedchari,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
delay(5);
}
}
unsignedintReadTemperature()
{
unsignedinttemp;
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL=read_byte();
TMPH=read_byte();
ALL[22]='T';
ALL[23]=TMPH;
ALL[24]=TMPL;
temp=TMPL/16+TMPH*16;
return(temp);
}
//报警代码
voidvoice(void)
{
intul;
intn;
for(ul=0;ul<3000;ul++)
{
for(n=0;n<40;n++);
Speak=~Speak;
}
for(ul=0;ul<2500;ul++)
{
for(n=0;n<50;n++);
Speak=~Speak;
}
}
//1602源程序代码
voidWriteDataLCM(unsignedcharWDLCM)
{
ReadStatusLCM();//检测忙
LCM_Data=WDLCM;
LCM_RS=1;
LCM_RW=0;
LCM_E=0;//若晶振速度太高可以在这后加小的延时
LCM_E=0;//延时
LCM_E=1;
}
voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测
{
if(BuysC)
ReadStatusLCM();//根据需要检测忙
LCM_Data=WCLCM;
LCM_RS=0;
LCM_RW=0;
LCM_E=0;
LCM_E=0;
LCM_E=1;
}
unsignedcharReadStatusLCM(void)
{
LCM_Data=0xFF;
LCM_RS=0;
LCM_RW=1;
LCM_E=0;
LCM_E=0;
LCM_E=1;
while(LCM_Data&Busy);//检测忙信号
return(LCM_Data);
}
voidLCMInit(void)
{
Delay400Ms();
LCM_Data=0;
WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1);//关闭显示
WriteCommandLCM(0x01,1);//显示清屏
WriteCommandLCM(0x06,1);//显示光标移动设置
WriteCommandLCM(0x0C,1);//显示开及光标设置
}
voidLCD_cls(void)
{
WriteCommandLCM(0x01,0);
Delay5Ms();
}
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)
{
//Y&=0x1;
X&=0xF;//限制X不能大于15,Y不能大于1
switch(Y)
{
case0:
X+=0x00;//当要显示第二行时地址码+0x40;
X+=0x80;//算出指令码
WriteCommandLCM(X,0);//这里不检测忙信号,发送地址码
WriteDataLCM(DData);
case1:
X+=0x40;//当要显示第二行时地址码+0x40;
X+=0x80;//算出指令码
WriteCommandLCM(X,0);//这里不检测忙信号,发送地址码
WriteDataLCM(DData);
break;
case2:
X+=0x10;//当要显示第二行时地址码+0x40;
X+=0x80;//算出指令码
WriteCommandLCM(X,0);//这里不检测忙信号,发送地址码
WriteDataLCM(DData);
break;
case3:
X+=0x50;//当要显示第二行时地址码+0x40;
X+=0x80;//算出指令码
WriteCommandLCM(X,0);//这里不检测忙信号,发送地址码
WriteDataLCM(DData);
break;
default:
break;
}
}
voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedchar*DData)
{
unsignedcharListLength,j;
ListLength=strlen(DData);
//Y&=0x1;
X&=0xF;//限制X不能大于15,Y不能大于1
if(X<=0xF)//X坐标应小于0xF
{
for(j=0;j{
DisplayOneChar(X,Y,DData[j]);//显示单个字符
X++;
}
}
}
//GPS源程序代码
voidGETGPS()
{
unsignedchari;
unsignedcharj;
j=500;
sys_init();
while(j)
{
wendu=ReadTemperature();
DisplayListChar(12,1,"T");
DisplayListChar(13,1,":
");
DisplayOneChar(14,1,wendu/10%10+0x30);
DisplayOneChar(15,1,wendu%10+0x30);
if(buf_full==0)//无GPS信号时
{
dsp_count++;
if(dsp_count>=65000)
{
LCD_cls();//清屏
DisplayListChar(0,0,"noconnect..");
while(buf_full==0);
LCD_cls();
dsp_count=0;
}
}
elseif(lock=='V')//GPRMC语句
{//如果未定位
DisplayListChar(0,2,"NoPositioning");
LCD_cls();
}
else
{
DisplayListChar(0,2,"intif3..");
DisplayOneChar(0,0,'E');//