⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 340_com.c

📁 c8051f340双串口通信源码/
💻 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 + -