源程序.docx

上传人:b****6 文档编号:7060770 上传时间:2023-01-16 格式:DOCX 页数:35 大小:23.04KB
下载 相关 举报
源程序.docx_第1页
第1页 / 共35页
源程序.docx_第2页
第2页 / 共35页
源程序.docx_第3页
第3页 / 共35页
源程序.docx_第4页
第4页 / 共35页
源程序.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

源程序.docx

《源程序.docx》由会员分享,可在线阅读,更多相关《源程序.docx(35页珍藏版)》请在冰豆网上搜索。

源程序.docx

源程序

#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;i

for(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');//

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1