📄 340_com.c
字号:
#include <c8051f340.h>
#include <intrins.h>
#include <ABSACC.h>
#define uchar unsigned char
#define uint unsigned int
#define smtime 0x64
#define rxsize 20
/*****************************************************************///GPRS定义
/*****************************************************************/
uchar data rxbuf[20];
uchar data rbuf[20];
uchar data txbuf[20];
uchar js;
uchar ckjs;//串口接收计数
uchar data ljh;//校验和
uint xyh;
bit fsbz;
void CKTX0(uchar com);
/*****************************************************************/
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
int jsq;
/*****************************************************************/
sbit DSRST=P0^5;
sbit SCLK=P1^0;
sbit DINC=P1^1;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/**时钟输入一字节**/
void RT_InByte(unsigned char dat)
{
unsigned char i;
ACC=dat;
for (i=8;i>0;i--)
{
DINC=ACC0;
SCLK=1;
SCLK=0;
ACC>>=1;
}
}
/**时钟输出一字节**/
unsigned char RT_OutByte(void)
{
unsigned char i;
DINC=1;
for (i=8;i>0;i--)
{
ACC>>=1;
ACC7=DINC;
SCLK=1;
SCLK=0;
}
return(ACC);
}
/*********向DS1302先写地址,后写命令/数据************************/
void WrDs(unsigned char dsAddr,unsigned char dsData)
{
DSRST=0;
SCLK=0;
DSRST=1;
RT_InByte(dsAddr);
RT_InByte(dsData);
SCLK=1;
DSRST=0;
SCLK=0;
}
/*********向DS1302先写地址,后读命令/数据************************/
unsigned char RdDs(unsigned char dsAddr)
{
unsigned char dsData;
DSRST=0;
SCLK=0;
DSRST=1;
RT_InByte(dsAddr);
dsData=RT_OutByte();
SCLK=1;
DSRST=0;
SCLK=0;
return(dsData);
}
/********************************************************************
功 能:往DS1302写入时钟数据(多字节方式)
说 明:先写地址,后写命令/数据
入口参数:pWD: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
/*void WrDsT(unsigned char *pWD)
{
unsigned char i;
WrDs(0x8e,0x00); // 控制命令,WP=0,写操作
DSRST = 0;
SCLK = 0;
DSRST = 1;
RT_InByte(0xbe); // 0xbe:时钟多字节写命令
for (i = 8; i>0; i--) //8Byte = 7Byte 时钟数据 + 1Byte 控制
{
RT_InByte(*pWD); // 写1Byte数据
pWD++;
}
SCLK = 1;
DSRST = 0;
WrDs(0x8e,0x80);
} */
/********************************************************************
功 能:读取DS1302时钟数据
说 明:先写地址/命令,后读数据(时钟多字节方式)
入口参数:pRD: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
/*void RdDsT(unsigned char *pRD)
{
unsigned char i;
DSRST = 0;
SCLK = 0;
DSRST = 1;
RT_InByte(0xbf); // 0xbf:时钟多字节读命令
for (i=8; i>0; i--)
{
*pRD = RT_OutByte(); // 读1Byte数据
pRD++;
}
SCLK = 1;
DSRST = 0;
} */
/********************************************************************
功 能:往DS1302寄存器数写入数据(多字节方式)
说 明:先写地址,后写数据(寄存器多字节方式)
入口参数:pWReg: 寄存器数据地址
返 回 值:无
***********************************************************************/
/*void WrDsR(unsigned char *pWReg)
{
unsigned char i;
WrDs(0x8e,0x00); 控制命令,WP=0,写操作
DSRST = 0;
SCLK = 0;
DSRST = 1;
RT_InByte(0xfe); 0xbe:时钟多字节写命令
for (i=31; i>0; i--) 31Byte 寄存器数据
{
RT_InByte(*pWReg); // 写1Byte数据
pWReg++;
}
SCLK = 1;
DSRST = 0;
WrDs(0x8e,0x80);
} */
/********************************************************************
功 能:读取DS1302寄存器数据
说 明:先写地址,后读命令/数据(寄存器多字节方式)
入口参数:pRReg: 寄存器数据地址
返 回 值:无
***********************************************************************/
/*void RdDsR(unsigned char *pRReg)
{
unsigned char i;
DSRST = 0;
SCLK = 0;
DSRST = 1;
RT_InByte(0xff); // 0xff:时钟多字节读命令
for (i=31; i>0; i--) //31Byte 寄存器数据
{
*pRReg = RT_OutByte(); // 读1Byte数据
pRReg++;
}
SCLK = 1;
DSRST = 0;
} */
/********************************************************************
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
入口参数:pSetClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void SetDs(unsigned char *pSetClock)
{
unsigned char i;
unsigned char DsAddr = 0x80;
WrDs(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7; i>0; i--)
{
WrDs(DsAddr,*pSetClock); /* 秒 分 时 日 月 星期 年 */
pSetClock++;
DsAddr +=2;
}
WrDs(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
功 能:读取DS1302当前时间
说 明:
入口参数:DsTime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void GetDs(unsigned char DsTime[])
{
unsigned char i;
unsigned char DsAddr = 0x81;
for (i=0; i<7; i++)
{
DsTime[i] = RdDs(DsAddr);/*格式为: 秒 分 时 日 月 星期 年 */
DsAddr += 2;
}
}
/*时钟初始化*/
void Ds1302Init(void)
{
WrDs(0x8e,0x00); //写操作允许
WrDs(0x90,0xa9); //充电允许
WrDs(0x8e,0x80); //写操作禁止
}
/******clock driver finished**************************/
void SYSCLK_init(void);
void PORT_Init (void);
void T0_model_2ms_init(void);
void UART0_Init (void);
/****************************************************************
*
*UART0初始化程序
*****************************************************************/
void UART0_Init (void)
{
SCON0 |= 0x10; //8位 UART,允许接收
CKCON = 0x01; //系统时钟的/12
TH1 = 0x64; //波特率为9600
TL1 = TH1;
TMOD = 0x20;
TR1 = 1;
ES0 = 1;
EA = 1;
}
/****************************************************************
*
*UART1初始化
*****************************************************************/
void UART1_Init (void)
{
SBRLL1 =0X8F;
SBRLH1 =0XFD; //波特率 9600 内部12M 晶振
SCON1 =0X30; //允许接收,准备好接收
SMOD1 =0X0C; //8位数据长度
SBCON1 =0X43; //使能UART1,1分频
EIE2|=0x2;
}
/*****************************************************************
*
*端口初始化函数
*****************************************************************/
void Port_IO_Init(void)
{
P0SKIP = 0xCF;
P1SKIP = 0xFF;
P2SKIP = 0xFF;
P3SKIP = 0x03;
XBR2 = 0x01;
XBR0 = 0x05; //P0.4 P0.5接到串口0上,SMBus 连接到P0.2、P0.3口上
XBR1 = 0x70; //交叉开关、T0、T1使能
}
/*****************************************************************
*
*初始化计数器0
*****************************************************************/
void T0_model_2ms_init(void)
{
jsq++;
if (jsq>=100){
P2_1=!P2_1;
jsq=0;
}
CKCON &=0xf7; //定时器0的计数源选择系统脉冲的12分频
TMOD =0X01; //定时器0,方式1
TH0 =0XF8;
TL0 =0X30;
IE |=0x82;
TCON |=0X10; //启动定时器0
TR0 =0;
}
/*****************************************************************
*
*系统初始化
*****************************************************************/
void System_Init(void)
{
//uint i;
EMI0CF = 0x43;
PCA0MD &= ~0x40; //关闭看门狗定时器
//SYSCLK_init();
OSCICN |= 0x03; //内部高频振荡器使能且振荡器按编程频率来运行
Port_IO_Init();
T0_model_2ms_init();
UART0_Init ();
UART1_Init ();
//EMI0CF = 0x43;
}
/*****************************************************************
*工程:C8051F340 DEBUG
*说明:中断服务函数
*
******************************************************************/
static bit Flage=0;
static uint Count;
static char Input_Char;
static char UART1_Input;
/*****************************************************************
*功能:定时器0 中断服务函数
*资源:寄存器组2
*****************************************************************/
void T0_Interrupt(void) interrupt 1 using 1
{
TH0=0XF8;
TL0=0X30;
Count++;
if (Count==5000)
{
Count=0;
if(!P4)
P4=0xff;
else
P4=0x00;
P4=0xff;
}
}
/*****************************************************************
*功能:串行接收 中断服务函数
*资源:寄存器组3
*出口:Interput_Char
*****************************************************************/
void UART0_Interrupt(void) interrupt 4 using 2
{
//7E 00 10 90 00 13 A2 00 40 53 3D EE 00 01 01 01 0F FE 00 EC
uchar ch,i;
/*Modem 状态 0x8A
高级Modem 状态 0x8C
AT 命令 0x08
AT 命令- 队列参数值 0x09
AT 命令反馈 0x88
远程命令要求 0x17
远程命令反馈 0x97
Zigbee 发送要求 0x10
显式寻址 ZigBee 命令帧 0x11
ZigBee 发送状态 0x8B
Zigbee 接收包(AO=0) 0x90
Zigbee 显示Rx 指示器(AO=1) 0x91
XBee 传感器读取指示器(AO=0) 0x94
节点识别指示器(AO=0) 0x95 */
if(RI0){
P2_3=!P2_3;
ES0=0;
RI0=0;
rbuf[ckjs]=SBUF0;
if (rbuf[0]==0x7e){
// rbuf[ckjs]=SBUF0;
// CKTX0(rbuf[ckjs]);
ckjs++;
if ((ckjs==rxsize)&&(rbuf[3]==0x90)){
fsbz=1;
ckjs=0;
}
}
}
ES0=1;
TH1 =0x64; //ec
TR1=1;
}
/***************************************************************///单字节发送
void CKTX0(uchar com){
ES0=0;
SBUF0=com;
while(TI0==0);
TI0=0;
ES0=1;
}
/***************************************************************///多字节发送
void ckdztx(void){
uchar i,sum1;
int sum;
sum=0;
sum1=0;
txbuf[0]=0x7e;
txbuf[1]=0x00;
txbuf[2]=0x0f;
txbuf[3]=0x10;
txbuf[4]=0x01;
for (i=5;i<15;i++){
txbuf[i]=rxbuf[i-1];
sum=sum+txbuf[i];
}
txbuf[15]=0x00;
txbuf[16]=0x00;
txbuf[17]=smtime;
sum=sum+smtime+txbuf[3]+txbuf[4];
sum1=sum;
sum1=256-sum1;
txbuf[18]=sum1;
for (i=0;i<19;i++){
CKTX0(txbuf[i]);
}
}
/***************************************************************///写数据到XRAM 每次14个字节
void xram (void){
uchar i;
int y;
js++;
//00 13 A2 00 40 53 3D EE 00 01 01 01 0F FE 00
y=rxbuf[17]*15;
for (i=0;i<15;i++){
XBYTE[y+i]=rxbuf[i];
}
}
/***************************************************************////读取数据XRAM设备码
void fhsj(void){
uchar i;
for (i=0;i<=19;i++){
CKTX0(rbuf[i]);
}
}
/***************************************************************///
/*全局变量声明
*******************************************************************/
//uchar xdata *point; //数据指针
/*****************************************************************
*
*主程序
*****************************************************************/
void main(void)
{
uchar i,sum1;
System_Init();
ckjs=0;
ljh=0;
xyh=0;
while(1)
{
//xram ();
ljh=0;
sum1=0;
if (fsbz==1){
fsbz=0;
ckjs=0;
// fhsj();
for(i=3;i<19;i++){
ljh+=rbuf[i];
}
// ljh=0xff-ljh;
ljh=(255-ljh);
if (ljh==rbuf[19]){
fsbz=0;
ckjs=0;
ckdztx();
ljh=0;
}
}
//while(fsbz==0);
//fsbz=0;
//if (rbuf[0]==0x7e)
// ckdztx();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -