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

📄 main.c

📁 《Proteus在MCS-51&ARM7系统中的应用百例》书中附带原程序代码
💻 C
字号:
/*******************************************************************************
*File: main.c
*功能:使用串口UART0接收上位机发送的数据,当接收到8个连续数据后,取反LED控制,并将
*     数据原封不动地发送回上位机
*******************************************************************************/
#include    "config.h"
#define     LED1CON    0x00000400      /*LED(DS11)控制,低电平点亮,用于通信指示*/
/*定义Fpclk值,用于设置串口波特率*/
#define    FPCLK      2764800L
/*定义串口模式设置数据结构*/
typedef  struct UartMode
{ uint8 datab;                    //字长度,5/6/7/8
  uint8 stopb;                    //停止位,1/2
  uint8 parity;                   //奇偶校验位,0为无校验,1为奇数校验,2位偶数校验
} UARTMODE;

uint8 rcv_buf[8];                //UART0数据接收缓冲区
uint8 rcv_new;                    //接收新数据标志

/*******************************************************************************
*名称: IRQ_UART0(void)
*功能: 串口UART0接收中断
*******************************************************************************/
void __irq IRQ_UART0(void)
{ uint32 i;
  
  i=IOSET;                        //读取当前LED控制值
  if((i&LED1CON)==0)              //控制LED输出
  {  IOSET=LED1CON;
  }
  else
  {  IOCLR=LED1CON;
  }
  if(0x04==(U0IIR&0x0F))rcv_new=1;    //设置接收到新的数据标志
  for(i=0;i<7;i++)
  { rcv_buf[i]=U0RBR;                 //读取FIFO的数据,并清除中断标志
  }
  VICVectAddr=0x00;                   //中断处理结束
}
/*******************************************************************************
*名称: SendByte()
*功能: 向串口发送字节数据
*入口参数:data       要发送的数据
*******************************************************************************/
void SendByte(uint8 data)
{ U0THR=data;
while((U0LSR&0x20)==0);       //等待数据发送
}
/*******************************************************************************
*名称: ISendBuf()
*功能: 将缓冲区的数据发送回主机,并等待发送完毕
*******************************************************************************/
void ISendBuf(void)
{ uint8  i;
  for(i=0;i<7;i++)SendByte(rcv_buf[i]);
 while((U0LSR&0x20)==0);               //等待数据发送
}
/*******************************************************************************
*名称: UART0_Ini()
*功能: 初始化串口0. 设置其工作模式及波特率
*入口参数: baud      波特率
           set       模式设置 (UARTMODE数据结构)
*出口参数:返回值为1时表示初始化成功,为0表示参数出错
*******************************************************************************/
uint8 UART0_Ini(uint32 baud,UARTMODE set)
{ uint32  bak;

  /*参数过滤*/
  if((0==baud)||(baud>115200))return(0);
  if((set.datab<5)||(set.datab>8))return(0);
  if((0==set.stopb)||(set.stopb>2))return(0);
  if(set.parity>4)return(0);
  /*设置串口波特率*/
  U0LCR=0x80;                         //DLAB位置1
  bak=(FPCLK>>4)/baud;
  U0DLM=bak>>8;
  U0DLL=bak&0xff;
  /*设置串口模式*/
  bak=set.datab-5;                    //设置字长度
  if(2==set.stopb)bak|=0x04;          //判断是否为2位停止位
  if(0!=set.parity){set.parity=set.parity-1;bak|=0x08;}
  bak|=set.parity<<4;                 //设置奇偶校验
  U0LCR=bak;
 return(1);
}
/*******************************************************************************
*名称: main()
*功能: 初始化串口,并等待接收到串口数据
*******************************************************************************/
int main(void)
{  UARTMODE  uart0_set;
   
   PINSEL0=0x00000005;              //设置I/O连接到UART0
   PINSEL1=0x00000000;
   IODIR=LED1CON;                   //设置LED控制口为输出,其它I/O为输入
   rcv_new=0;
   uart0_set.datab=8;               //8位数据位
   uart0_set.stopb=1;               //1位停止位
   uart0_set.parity=0;              //无奇偶校验位
   UART0_Ini(9600,uart0_set);       //初始化串口模式
   U0FCR=0x81;                      //使能FIFO,并设置触发点为8字节
   U0IER=0x01;                         //允许RBR中断,即接收中断
   /*设置中断允许*/
   VICIntSelect=0x00000000;         //设置所有通道为IRQ中断
   VICVectCntl0=0x26;               //UART0中断通道分配到IRQ Slot0,即优先级最高
   VICVectAddr0=(int)IRQ_UART0;     //设置UART0向量地址
   VICIntEnable=0x00000040;         //使能UART0中断
       while(1)                         //等待中断
   {
   if(1==rcv_new)
     { 
     ISendBuf();                    //将接收到的数据发送回主机
     rcv_new=0;
     }     
   }
     
   return(0);
}
   
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -