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

📄 main.c

📁 Proteus在MCS-51%26ARM7系统中的应用百例 Proteus在MCS-51%26ARM7系统中的应用百例
💻 C
字号:
/*******************************************************************************
*File: main.c
*功能: 运行RTC进行计时,并将所计时间值不断地通过串口向上位机发送
*******************************************************************************/
#include "config.h"
#define   LED1CON   0x00000400           /*P0.10口为LED1控制端*/
/* 定义Fpclk值,用于设置串口波特率*/
#define FPCLK 2764800L
/*定义串口模式设置数据结构*/
typedef struct UartMode
{ uint8 datab;                //字长度,5/6/7/8
  uint8 stopb;                //停止位,1/2
  uint8 parity;               //奇偶校验位,0为无校验,1为奇数校验,2为偶数校验
} UARTMODE;

uint8 send_buf[16];           //UART0数据接收缓冲区
/*******************************************************************************
*名称: 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);
}

/*******************************************************************************
*名称: SendByte()
*功能: 向串口发送字节数据,并等待发送完毕
*******************************************************************************/
void SendByte(uint8 data)
{ U0THR=data;                   //发送数据
  while((U0LSR&0x20)==0);       //等待数据发送
}

/*******************************************************************************
*名称: ISendBuf()
*功能:将缓冲区的数据发送回主机
*入口参数: buf 数据缓冲区
*          no  发送数据的个数
*出口参数: 无
*******************************************************************************/
void ISendBuf(uint8 const *buf,uint8 no)
{ uint8 i;
  for(i=0;i<no;i++)SendByte(buf[i]);
}

/*******************************************************************************
*名称: SendTimeRtc()
*功能: 读取RTC的时间值,并将读出的时分秒值由串口发送到上位机显示
*******************************************************************************/
void SendTimeRtc(void)
{ uint8 const MESSAGE[]="RTC Time is:";
  uint32 times;
  uint8 bak;
  times=CTIME0;                  //读取完整时钟寄存器0
  bak=(times>>16)&0x1F;          //取得时的值
  send_buf[0]=bak/10+'0';
  send_buf[1]=bak%10+'0';
  send_buf[2]=':';
  bak=(times>>8)&0x3F;           //取得分的值
  send_buf[3]=bak/10+'0';
  send_buf[4]=bak%10+'0';
  send_buf[5]=':';
  bak=times&0x3F;                //取得秒的值
  send_buf[6]=bak/10+'0';
  send_buf[7]=bak%10+'0';
  send_buf[8]='\n';
  ISendBuf(MESSAGE,14);          //发送数据
  ISendBuf(send_buf,9);
}

/*******************************************************************************
*名称: RTCIni()
*功能: 初始化实时时钟
*******************************************************************************/
void RTCIni(void)
{ PREINT=FPCLK/32768-1;           //设置预分频器
  PREFRAC=FPCLK-(FPCLK/32768)*32768;
  YEAR=2005;                      //初始化年
  MONTH=6;                        //初始化月
  DOM=10;                         //初始化日
  HOUR=8;
  MIN=30;
  SEC=0;
  CIIR=0x01;                      //设置秒值的增量产生一次中断
  CCR=0x01;                       //启动RTC
}
/*******************************************************************************
*名称: main()
*功能: 读取实时时钟的值,并从串口发送出去
*******************************************************************************/
int main(void)
{ UARTMODE uart0_set;
  PINSEL0=0x00000005;         //设置I/O连接到UART0
  PINSEL1=0x00000000;
  IODIR=LED1CON;              //设置LED1控制口为输出,其它I/O为输入
  uart0_set.datab=8;          //8位数据位
  uart0_set.stopb=1;          //1位停止位
  uart0_set.parity=0;         //无奇偶校验位
  UART0_Ini(9600,uart0_set);  //初始化串口模式
  U0FCR=0x01;                 //使能FIFO
  RTCIni();                   //初始化RTC
  while(1)
  { IOSET=LED1CON;            //熄灭LED
    while(0==(ILR&0x01));     //等待RTC增量中断标志位
    ILR=0x01;                 //清除中断标志位
    SendTimeRtc();            //读取时钟值,并向UART0发送
    IOCLR=LED1CON;            //点亮LED
    while(0==(ILR&0x01));
    ILR=0x01;
    SendTimeRtc();
  }
  return(0);
}

⌨️ 快捷键说明

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