求大神帮忙绘制程序框图
时间:10-02
整理:3721RD
点击:
主机程序
/******************************************************************************************\
============================================================================================
* T905.c
*
* This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTYT;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*
* NOTES:
* This program is for the nRF905 with 232 interface;
* $write date: 2004.4.7 ;time 11:00$
* $Revision: 1 $
*
/*******************************************************************************************/
#include <at89x52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24 // Read RX Payload command
/*******************************************************************************************/
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
10,
0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;433MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
uchar data TxBuf[32]; //发送缓冲区
uchar data RxBuf[32]; //接收缓冲区
uchar key,rsbrf,delayf,tf;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
/***********************硬件管脚连接定义********************************************************************/
sbit TX_EN =P1^0;
sbit TRX_CE =P3^1;
sbit PWR_UP =P1^1;
sbit MISO =P1^7;
sbit MOSI =P1^4;
sbit SCK =P1^6;
sbit CSN =P1^5;
sbit AM =P3^0;
sbit DR =P1^3;
sbit CD =P1^2;
sbit LED1 =P0^0;
sbit LED2 =P0^1;
sbit menu =P3^2; //菜单
sbit add =P3^3; //+
sbit dec =P3^4; //-
sbit test =P3^5; //当前轮号
sbit speak =P2^1; //蜂鸣器
/***************************参数保存*****************************/
//--------------------定义操作命令-----------
#define RdCommand 0x01 //定义ISP操作
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define OK 0
#define WaitTime 0x01 //定义CPU等待时间
sfr ISP_DATA=0xe2; //寄存器声明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_Order=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
void InitTime();
//---------------打开ISP,IAP功能---------
void ISP_IAP_enable(void)
{
EA=0;
ISP_CONTR=ISP_CONTR&0x18; //ISP_COUNT的B4,B3位
ISP_CONTR=ISP_CONTR|WaitTime;
ISP_CONTR=ISP_CONTR|0x80; //ISPEN=1
}
//-------------关闭ISP,IAP功能-----------
void ISP_IAP_disable(void)
{
ISP_CONTR=ISP_CONTR&0x7f; //ISPEN=0
ISP_TRIG=0x00;
EA=1; //开中断
}
//--------------公共触发代码---------
void ISPgoon(void)
{
ISP_IAP_enable(); //打开ISP,IAP功能
ISP_TRIG=0x46; //触发ISP_IAP命令字节1
ISP_TRIG=0xb9; //触发ISP_IAP命令字节2
_nop_();
}
//------------字节读--------------
unsigned char byte_read(uint byte_addr)
{
ISP_ADDRH=(uchar)(byte_addr>>8); //地址赋值
ISP_ADDRL=(uchar)(byte_addr&0x00ff);
ISP_Order=ISP_Order&0xf8; //清除低三位
ISP_Order=ISP_Order|RdCommand; //写入命令
ISPgoon(); //触发执行
ISP_IAP_disable(); //关闭ISP,IAP功能
return(ISP_DATA); //返回读到的数据
}
//-------------EEPROM操作-------------
/*************扇区擦除****************/
void SectorErase(uint sector_addr)
{
uint iSectorAddr;
iSectorAddr=(sector_addr&0xfe00); //取扇区地址
ISP_ADDRH=(uchar)(iSectorAddr>>8);
ISP_ADDRL=0x00;
ISP_Order=ISP_Order&0xf8; //清空低3位
ISP_Order=ISP_Order|EraseCommand; //擦除命令3
ISPgoon(); //触发执行
ISP_IAP_disable(); //关闭ISP,IAP功能
}
/*************写字节****************/
void byte_write(uint byte_addr,uchar original_data)
{
ISP_ADDRH=(uchar)(byte_addr>>8); //取地址
ISP_ADDRL=(uchar)(byte_addr&0x00ff);
ISP_Order=ISP_Order&0xf8;
ISP_Order=ISP_Order|PrgCommand; //写命令2
ISP_DATA =original_data; //写入数据准备
ISPgoon(); //触发执行
ISP_IAP_disable(); //关闭IAP功能
}
/*******************************************************************************************/
ulong press,temp; //压力 温度 变量定义
uint H_T=40,H_P=105,L_T=10,L_P=90; //温度40-10 压力105-90
sbit d1=P2^7;
sbit d2=P2^6;
sbit d3=P2^5;
sbit d4=P2^4;
sbit d5=P2^3;
sbit d6=P2^2;
sbit point=P0^2;
uchar s1num=0;
/*******************************************************************************************/
uchar code tab[]={0x14,0x77,0x4C,0x45,0x27,0x85,0x84,0x57,
0x04,0x05,0x06,0xA4,0x9C,0x64,0x8C,0x8E}; //共阳数码管不带小数点的0~9编码
/*******************************************************************************************/
void InitIO(void); // Initialize IO port
void Inituart(void); // initialize 232 uart
void Config905(void); // Config nRF905 module配置NRF905模式
void SetTxMode(void); // Set nRF905 in Tx mode
void SetRxMode(void); // Set nRF905 in Rx mode
void TxPacket(void); // Send data by nRF905
void RxPacket(void); // Recive data by nRF905
void SpiWrite(uchar); // Write data to nRF905
uchar SpiRead(void); // Read data to nRF905
void Delay(uchar n); // Delay 100us
void Scankey(void); // Scan key
void TxData (uchar x); // Send key_value to CRT display
void comdebug(void);
/************************延时函数*******************************************************************/
void Delay(uchar n)
{
uint i;
while(n--)
for(i=0;i<80;i++);
}
//************************数码管显示函数*********************************
display()
{uchar times;
if(test==1&&s1num==0) //正常进入无任何操作时显示温度和气压
{
for(times=20;times>0;times--)
{
P0=tab[temp/100%10];d1=0;Delay(1);d1=1;
P0=tab[temp/10%10];point=0;d2=0;Delay(1);d2=1;
P0=tab[temp%10];d3=0;Delay(1);d3=1;
P0=tab[press/100%10];d4=0;Delay(1);d4=1;
P0=tab[press/10%10];d5=0;Delay(1);d5=1;
P0=tab[press%10];d6=0;Delay(1);d6=1;
}
}
else if(test==1&&s1num==1) //菜单键按下一次时显示温度上限
{
for(times=20;times>0;times--)
{
P0=0xac;d1=0;Delay(1);d1=1;
P0=tab[H_T/100%10];d3=0;Delay(1);d3=1;
P0=tab[H_T/10%10];point=0;d4=0;Delay(1);d4=1;
P0=tab[H_T%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==2) //菜单键按下两次时显示压力上限
{
for(times=20;times>0;times--)
{
P0=0x0e;d1=0;Delay(1);d1=1;
P0=tab[H_P/100%10];d3=0;Delay(1);d3=1;
P0=tab[H_P/10%10];d4=0;Delay(1);d4=1;
P0=tab[H_P%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==3) //菜单键按下三次时显示温度下限
{
for(times=20;times>0;times--)
{
P0=0xac;point=0;d1=0;Delay(1);d1=1;
P0=tab[L_T/100%10];d3=0;Delay(1);d3=1;
P0=tab[L_T/10%10];d4=0;Delay(1);d4=1;
P0=tab[L_T%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==4) //菜单键按下四次时显示气压下限
{
for(times=20;times>0;times--)
{
P0=0x0e;point=0;d1=0;Delay(1);d1=1;
P0=tab[L_P/100%10];d3=0;Delay(1);d3=1;
P0=tab[L_P/10%10];d4=0;Delay(1);d4=1;
P0=tab[L_P%10];d5=0;Delay(1);d5=1;
}
}
else if(test==0&&s1num==0) //按下轮胎号键显示接收缓冲区的轮号
{
for(times=20;times>0;times--)
{
P0=tab[RxBuf[10]/100%10];d2=0;Delay(1);d2=1;
P0=tab[RxBuf[10]/10%10];d3=0;Delay(1);d3=1;
P0=tab[RxBuf[10]%10];d4=0;Delay(1);d4=1;
}
}
}
/*************************************************************************************/
/*********键盘程序************************/
void keyscan(void)
{
if(menu==0)
{
Delay(10);
if(menu==0) //menu键按下一次s1num变量+1
{
while(!menu);
s1num++;
while(1)
{ if(menu==0)
{ Delay(10);
if(menu==0)
{
while(!menu);
s1num++;
}
}
if(s1num==1) //当s1num==1时
{
if(add==0) //add按下温度上线+10如果上限大于850上限等于850
{
Delay(10);
if(add==0)
{ while(!add);
if(H_T>=850)
H_T=850;
else
H_T+=10;
}
display();
}
if(dec==0) // dec按下温度上线-10如果上限小于100上限等于100
{
Delay(10);
if(dec==0)
{ while(!dec);
if(H_T<=100)
H_T=100;
else
H_T-=10;
}
display();
}
}
if(s1num==2) //当s1num==2时
{
if(add==0) //add按下气压上线+1如果上限大于110上限等于110
{
Delay(10);
if(add==0)
{ while(!add);
if(H_P>=110)
H_P=110;
else
H_P+=1;
}
display();
}
if(dec==0) //dec按下气压上线-1如果上限小于20上限等于20
{
Delay(10);
if(dec==0)
{ while(!dec);
if(H_P<=20)
H_P=20;
else
H_P-=1;
}
display();
}
}
if(s1num==3) //当s1num==3时
{
if(add==0) //add按下温度下线+10如果下限大于850下限等于850
{
Delay(10);
if(add==0)
{ while(!add);
if(L_T>=850)
L_T=850;
else
L_T+=10;
}
display();
}
if(dec==0) // dec按下温度下线-10如果下限小于20下限等于20
{
Delay(10);
if(dec==0)
{ while(!dec);
if(L_T<=20)
L_T=20;
else
L_T-=10;
}
display();
}
}
if(s1num==4) //当s1num==4时
{
if(add==0) //add按下气压下线+1如果下限大于110下限等于110
{
Delay(10);
if(add==0)
{ while(!add);
if(L_P>=110)
L_P=110;
else
L_P+=1;
}
display();
}
if(dec==0) // dec按下气压下线-1如果下限小于20下限等于20
{
Delay(10);
if(dec==0)
{ while(!dec);
if(L_P<=20)
L_P=20;
else
L_P-=1;
}
display();
}
}
if(s1num==5) //当s1num==5时 开始运行
{ s1num=0;//s1num清零//
SectorErase(0x2000);
SectorErase(0x2200);
byte_write(0x2000,H_T/256); //存储写入临时数据 温度上限
byte_write(0x2200,H_T%256); //写入临时数据
SectorErase(0x2400);
SectorErase(0x2600);
byte_write(0x2400,H_P/256); //写入临时数据 气压上限
byte_write(0x2600,H_P%256); //写入临时数据
SectorErase(0x2800);
SectorErase(0x2a00);
byte_write(0x2800,L_T/256); //写入临时数据 温度下限
byte_write(0x2a00,L_T%256); //写入临时数据
SectorErase(0x2c00);
SectorErase(0x3000);
byte_write(0x2c00,L_P/256); //写入临时数据 气压下限
byte_write(0x3000,L_P%256); //写入临时数据
break;
}
display();
}
}
}
}
/*************************************************************************************/
void main()
{
unsigned int cyc=0;
unsigned int distan=0;
//================NRF905初始化
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
DR=1; // Init DR for input
AM=1; // Init AM for input
PWR_UP=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TX_EN=0; // set radio in Rx mode
//================
Config905(); // Config nRF905 module
TxBuf[0] = 1;
TxBuf[1] = 1;
SetTxMode(); // Set Tx Mode
TxPacket(); // Transmit Tx buffer data
LED1 = 0;
LED2 = 0;
Delay(500); // delay for led light
LED1 = 1;
LED2 = 1;
TxBuf[0] = 0xff;
TxBuf[1] = 0xff;
// led close
SetRxMode(); // Set nRF905 in Rx mode
d1=0;
H_T=byte_read(0x2000)*256+byte_read(0x2200); //开机读取掉电前的温度上限如果>1000=1000
if(H_T>1000)
H_T=1000;
H_P=byte_read(0x2400)*256+byte_read(0x2600); //开机读取掉电前的气压上限如果>110=110
if(H_P>110)
H_P=110;
while(1)
{
//=====================从键盘获得数据
temp =RxBuf[2]+RxBuf[3]*256+RxBuf[4]*256*256+RxBuf[5]*256*256*256; //温度数据
press=RxBuf[6]+RxBuf[7]*256+RxBuf[8]*256*256+RxBuf[9]*256*256*256; //气压数据
if(temp>H_T||press>H_P||temp<L_T||press<L_P)//温度>上限或<下限报警气压>上限或<下限报警
speak=0;
else
speak=1;
display();
keyscan();
// if(KEY2 ==0 ) { LED2 = 0; TxBuf[1] = 1 ;tf = 1 ; }
if (tf==1)
{
//===============NRF905发送相应的按键
SetTxMode(); // Set Tx Mode
TxPacket(); // Transmit Tx buffer data
TxBuf[0] = 0xff;
TxBuf[1] = 0xff;
SetRxMode(); // Set nRF905 in Rx mode
tf=0;
Delay(500);
LED1 = 1;
LED2 = 1;
}
//=====================等待NRF905接收
if (DR) // If recive data ready...
RxPacket(); // ... recive data
}
}
/*******************************************************************************************/
/*******************************************************************************************/
//function Config905();
/*******************************************************************************************/
void Config905(void)
{
uchar i;
CSN=0; // Spi enable for write a spi command
SpiWrite(WC); // Write config command写放配置命令
for (i=0;i<RxTxConf.n;i++) // Write configration words 写放配置字
{
SpiWrite(RxTxConf.buf[i]);
}
CSN=1; // Disable Spi
}
/*******************************************************************************************/
//function SpiWrite();
/*******************************************************************************************/
void SpiWrite(uchar byte)
{
uchar i;
DATA_BUF=byte; // Put function's parameter into a bdata variable
for (i=0;i<8;i++) // Setup byte circulation bits
{
if (flag) // Put DATA_BUF.7 on data line
MOSI=1;
else
MOSI=0;
SCK=1; // Set clock line high
DATA_BUF=DATA_BUF<<1; // Shift DATA_BUF
SCK=0; // Set clock line low
}
}
/*******************************************************************************************/
//function SpiRead();
/*******************************************************************************************/
uchar SpiRead(void)
{
uchar i;
for (i=0;i<8;i++) // Setup byte circulation bits
{
DATA_BUF=DATA_BUF<<1; // Right shift DATA_BUF
SCK=1; // Set clock line high
if (MISO)
flag1=1; // Read data
else
flag1=0;
SCK=0; // Set clock line low
}
return DATA_BUF; // Return function parameter
}
/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
uchar i;
//Config905();
CSN=0; // Spi enable for write a spi command
SpiWrite(WTP); // Write payload command
for (i=0;i<32;i++)
{
SpiWrite(TxBuf[i]); // Write 32 bytes Tx data
}
CSN=1; // Spi disable
Delay(1);
CSN=0; // Spi enable for write a spi command
SpiWrite(WTA); // Write address command
for (i=0;i<4;i++) // Write 4 bytes address
{
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1; // Spi disable
TRX_CE=1; // Set TRX_CE high,start Tx data transmission
Delay(1); // while (DR!=1);
TRX_CE=0; // Set TRX_CE low
}
/*******************************************************************************************/
//function RxPacket();
/*******************************************************************************************/
void RxPacket(void)
{
uchar i;
TRX_CE=0; // Set nRF905 in standby mode
CSN=0; // Spi enable for write a spi command
SpiWrite(RRP); // Read payload command
for (i=0;i<32;i++)
{
RxBuf[i]=SpiRead(); // Read data and save to buffer
}
CSN=1; // Disable spi
while(DR||AM);
// P0= RxBuf[0]; // Buffer[0] output from P0 port...
TRX_CE=1;
//xx=(RxBuf[0]>>4)&0x0f;
//TxData(xx);
//=====================
LED1 = 0 ;
Delay(500); // ...light led
// P0=0xff; // Close led
LED1 = 1 ;
LED2 = 1 ;
}
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void)
{
TX_EN=1;
TRX_CE=0;
Delay(1); // delay for mode change(>=650us)
}
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void)
{
TX_EN=0;
TRX_CE=1;
Delay(1); // delay for mode change(>=650us)
}
发送机程序
* BMP085模块
*
* 用途:BMP085模块IIC测试程序
*
* 作者 日期 备注
* Huafeng Lin 2010/12/10 新增
* Huafeng Lin 2010/12/11 修改
*
*/
#include <REG51.H>
#include <math.h> //Keil library
#include <stdlib.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H> //Keil library
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^1; //IIC时钟引脚定义
sbit SDA=P2^0; //IIC数据引脚定义
sbit d1=P2^7;
sbit d2=P2^6;
sbit d3=P2^5;
sbit d4=P2^4;
sbit d5=P2^3;
sbit d6=P2^2;
sbit point=P0^2;
long temperature;
long pressure;
/***************************************905**********************************************/
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24 // Read RX Payload command
/*******************************************************************************************/
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
10,
0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;433MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
uchar xdata TxBuf[32];
uchar xdata RxBuf[32];
uchar key,rsbrf,delayf,tf;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
/*******************************************************************************************/
sbit TX_EN =P1^0;
sbit TRX_CE =P3^1;
sbit PWR_UP =P1^1;
sbit MISO =P1^7;
sbit MOSI =P1^4;
sbit SCK =P1^6;
sbit CSN =P1^5;
sbit AM =P3^0;
sbit DR =P1^3;
sbit CD =P1^2;
/*******************************************************************************************/
void InitIO(void); // Initialize IO port
void Inituart(void); // initialize 232 uart
void Config905(void); // Config nRF905 module配置NRF905模式
void SetTxMode(void); // Set nRF905 in Tx mode
void SetRxMode(void); // Set nRF905 in Rx mode
void TxPacket(void); // Send data by nRF905
void RxPacket(void); // Recive data by nRF905
void SpiWrite(uchar); // Write data to nRF905
uchar SpiRead(void); // Read data to nRF905
void Delay(uchar n); // Delay 100us
void Scankey(void); // Scan key
void TxData (uchar x);  
/******************************************************************************************\
============================================================================================
* T905.c
*
* This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTYT;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*
* NOTES:
* This program is for the nRF905 with 232 interface;
* $write date: 2004.4.7 ;time 11:00$
* $Revision: 1 $
*
/*******************************************************************************************/
#include <at89x52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24 // Read RX Payload command
/*******************************************************************************************/
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
10,
0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;433MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
uchar data TxBuf[32]; //发送缓冲区
uchar data RxBuf[32]; //接收缓冲区
uchar key,rsbrf,delayf,tf;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
/***********************硬件管脚连接定义********************************************************************/
sbit TX_EN =P1^0;
sbit TRX_CE =P3^1;
sbit PWR_UP =P1^1;
sbit MISO =P1^7;
sbit MOSI =P1^4;
sbit SCK =P1^6;
sbit CSN =P1^5;
sbit AM =P3^0;
sbit DR =P1^3;
sbit CD =P1^2;
sbit LED1 =P0^0;
sbit LED2 =P0^1;
sbit menu =P3^2; //菜单
sbit add =P3^3; //+
sbit dec =P3^4; //-
sbit test =P3^5; //当前轮号
sbit speak =P2^1; //蜂鸣器
/***************************参数保存*****************************/
//--------------------定义操作命令-----------
#define RdCommand 0x01 //定义ISP操作
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define OK 0
#define WaitTime 0x01 //定义CPU等待时间
sfr ISP_DATA=0xe2; //寄存器声明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_Order=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
void InitTime();
//---------------打开ISP,IAP功能---------
void ISP_IAP_enable(void)
{
EA=0;
ISP_CONTR=ISP_CONTR&0x18; //ISP_COUNT的B4,B3位
ISP_CONTR=ISP_CONTR|WaitTime;
ISP_CONTR=ISP_CONTR|0x80; //ISPEN=1
}
//-------------关闭ISP,IAP功能-----------
void ISP_IAP_disable(void)
{
ISP_CONTR=ISP_CONTR&0x7f; //ISPEN=0
ISP_TRIG=0x00;
EA=1; //开中断
}
//--------------公共触发代码---------
void ISPgoon(void)
{
ISP_IAP_enable(); //打开ISP,IAP功能
ISP_TRIG=0x46; //触发ISP_IAP命令字节1
ISP_TRIG=0xb9; //触发ISP_IAP命令字节2
_nop_();
}
//------------字节读--------------
unsigned char byte_read(uint byte_addr)
{
ISP_ADDRH=(uchar)(byte_addr>>8); //地址赋值
ISP_ADDRL=(uchar)(byte_addr&0x00ff);
ISP_Order=ISP_Order&0xf8; //清除低三位
ISP_Order=ISP_Order|RdCommand; //写入命令
ISPgoon(); //触发执行
ISP_IAP_disable(); //关闭ISP,IAP功能
return(ISP_DATA); //返回读到的数据
}
//-------------EEPROM操作-------------
/*************扇区擦除****************/
void SectorErase(uint sector_addr)
{
uint iSectorAddr;
iSectorAddr=(sector_addr&0xfe00); //取扇区地址
ISP_ADDRH=(uchar)(iSectorAddr>>8);
ISP_ADDRL=0x00;
ISP_Order=ISP_Order&0xf8; //清空低3位
ISP_Order=ISP_Order|EraseCommand; //擦除命令3
ISPgoon(); //触发执行
ISP_IAP_disable(); //关闭ISP,IAP功能
}
/*************写字节****************/
void byte_write(uint byte_addr,uchar original_data)
{
ISP_ADDRH=(uchar)(byte_addr>>8); //取地址
ISP_ADDRL=(uchar)(byte_addr&0x00ff);
ISP_Order=ISP_Order&0xf8;
ISP_Order=ISP_Order|PrgCommand; //写命令2
ISP_DATA =original_data; //写入数据准备
ISPgoon(); //触发执行
ISP_IAP_disable(); //关闭IAP功能
}
/*******************************************************************************************/
ulong press,temp; //压力 温度 变量定义
uint H_T=40,H_P=105,L_T=10,L_P=90; //温度40-10 压力105-90
sbit d1=P2^7;
sbit d2=P2^6;
sbit d3=P2^5;
sbit d4=P2^4;
sbit d5=P2^3;
sbit d6=P2^2;
sbit point=P0^2;
uchar s1num=0;
/*******************************************************************************************/
uchar code tab[]={0x14,0x77,0x4C,0x45,0x27,0x85,0x84,0x57,
0x04,0x05,0x06,0xA4,0x9C,0x64,0x8C,0x8E}; //共阳数码管不带小数点的0~9编码
/*******************************************************************************************/
void InitIO(void); // Initialize IO port
void Inituart(void); // initialize 232 uart
void Config905(void); // Config nRF905 module配置NRF905模式
void SetTxMode(void); // Set nRF905 in Tx mode
void SetRxMode(void); // Set nRF905 in Rx mode
void TxPacket(void); // Send data by nRF905
void RxPacket(void); // Recive data by nRF905
void SpiWrite(uchar); // Write data to nRF905
uchar SpiRead(void); // Read data to nRF905
void Delay(uchar n); // Delay 100us
void Scankey(void); // Scan key
void TxData (uchar x); // Send key_value to CRT display
void comdebug(void);
/************************延时函数*******************************************************************/
void Delay(uchar n)
{
uint i;
while(n--)
for(i=0;i<80;i++);
}
//************************数码管显示函数*********************************
display()
{uchar times;
if(test==1&&s1num==0) //正常进入无任何操作时显示温度和气压
{
for(times=20;times>0;times--)
{
P0=tab[temp/100%10];d1=0;Delay(1);d1=1;
P0=tab[temp/10%10];point=0;d2=0;Delay(1);d2=1;
P0=tab[temp%10];d3=0;Delay(1);d3=1;
P0=tab[press/100%10];d4=0;Delay(1);d4=1;
P0=tab[press/10%10];d5=0;Delay(1);d5=1;
P0=tab[press%10];d6=0;Delay(1);d6=1;
}
}
else if(test==1&&s1num==1) //菜单键按下一次时显示温度上限
{
for(times=20;times>0;times--)
{
P0=0xac;d1=0;Delay(1);d1=1;
P0=tab[H_T/100%10];d3=0;Delay(1);d3=1;
P0=tab[H_T/10%10];point=0;d4=0;Delay(1);d4=1;
P0=tab[H_T%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==2) //菜单键按下两次时显示压力上限
{
for(times=20;times>0;times--)
{
P0=0x0e;d1=0;Delay(1);d1=1;
P0=tab[H_P/100%10];d3=0;Delay(1);d3=1;
P0=tab[H_P/10%10];d4=0;Delay(1);d4=1;
P0=tab[H_P%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==3) //菜单键按下三次时显示温度下限
{
for(times=20;times>0;times--)
{
P0=0xac;point=0;d1=0;Delay(1);d1=1;
P0=tab[L_T/100%10];d3=0;Delay(1);d3=1;
P0=tab[L_T/10%10];d4=0;Delay(1);d4=1;
P0=tab[L_T%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==4) //菜单键按下四次时显示气压下限
{
for(times=20;times>0;times--)
{
P0=0x0e;point=0;d1=0;Delay(1);d1=1;
P0=tab[L_P/100%10];d3=0;Delay(1);d3=1;
P0=tab[L_P/10%10];d4=0;Delay(1);d4=1;
P0=tab[L_P%10];d5=0;Delay(1);d5=1;
}
}
else if(test==0&&s1num==0) //按下轮胎号键显示接收缓冲区的轮号
{
for(times=20;times>0;times--)
{
P0=tab[RxBuf[10]/100%10];d2=0;Delay(1);d2=1;
P0=tab[RxBuf[10]/10%10];d3=0;Delay(1);d3=1;
P0=tab[RxBuf[10]%10];d4=0;Delay(1);d4=1;
}
}
}
/*************************************************************************************/
/*********键盘程序************************/
void keyscan(void)
{
if(menu==0)
{
Delay(10);
if(menu==0) //menu键按下一次s1num变量+1
{
while(!menu);
s1num++;
while(1)
{ if(menu==0)
{ Delay(10);
if(menu==0)
{
while(!menu);
s1num++;
}
}
if(s1num==1) //当s1num==1时
{
if(add==0) //add按下温度上线+10如果上限大于850上限等于850
{
Delay(10);
if(add==0)
{ while(!add);
if(H_T>=850)
H_T=850;
else
H_T+=10;
}
display();
}
if(dec==0) // dec按下温度上线-10如果上限小于100上限等于100
{
Delay(10);
if(dec==0)
{ while(!dec);
if(H_T<=100)
H_T=100;
else
H_T-=10;
}
display();
}
}
if(s1num==2) //当s1num==2时
{
if(add==0) //add按下气压上线+1如果上限大于110上限等于110
{
Delay(10);
if(add==0)
{ while(!add);
if(H_P>=110)
H_P=110;
else
H_P+=1;
}
display();
}
if(dec==0) //dec按下气压上线-1如果上限小于20上限等于20
{
Delay(10);
if(dec==0)
{ while(!dec);
if(H_P<=20)
H_P=20;
else
H_P-=1;
}
display();
}
}
if(s1num==3) //当s1num==3时
{
if(add==0) //add按下温度下线+10如果下限大于850下限等于850
{
Delay(10);
if(add==0)
{ while(!add);
if(L_T>=850)
L_T=850;
else
L_T+=10;
}
display();
}
if(dec==0) // dec按下温度下线-10如果下限小于20下限等于20
{
Delay(10);
if(dec==0)
{ while(!dec);
if(L_T<=20)
L_T=20;
else
L_T-=10;
}
display();
}
}
if(s1num==4) //当s1num==4时
{
if(add==0) //add按下气压下线+1如果下限大于110下限等于110
{
Delay(10);
if(add==0)
{ while(!add);
if(L_P>=110)
L_P=110;
else
L_P+=1;
}
display();
}
if(dec==0) // dec按下气压下线-1如果下限小于20下限等于20
{
Delay(10);
if(dec==0)
{ while(!dec);
if(L_P<=20)
L_P=20;
else
L_P-=1;
}
display();
}
}
if(s1num==5) //当s1num==5时 开始运行
{ s1num=0;//s1num清零//
SectorErase(0x2000);
SectorErase(0x2200);
byte_write(0x2000,H_T/256); //存储写入临时数据 温度上限
byte_write(0x2200,H_T%256); //写入临时数据
SectorErase(0x2400);
SectorErase(0x2600);
byte_write(0x2400,H_P/256); //写入临时数据 气压上限
byte_write(0x2600,H_P%256); //写入临时数据
SectorErase(0x2800);
SectorErase(0x2a00);
byte_write(0x2800,L_T/256); //写入临时数据 温度下限
byte_write(0x2a00,L_T%256); //写入临时数据
SectorErase(0x2c00);
SectorErase(0x3000);
byte_write(0x2c00,L_P/256); //写入临时数据 气压下限
byte_write(0x3000,L_P%256); //写入临时数据
break;
}
display();
}
}
}
}
/*************************************************************************************/
void main()
{
unsigned int cyc=0;
unsigned int distan=0;
//================NRF905初始化
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
DR=1; // Init DR for input
AM=1; // Init AM for input
PWR_UP=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TX_EN=0; // set radio in Rx mode
//================
Config905(); // Config nRF905 module
TxBuf[0] = 1;
TxBuf[1] = 1;
SetTxMode(); // Set Tx Mode
TxPacket(); // Transmit Tx buffer data
LED1 = 0;
LED2 = 0;
Delay(500); // delay for led light
LED1 = 1;
LED2 = 1;
TxBuf[0] = 0xff;
TxBuf[1] = 0xff;
// led close
SetRxMode(); // Set nRF905 in Rx mode
d1=0;
H_T=byte_read(0x2000)*256+byte_read(0x2200); //开机读取掉电前的温度上限如果>1000=1000
if(H_T>1000)
H_T=1000;
H_P=byte_read(0x2400)*256+byte_read(0x2600); //开机读取掉电前的气压上限如果>110=110
if(H_P>110)
H_P=110;
while(1)
{
//=====================从键盘获得数据
temp =RxBuf[2]+RxBuf[3]*256+RxBuf[4]*256*256+RxBuf[5]*256*256*256; //温度数据
press=RxBuf[6]+RxBuf[7]*256+RxBuf[8]*256*256+RxBuf[9]*256*256*256; //气压数据
if(temp>H_T||press>H_P||temp<L_T||press<L_P)//温度>上限或<下限报警气压>上限或<下限报警
speak=0;
else
speak=1;
display();
keyscan();
// if(KEY2 ==0 ) { LED2 = 0; TxBuf[1] = 1 ;tf = 1 ; }
if (tf==1)
{
//===============NRF905发送相应的按键
SetTxMode(); // Set Tx Mode
TxPacket(); // Transmit Tx buffer data
TxBuf[0] = 0xff;
TxBuf[1] = 0xff;
SetRxMode(); // Set nRF905 in Rx mode
tf=0;
Delay(500);
LED1 = 1;
LED2 = 1;
}
//=====================等待NRF905接收
if (DR) // If recive data ready...
RxPacket(); // ... recive data
}
}
/*******************************************************************************************/
/*******************************************************************************************/
//function Config905();
/*******************************************************************************************/
void Config905(void)
{
uchar i;
CSN=0; // Spi enable for write a spi command
SpiWrite(WC); // Write config command写放配置命令
for (i=0;i<RxTxConf.n;i++) // Write configration words 写放配置字
{
SpiWrite(RxTxConf.buf[i]);
}
CSN=1; // Disable Spi
}
/*******************************************************************************************/
//function SpiWrite();
/*******************************************************************************************/
void SpiWrite(uchar byte)
{
uchar i;
DATA_BUF=byte; // Put function's parameter into a bdata variable
for (i=0;i<8;i++) // Setup byte circulation bits
{
if (flag) // Put DATA_BUF.7 on data line
MOSI=1;
else
MOSI=0;
SCK=1; // Set clock line high
DATA_BUF=DATA_BUF<<1; // Shift DATA_BUF
SCK=0; // Set clock line low
}
}
/*******************************************************************************************/
//function SpiRead();
/*******************************************************************************************/
uchar SpiRead(void)
{
uchar i;
for (i=0;i<8;i++) // Setup byte circulation bits
{
DATA_BUF=DATA_BUF<<1; // Right shift DATA_BUF
SCK=1; // Set clock line high
if (MISO)
flag1=1; // Read data
else
flag1=0;
SCK=0; // Set clock line low
}
return DATA_BUF; // Return function parameter
}
/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
uchar i;
//Config905();
CSN=0; // Spi enable for write a spi command
SpiWrite(WTP); // Write payload command
for (i=0;i<32;i++)
{
SpiWrite(TxBuf[i]); // Write 32 bytes Tx data
}
CSN=1; // Spi disable
Delay(1);
CSN=0; // Spi enable for write a spi command
SpiWrite(WTA); // Write address command
for (i=0;i<4;i++) // Write 4 bytes address
{
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1; // Spi disable
TRX_CE=1; // Set TRX_CE high,start Tx data transmission
Delay(1); // while (DR!=1);
TRX_CE=0; // Set TRX_CE low
}
/*******************************************************************************************/
//function RxPacket();
/*******************************************************************************************/
void RxPacket(void)
{
uchar i;
TRX_CE=0; // Set nRF905 in standby mode
CSN=0; // Spi enable for write a spi command
SpiWrite(RRP); // Read payload command
for (i=0;i<32;i++)
{
RxBuf[i]=SpiRead(); // Read data and save to buffer
}
CSN=1; // Disable spi
while(DR||AM);
// P0= RxBuf[0]; // Buffer[0] output from P0 port...
TRX_CE=1;
//xx=(RxBuf[0]>>4)&0x0f;
//TxData(xx);
//=====================
LED1 = 0 ;
Delay(500); // ...light led
// P0=0xff; // Close led
LED1 = 1 ;
LED2 = 1 ;
}
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void)
{
TX_EN=1;
TRX_CE=0;
Delay(1); // delay for mode change(>=650us)
}
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void)
{
TX_EN=0;
TRX_CE=1;
Delay(1); // delay for mode change(>=650us)
}
发送机程序
* BMP085模块
*
* 用途:BMP085模块IIC测试程序
*
* 作者 日期 备注
* Huafeng Lin 2010/12/10 新增
* Huafeng Lin 2010/12/11 修改
*
*/
#include <REG51.H>
#include <math.h> //Keil library
#include <stdlib.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H> //Keil library
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^1; //IIC时钟引脚定义
sbit SDA=P2^0; //IIC数据引脚定义
sbit d1=P2^7;
sbit d2=P2^6;
sbit d3=P2^5;
sbit d4=P2^4;
sbit d5=P2^3;
sbit d6=P2^2;
sbit point=P0^2;
long temperature;
long pressure;
/***************************************905**********************************************/
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24 // Read RX Payload command
/*******************************************************************************************/
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
10,
0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;433MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
uchar xdata TxBuf[32];
uchar xdata RxBuf[32];
uchar key,rsbrf,delayf,tf;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
/*******************************************************************************************/
sbit TX_EN =P1^0;
sbit TRX_CE =P3^1;
sbit PWR_UP =P1^1;
sbit MISO =P1^7;
sbit MOSI =P1^4;
sbit SCK =P1^6;
sbit CSN =P1^5;
sbit AM =P3^0;
sbit DR =P1^3;
sbit CD =P1^2;
/*******************************************************************************************/
void InitIO(void); // Initialize IO port
void Inituart(void); // initialize 232 uart
void Config905(void); // Config nRF905 module配置NRF905模式
void SetTxMode(void); // Set nRF905 in Tx mode
void SetRxMode(void); // Set nRF905 in Rx mode
void TxPacket(void); // Send data by nRF905
void RxPacket(void); // Recive data by nRF905
void SpiWrite(uchar); // Write data to nRF905
uchar SpiRead(void); // Read data to nRF905
void Delay(uchar n); // Delay 100us
void Scankey(void); // Scan key
void TxData (uchar x);  
