STC15W1K16S和VC6.0串口通讯收发测试实例

/*********************************************

STC USB 串口板 2014 4 7 20:12 发送接收数据

使用STC串口调试助手通讯正常,L161

**********************************************/

          #include   "reg51.h"

          #include   "intrins.h"

          #define    uint unsigned int  

          #define    uchar unsigned char

 typedef    uchar BYTE;

          typedef    uint  WORD;

          #define    SLAVE 1                 //定义从机编号,0 为从机 1, 1 为从机 2

          #if        SLAVE==0

          #define    SAMASK 0x33             //从机 1 地址屏蔽位

          #define    SERADR 0x55             //从机 1 的地址为 xx01,xx01

          #define    ACKTST 0x78             //从机 1 应答测试数据

          #else

          #define    SAMASK 0x3C             //从机 2 地址屏蔽位

          #define    SERADR 0x5A             //从机 2 的地址为 xx01,10xx

          #define    ACKTST 0x49             //从机 2 应答测试数据

          #endif

          #define    URMD 2                  //0:使用定时器 2 作为波特率发生器

 sfr        AUXR=0x8e;              //辅助寄存器

          sfr        SADDR=0xA9;             //从机地址寄存器

          sfr        SADEN=0xB9;             //从机地址屏蔽寄存器

 char       count;

          sfr        P4=0xc0;

          sfr        P5=0xc8;

 sbit       out=P1^5;//

     sbit       out1=P4^5;//

          sbit       out2=P1^6;//

 sbit       out3=P1^7;//

 sbit       key1=P0^0;//

          sbit       key2=P0^1;//

 int        Buff;

 void       sw_out(unsigned char a);//开关量输出

/*--------UART 中断服务程序-------------------*/

         void Uart() interrupt 4 using 1

          {

          if(RI)

           {

           Buff=SBUF;

           RI=0;

           }

          }

/*------------初始化串口---------------------*/

         void InitUart()

          {

           SADDR=SERADR;

           SADEN=SAMASK;

           SCON=0x50;                //8位数据,可变波特率允许接收

           #if URMD==0

           T2L=0xDF;                        //设置波特率重装值

           T2H=0xFE;                        //9600bps(65536-11059200/4/9600)

           AUXR &=0x40;            //定时器1时钟为Fosc/12,即12T

      AUXR&=0xFE;                //串口1选择定时器1为波特率发生器

           #elif URMD==1

           AUXR=0x40;                       //定时器 1 为 1T 模式

           TMOD=0x20;                //设定定时器1为16位自动重装方式

      TL1=0xDF;                //设定定时初值

      TH1=0xFE;                //设定定时初值

      ET1=0;                    //禁止定时器1中断

      TR1=1;                    //启动定时器1

           #else

           TMOD=0x20;                       //设置定时器 1 为 8 位自动重装载模式

           AUXR=0x40;                       //定时器 1 为 1T 模式

  TL1=TH1=0xDB;                    // 9600 bps(256 - 11059200/32/9600)

           TR1=1;

           #endif

          }

/*******************************************/

 void  delay(uint t) 

          { 

           uint i,j; 

           for(i=0;i<t;i++) 

           {

            for(j=0;j<121;j++); 

           } 

          }

/*******************************************/

          void send(unsigned temp) 

            { 

             unsigned serial;

    serial=temp;

    SBUF=(unsigned char)temp;

             while(TI!=1);

    TI=0;

           }  

/*******************************************/   

           void  main(void)   

          {   

           unsigned char a=255;    

  InitUart();                       //初始化串口

           ES = 1;

           EA = 1;                                 

           P0=0XFF;

  out1=0;

  out2=1;

  out3=1;

  delay(2000); 

  out1=1;

  out2=0;

  out3=1;

  delay(2000); 

  out1=1;

  out2=1;

  out3=0;

  delay(2000); 

  out1=1;

  out2=1;

  out3=1;

           while(1)

           {

if(!key1) 

   {

   send(0X1F);

out1=0;

delay(1000);

out1=1;

   }

  if(!key2) 

   {

   send(0XF1);

out1=0;

delay(1000);

out1=1;

   }

       sw_out(Buff);            //输出开关量   

out=0;

   delay(2000);

   out=1;   

delay(2000);    

           }   

 }

/*******************************************/  

     void sw_out(unsigned char a)

     {

  if(a==0x01)

      {

   out1=0;

out2=1;

out3=1;

   }

    else if(a==0x02)

  {

   out1=1;

out2=0;

out3=1;

  }

  else if(a==0x04)

  {

   out1=1;

out2=1;

out3=0;

   }

  else if(a==0x00)

  {

   out1=1;

out2=1;

out3=1;

  }

       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值