导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→急求高手帮助!此程序为020UART1的异步串行双机通信,但[gfc2003]

 *第33761篇: 急求高手帮助!此程序为020UART1的异步串行双机通信,但不能正常通信!

  
楼 主:gfc2003 2005年8月23日10:45
 急求高手帮助!此程序为020UART1的异步串行双机通信,但不能正常通信!
#include   <c8051f020.h>                   // SFR declarations
#include   <stdio.h>  
#include   <intrins.h>  
#define PRT0CF P0MDOUT
#define PRT1CF P1MDOUT
#define PRT2CF P2MDOUT
#define BAUDRATE     115200  // 串口波特率(bps);
#define MUX_volt  0x01
#define uchar unsigned char
unsigned int w;
long volt;
sfr16   ADC0     = 0xbe;                 // ADC0 data
uchar idata buf[6];
uchar sum;

//-----------------------------------------------------------------------------
                       /*      初始化程序       */
//-----------------------------------------------------------------------------

void Delay1us(unsigned char us)
{
 while (us)
 {
   _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
   --us;
 }
}            // 延时1us

void SYSCLK_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 18.432MHz crystal
   for (i=0; i   < 256; i++) ;           // Wait for osc. to start up
   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
// OSCICN = 0x07;   //interal 16MHZ
}

void PORT_Init (void)
{
   XBR0    = 0x07;                     // Enable SMBus, SPI0, and UART0
   XBR1    = 0x00;
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
   EMI0TC  = 0x21;
   P74OUT  = 0xFF;
   P0MDOUT = 0x15;
   P1MDOUT |= 0x3d;       //P1.2-P1.5推挽输出
   P1 &= 0xc3;       //P1.2-P1.5=0

}

//-----------------------------------------------------------------------------
                       /*       ADC0初始化       */
//-----------------------------------------------------------------------------

void init_adc(void)
{
 ADC0CN = 0x81;                      // ADC0 enabled; normal tracking
                                      // mode; ADC0 conversions are initiated 
                                        // on write to AD0BUSY; ADC0 data is
                                        // left-justified
 REF0CN = 0x07;                                  // enable temp sensor, on-chip VREF
                                        // and VREF output buffer
       
 AMX0SL = MUX_volt;  

 ADC0CF = (SYSCLK/2500000)   <  < 3;     // ADC conversion clock = 2.5MHz
 //ADC0CF |= 0x01;                     // PGA gain = 2
 EIE2 &= ~0x02;                      // disable ADC0 EOC interrupt
 EIE1 &= ~0x04;                      // disable ADC0 window compare interrupt
}

void Delay1ms(unsigned char T)
{
 while (T)
 {
  Delay1us(200);
  Delay1us(200);
  Delay1us(200);
  Delay1us(200);
  Delay1us(200);
  T--;
 }
}            //延时1ms
//-----------------------------------------------------------------------------
// UART0初始化
//-----------------------------------------------------------------------------
//
//设置UART0, 用定时器1为波特率发生器
//
void UART1_Init (void)
{
 SCON1 = 0x70; // SCON1: 模式1, 8位UART, 允许RX
 TMOD = 0x20; // TMOD: 定时器1, 模式2, 8位重装
 TH1 = -(SYSCLK/BAUDRATE/16); // 设定波特率;
 TL1 = TH1;
 TR1 = 1; // 起动定时器1
 CKCON |= 0x10; // 定时器1使用系统时钟为时基
 PCON |= 0x10; // SMOD00 = 1
 EIE2 = 0x40;        //Extended Interrupt Enable 2
}

void UART1_ISR (void) interrupt 20
  {
    if(!(SCON1 &0x02))                   
    SCON1 &=0xfd;
  }

/* 发送程序*/

void send(void)
{
  uchar i;
  do{
      SBUF1=0xaa;
   while(!(SCON1 &0x02));
   SCON1 &=0xfd;
   while(!(SCON1 &0x01));
   SCON1 &=0xfe;
    } while((SBUF1^0xbb)!=0);
  do{
      sum=0;
   for(i=0;i  <6;i++)
   {
        SBUF1= buf[i];
  sum=sum+buf[i];
  while(!(SCON1 &=0x02))
  SCON1 &=0xfd;
   }
   SBUF1 = sum;
   while(!(SBUF1 &=0x02) )
   SBUF1 &= 0xfd;
    } while(SBUF1!=0);
}


void Delay1s(unsigned char T)
{
 while (T)
 {
  Delay1ms(200);
  Delay1ms(200);
  Delay1ms(200);
  Delay1ms(200);
  Delay1ms(200);
  T--;
 }
}            //延时1s

//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------

void main (void) 
{
    sum=0;
 WDTCN = 0xde;
 WDTCN = 0xad;           //关看门狗
 SYSCLK_Init ();         //初始化时钟
 PORT_Init ();           //初始化IO口
 UART1_Init ();          //初始化串口
 CPT1CN|=0x80;   //使能比较器1
 REF0CN = 0x03;    //使能片内参考电压

     EA=1;
     buf[0]=1;buf[1]=2;buf[2]=3;buf[3]=4;buf[4]=5;buf[5]=6;
     while(1)
  {
    send();
  }
}


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:具有这样资源的arm适合做什么产品?

[下一篇主题]:超声波电源