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

📄 c8051f330.c

📁 C8051F310单片机与计算机的串口通信的例程
💻 C
字号:
#include <C8051F330.h>

//sfr16 TMR3RL = 0x92;                        //定时器3重装载寄存器
//sfr16 TMR3 = 0x94;                          //定时器3计数器

#define uchar unsigned char
#define uint unsigned int


//----------------------------------------------------------------------
//参数设置区
//----------------------------------------------------------------------
#define BAUDRATE 9600                              //波特率bps
#define CLKOUT 11059200                 //外部晶振,修改也要修改OSCXCN
#define SMODVAL 0                                   //SMOD的值,修改请也修改PCONVAL
#define PCONVAL 0x00                                //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1
#define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384)        //定时器初值
#define MAX_LEN 10                               //每次接收/发送字符串的长度

//---------------------------------------------------------------------
//全局变量
//---------------------------------------------------------------------
sbit LED = P0^6;                             //LED \'1\'亮 \'0\'灭
bit  readFlag = 0;                           //读标志
uchar readCounts = 0;                        //已经读取的字符个数,与MAX_LEN比较
uchar checksum;
uchar count3 ;

uchar idata trdata[MAX_LEN];                 //要接收/发送的字符串
uint k;
//----------------------------------------------------------------------
//子函数声明
//----------------------------------------------------------------------
void SYSCLK_Init(void);                      //系统时钟初始化
void PORT_Init(void);                        //端口初始化
void UART0_Init(void);                       //串口UART0初始化
void Send_Char(uchar ch);                    //发送单个字符
void Send_String(uchar * str, uint len);     //发送一个字符串
void UART0_ISR();                            //串口中断服务程序,接收字符

//----------------------------------------------------------------------
//主函数
//----------------------------------------------------------------------
void main(void)
{

   PCA0MD &= ~0x40;                          //禁止看门狗
   SYSCLK_Init();                            //时钟初始化
   PORT_Init();                              //端口初始化
   UART0_Init();                             //串口初始化                                           
   EA = 1;                                   //开全局中断
   while(1)
   {
      if(readFlag)                           //已经读取
      {
       readFlag = 0;                         //清零
       Send_String(trdata,MAX_LEN);          //发送字符串
      }
   }
}

//----------------------------------------------------------------------
//子函数具体实现
//----------------------------------------------------------------------

//系统时钟初始化
/*void SYSCLK_Init (void)
{
   OSCICN |= 0x03;                     // 配置内部振荡器的的最大频率
                                       
   RSTSRC  = 0x04;                     // 使能始终丢失检测寄存器

}*/
//系统时钟初始化
void SYSCLK_Init(void)
{
   uint i;
   OSCXCN = 0x67;                            //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111
   for(i=0;i<256;i++);                       //等待>1ms
   while(!(OSCXCN&0x80));
                                              //查询直到XTLVLD=1,晶振稳定
   OSCICN = 0x88;                            //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000
}

/*void SYSCLK_Init(void)
{
  OSCICN    = 0x83;
}*/

//端口初始化
void PORT_Init(void)
{
   P0SKIP  = 0x0C;
   XBR0 = 0x01;                             //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100
   XBR1 = 0x40;
   P0MDOUT |= 0x10;
}

//串口初始化
void UART0_Init(void)

{
   CKCON = 0x00;
   SCON0 = 0x50;
   TCON = 0x40;                          
   TMOD = 0x20;                             //选择T1,方式2,自动再装入8位计数器
   TH1 = (int)TXVAL;
   TL1 = (int)TXVAL;
  // IE|=0x10;
  // IP|=0x10;
  // RI0=0;                      
  
   ES0 = 1;                                 //UART0中断开启
   TR1 = 1;                                 //启动定时器T1
   PCON |= PCONVAL;                         //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1
   TI0 = 1;                                 //声明TX0就绪,可以发送
   TR0 = 1;

}

 

//发送单个字符
void Send_Char(uchar ch)
{
   
 SBUF0 = ch;                             //送入缓冲区
 while(TI0 == 0);                        //等待发送完毕
 TI0 = 0;                                //软件清零

}

//发送字符串,调用Send_Char() len字符串长度
void Send_String(uchar * str,uint len)
{
    uint k = 0;
    do
    {
        Send_Char(*(str + k));
        k++;
    } while(k < len);
 
}


//UART0中断服务程序. 接收字符
void UART0_ISR(void) interrupt 4 using 1
{
   uchar rxch;
   if(RI0)                                   //中断标志 RI0=1 数据完整接收
   {
     RI0 = 0;                              //软件清零
     rxch = SBUF0;                         //读缓冲
   if(readCounts>=MAX_LEN)
    {
      readCounts = 0;
      readFlag = 1;
    }
  
    trdata[readCounts] = rxch;          //存入数组,供发送
    readCounts++;
 }
}
/*void serial () interrupt 4 using 1
{   if (RI0)
   {
   unsigned char ch;
        RI0 = 0;
        ch=SBUF0;
        if(ch>127)
        {
             count3=0;
             trdata[count3]=ch;
             checksum= ch-128;
        }
        else
        {
             count3++;
             trdata[count3]=ch;
             checksum ^= ch;
   
             if( (count3==(MAX_LEN-1)) && (!checksum) )
             {
                 readFlag=1;  //如果串口接收的数据达到INBUF_LEN个,且校验没错,
                               //就置位取数标志
             }
        }
    }
}*/

⌨️ 快捷键说明

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