新闻  |   论坛  |   博客  |   在线研讨会
Zigbee综合小实验(1)
luker | 2016-02-25 14:24:15    阅读:229   发布文章
综合前面5个基础实验,利用串口线进行PC机与单片机之间的通信,利用串口助手向单片机发送字符串,单片机接收到一个字节红色LED灯闪烁一次,当字符串长度合法时LCD显示屏显示该字符串,当长度非法时红色LED灯常亮,LCD显示错误信息,并且向PC机反馈错误信息。

源代码:

#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define RLED P1_0  //定义控制灯的端口

void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len,int type);

uchar Recdata[30]=" "; 
uchar ERR[26]="The string is too long!\r\n "; //反馈的错误信息
uchar RXTXflag = 1;//接收状态标志,1为继续接收,2为所接收字符串过长,3为接收完毕。
uchar temp;  //存放所接收的字节
uint  datanumber = 0;

void initUART0(void)
{
    CLKCONCMD &= ~0x40;                         //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                    //等待晶振稳定
    CLKCONCMD &= ~0x47;                         //设置系统主时钟频率为32MHZ   
    PERCFG = 0x00;                //位置1 P0口
    P0SEL = 0x3c;                //P0用作串口
    P2DIR &= ~0XC0;                             //P0优先作为UART0    
    U0CSR |= 0x80;                //串口设置为UART方式
    U0GCR |= 9;                
    U0BAUD |= 59;                //波特率设为19200
    UTX0IF = 1;                                 //UART0 TX中断标志初始置位1    
    U0CSR |= 0X40;                //允许接收
    IEN0 |= 0x84;                //开总中断,接收中断
}

void UartTX_Send_String(uchar *Data,int len,int type) //显示与反馈子程序
{
  if(type==0){
  ClearRAM();
  Print8(0,1,Data);    //长度合法时,LCD显示字符串
  }
  else{
    int j=len;
    ClearRAM();
    Print8(0,1,"ERROR!Can not display!!");  //LCD显示错误信息
    for(int i=0;i     U0DBUF=*Data++;
    while(UTX0IF==0);
    UTX0IF=0;
    }
    
  }
  for(int c=0;c   Recdata[c]=(uchar)NULL;
}

void main(void)
{    
        
        P0DIR=0XFF;
        P1DIR=0XFF; 
        initLCDM();
        ResetLCD();
    RLED = 0;     //关LED
    initUART0();
    while(1)
    {
          if(RXTXflag == 1)                 //接收状态
          {
                         
            if( temp != 0)
            {
                if((temp!='#')&&(datanumber                 {          
                 Recdata[datanumber++] = temp;
                                //恢复到接收状态              
                }else{
                  RXTXflag = 3;   
                  
                }
                if(datanumber = 22)
                  RXTXflag = 2;
                  temp  = 0;           
            }
          }
          if(RXTXflag == 2){ 
            UartTX_Send_String(ERR,sizeof(ERR),1); 
            datanumber = 0;            //指针归0
            RXTXflag=1;
          }
          if(RXTXflag == 3)            //发送状态
          {
            
            U0CSR &= ~0x40;            //不能收数据
            UartTX_Send_String(Recdata,datanumber,0);
            U0CSR |= 0x40;            //允许接收
            RXTXflag = 1;                //恢复到接收状态
            datanumber = 0;            //指针归0
            RLED = 0;                    //关发送指示
            
          }
    }
}

#pragma vector = URX0_VECTOR         //中断服务子程序,处理接收到字符产生的中断
 __interrupt void UART0_ISR(void)
 {
     URX0IF = 0;//清中断标志                          
        RLED = 1;                //接收时红灯亮,发送后红灯灭。实现闪烁。
        temp = U0DBUF; 
       
 }

实验结果:
Zigbee综合小实验(1) - j_evil - J_evil

Zigbee综合小实验(1) - j_evil - J_evil
参与讨论
登录后参与讨论
推荐文章
最近访客