📄 test.c.bak
字号:
#define __SRC
#include "test.h"
#undef __SRC
sbit LED0 = P0^0;
sbit LED1 = P0^1;
sbit LED2 = P0^2;
sbit LED3 = P0^3;
sbit Key0 = P0^4;
sbit Key1 = P0^5;
sbit Key2 = P0^6;
sbit Key3 = P0^7;
#define PWR_ON 0
#define PWR_OFF 1
#define MOTO_FORW 1 /* 01 */
#define MOTO_BACK 2 /* 10 */
#define MOTO_STOP 3 /* 11 */
/************************************************************/
#define E2ADRSYS 0x00 /* 本系统于EEPROM中地址 */
uchar idata ADDRESS=1;
uchar idata URT_buf; /* 串口接收数据缓冲器 */
uchar idata URT_cnt; /* 数据接收计数器 */
uchar idata URT_rcv,URT_cmd,URT_len;
/************************************************************/
uchar idata wrrdadr; /* EEPROM操作(读/写)首地址 */
uchar idata Databuf[16]; /* 16字节数据存储缓冲区 */
#define BUFADR Databuf[0] /* 系统地址 */
#define BUFPTST Databuf[1] /* 操作端口/状态 */
#define BUFHOUR Databuf[2] /* 时间:时 */
#define BUFMINT Databuf[3] /* 时间:分 */
/************************************************************/
uchar idata tim_cnt; /* 定时计数器 */
uchar idata tim_scd; /* 秒计数器 */
uchar idata tim_mnt;
uchar idata tim_hur;
bit bdata Flag_scd; /* 1秒标志位 */
/* 波特率发生器的初值fosc=7.3728MHz/(2*DIVM)=1.8432MHz */
/* 设置串口波特率 = Fosc / ((BRGR1,BRGR0)+16) */
#define BRGR1_DATA 0x00 /* 9600BPS = 00B0H */
#define BRGR0_DATA 0xB0 /* 2400BPS = 1DF0H */
/*==========================================================*/
void Config905(void); /* 配置nRF905 */
void RF_POWOFF(void); /* 配置nRF905掉电模式 */
void RF_WAKEUP(void); /* 配置nRF905接收模式 */
void RF_WRITE(uchar *rfdata); /* 配置nRF905写地址/数据 */
void RF_READ(uchar *rfdata); /* 配置nRF905读地址/数据 */
/*==========================================================*/
/* 功能:查询方式对地址范围为0x00~0xFF之间的EEPROM字节编程(写) */
/* 入口: ptr,写入数据首地址
/* e2adr,写入EEPROM首地址
/* length,写入数据长度
/* 出口: 无。
/************************************************************/
void eeprom_write(uchar e2adr,uchar *ptr,uchar length)
{
uchar i,j;
i=j=0;
for(i=0;i<length;i++)
{
j=0;
DEECON = 0;
DEEDAT = ptr[i];
DEEADR = e2adr;
while(j==0)j=DEECON&0x80;
e2adr++;
}
}
/*==========================================================*/
/* 功能:查询方式对地址范围为0x00~0xFF之间的EEPROM字节编程(读) */
/* 入口: ptr,写入数据首地址
/* e2adr,写入EEPROM首地址
/* length,写入数据长度
/* 出口: 无。
/************************************************************/
void eeprom_read(uchar e2adr,uchar *ptr,uchar length)
{
uchar i,j;
i=j=0;
for(i=0;i<length;i++)
{
j=0;
DEECON = 0;
DEEADR = e2adr;
while(j==0)j=DEECON&0x80;
ptr[i] = DEEDAT;
e2adr++;
}
}
void uart_init(void)
{
SCON=0x50; /* 串行口为方式1 SM2=0,REN=1 */
/* PCON|=0x40; /* SMOD0=1,使用FE标志位(与SSTAT.3是同一标志) */
PCON=0x00;
SSTAT=0x20; /* 禁止双缓冲使能,中断独立,每发送一字节产生一次中断 */
/* 设置串口波特率:Fosc / ((BRGR1,BRGR0)+16) */
BRGCON=0x00; /* 关波特率发生器 */
BRGR1=BRGR1_DATA;
BRGR0=BRGR0_DATA;
BRGCON=0x03; /* 打开串口波特率发生器,使用串口波特率发生器 */
ES=1; /* 允许接收中断 */
EST=0; /* 禁止发送中断 */
RI=0;
TI=0;
}
/*=================================================*/
/*发送数据子程序*/
void mscom_snd(uchar *ptr,uchar length)
{
uchar i;
for(i=0;i<length;i++)
{ SBUF=ptr[i];
while(TI==0);
TI=0;
}
}
void mscom_byte(uchar sndat)
{
SBUF=sndat;
while(TI==0);
TI=0;
}
/**************************************************/
/*********** 串口(Rx)中断服务子程序 *************/
void Mscom_rcv(void) interrupt 4 using 1
{
if(RI==1)
{
RI=0;
URT_rcv=SBUF;
mscom_byte(URT_rcv);
}/* 串口接收程序结束 */
}/* 串口中断程序结束 */
/****************************************************************/
void Ptimer1(void) interrupt 3 using 1
{
TH1=(65536-46080)/256; /* Fosc=733728MHz/4=1.8432MHz */
TL1=(65536-46080)%256; /* 50ms timer interrupt */
TR1=1;
if(++tim_cnt==20)
{
tim_cnt=0;
Flag_scd=1;
if(tim_scd++==60)
{
tim_scd=0;
if(tim_mnt++==60)
{
tim_mnt=0;
if(tim_hur++==24) tim_hur=0;
}
}
}
}
/************************************************************************************************/
main()
{
uchar i;
/*IO口模式设置00准双向;01推挽;10高阻输入;11开漏 */
P0M1=0x00; /* P0M1: 00000000 键盘 双向*/
P0M2=0x0F; /* P0M2: 00001111 LED 推挽*/
P1M1=0x2C; /* P1M1: 00101100 P1.2/P1.3配置为开漏,外接上拉电阻;P1.5(RST)仅能为输入(高阻);*/
P1M2=0x0C; /* P1M2: 00001100 中断1,串口为准双向;*/
P2M1=0x00; /* P2M1: 00000000 */
P2M2=0x00; /* P2M2: 00000000 */
P3M1=0x00; /* IO口模式设置: 准双向口00,使用内部时钟 */
P3M2=0x00;
P0=0xFF; /* 初化P0口 */
P1=0xFF;
P2=0xFF; /* */
P3=0xFF; /* */
DIVM=2; /* 降低工作频率,以便程序移植 */
uart_init(); /* 串口初始化9600BPS */
Config905(); /* 配置nRF905 */
TMOD|=0x10; /* 定时器方式1 */
TH1=(65536-46080)/256; /* Fosc=1.8432MHz,50ms timer interrupt */
TL1=(65536-46080)%256;
ET1=1;TR1=1;
EA=1;
eeprom_read(E2ADRSYS,Databuf,16); /* 读取本系统地址及参数 */
ADDRESS = BUFADR;
if(ADDRESS==0xFF) /* 地址为0xFF时,初始化地址为1 */
{
BUFADR = ADDRESS = 0x01; /* 本系统地址存储为0x01 */
for(i=1;i<16;i++)Databuf[i]=i;
eeprom_write(E2ADRSYS,Databuf,16); /* 存储本系统地址及参数 */
}
mscom_snd(Databuf,16);
while(1)
{
switch (URT_rcv)
case 0x00:
BUFADR = ADDRESS++;
eeprom_write(E2ADRSYS,Databuf,16);
mscom_snd(Databuf,16);
break;
case 0x01:
RF_WRITE(Databuf);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -