jiahao的笔记 https://bbs.21ic.com/?86215 [收藏] [复制] [RSS]

日志

STC12C1052通讯试验程序

已有 774 次阅读2010-4-27 07:49 |系统分类:单片机

#include <STC12C2052AD.h> /* STC12C1052的头文件*/


//#define RELOAD_COUNT 0xC4    //18.432MHz Crystial,1T,SMOD = 1, 19,200bps
//#define RELOAD_COUNT 0x88    //18.432MHz Crystial,1T,SMOD = 1,  9,600bps


//#define RELOAD_COUNT 0xFB    //18.432MHz Crystial,12T,SMOD = 1,19200bps
//#define RELOAD_COUNT 0xFB    //18.432MHz Crystial,12T,SMOD = 0,9600bps
//#define RELOAD_COUNT 0xFD    //11.0592MHz Crystial,12T,SMOD = 0,9600bps


//软件版本 2Byte  如:Ver1.10,Version_H=1 Version_L=10
#define Version_H            1 //
#define Version_L            0 //



#define InBuf_len  3     // 定义接收数组长度
uchar  PACKAGE[3];       //通讯数据缓冲区数组//
uchar InBuf[InBuf_len];    //串口数据接收缓冲区数组
uchar count1;     //串口数据接收计数器
uchar read_flag;    //如果串口接收的数据达到INBUF_LEN个,且校验没错,就置位取数标志
void  UART_Init();
void  send_char_com(uchar ch);//向串口发送一个字节数据//
void  RevDataPross();


//////////////////////////////////////////////////////////////////////////////////
void INT_SERIAL(void) interrupt 4 //串行中断服务程序,接收到握手信号后设置应答标志// 
{
 if(RI==1)//是接收产生的中断//
 {
   RI=0;//清除接收中断标志//
   if (SBUF==0xaa)
   {
    count1=0;
   }
     else
   {
    InBuf[count1++]=SBUF;
       if(count1==InBuf_len)
        {
   read_flag=1;   //如果串口接收的数据达到INBUF_LEN个,且校验没错, 就置位取数标志
        }
   }
 }
}


//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void send_char_com(uchar ch)  //向串口发送一个字节数据//
{
 SBUF=ch;//将需发送的字节放到发送缓冲区//
 while(TI==0);//等待发送完成//
 TI=0;//清除发送完成中断标志//
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////


void delay()  //延时//
{
 uchar i,j;
 for(i=0;i<200;i++)
 {
  for(j=0;j<200;j++){}
 }

//////////////////////////////////////////////////////////////////////////////////
void TX(void) //发送数据帧//
{
 uchar verify;


  //计算校验值chksum//
  verify = PACKAGE[0]+PACKAGE[1]+PACKAGE[2];  
//  send_char_com(0xaa);       //同步头//
  send_char_com(PACKAGE[0]); //状态//
  send_char_com(PACKAGE[1]); //XH//
  send_char_com(PACKAGE[2]); //XL//
  send_char_com(verify);     //发送校验值//
  //led2 = !led2;
}
//////////////////////////////////////////////////////
//函 数 名:UART_Init(void)
//功    能:串口初始化函数
//输入参数:无  
//输出参数:无
//返 回 值:无
//////////////////////////////////////////////////////
void UART_Init()
{  
 // AUXR=0x40;//1T模式
 AUXR = 0x80;//12T模式


 SCON = 0x50;    //无校验//0xD0//0xF0;////方式1 允许接受//SM2=0  
 TMOD = 0x20;    ////T1模式2自动重装  T0模式1,16位定时,   
 PCON = 0x00;    ///0x00波特率不加倍SMOD=0////0x80;波特率翻倍SMOD=1
 TH1 = 0xfd;
 TL1 = 0xfd;
 TR1 = 1;     //波特率开启 //TR0=1;//T0开启
 IE |= 0x90 ;     //Enable Serial Interrupt  ES=1,EA=1
// ES = 1;
// EA = 1;
}
//////////////////////////////////////////////////////////////////////////////////


main()
{
 delay();
 //初始化//
 UART_Init();
 led1 = 1;
 led2 = 1;
 led3 = 1;
 read_flag = 0;
 count1 = 0;
 PACKAGE[0] = 0;
 PACKAGE[1] = 0;
 PACKAGE[2] = 0;



 
 while(1)
 {
  if(read_flag==1)  //如果已经与PC联机,则向PC发送数据帧//
  {
   RevDataPross();
//   PACKAGE[0] = InBuf[0];
//   PACKAGE[1] = InBuf[1];
//   PACKAGE[2] = InBuf[2];
   delay();
//   TX();//向主机发送数据帧///////
   read_flag = 0;    //没有与连接好//
    InBuf[0] = 0xff;
   InBuf[1] = 0xff;
   InBuf[2] = 0xff;


  }
  delay();
  //led1 = !led1;
 }
}
//////////////////////////////////////////////////////
//函 数 名:RevDataPross(void)
//功    能:函数
//输入参数:InBuf[]  
//输出参数:无
//返 回 值:无
//////////////////////////////////////////////////////
void RevDataPross()
{
  uchar chksum;
  chksum=InBuf[0]+InBuf[1];
 if(chksum==InBuf[2])
 {
  switch(InBuf[0])
   {
     case 0x00:
   if(InBuf[1]==0xff)
  {
   PACKAGE[0] = 0x11;
   PACKAGE[1] = 0x22;
   PACKAGE[2] = 0x33;
   TX();
  }
       led1 = 0;
       break;
     case 0x01:
   if(InBuf[1]==0x00)
  {
   PACKAGE[0] = 0xfe;
   PACKAGE[1] = Version_H;
   PACKAGE[2] = Version_L;
   TX();
  }
       led2 = 0;
       break;
     case 0x02:
   if(InBuf[1]==0x00)
  {
   PACKAGE[0] = 0xfe;
   PACKAGE[1] = 0x88;
   PACKAGE[2] = 0x99;
   TX();


  }
       led3 = 0;
       break;
     default:
   led1 = 1;
  led2 = 1;
  led3 = 1;
  send_char_com(0x80); //Error:无此命令
  send_char_com(0x97);


         return;
   }
   } 
   else
   {
   led1 = 1;
  led2 = 1;
  led3 = 1;
  send_char_com(0xff); //Error: Chksum错误
  send_char_com(0xff);
 }
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)