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

📄 c8051f330串口通信_3.0625mhz.txt

📁 实用C8051F330为微控制器的串口通信程序
💻 TXT
字号:
//-------------------------------------------------------------------
//串口编程--接收pc发过来的字符串,回发字符串.发送期间中断控制led灯闪烁
//采用外部晶振11.0592Mhz使用定时器1,方式2产生波特率,smod = 0或者1
//定时器初值x=256-sysclk*(smod+1)/(baudrate*384)
//-------------------------------------------------------------------
#include <c8051f330.h>
 
#define uchar unsigned char
#define uint unsigned int

//-------------------------------------------------------------------
//参数设置区
//-------------------------------------------------------------------
#define max_len 10                     //每次接收/发送字符串的长度

//------------------------------------------------------------------
//全局变量
//------------------------------------------------------------------
bit   readflag = 0;                 //读标志
uchar readcounts = 0;               //已经读取的字符个数,与max_len比较
uchar idata trdata[max_len];        //要接收/发送的字符串

void Timer_Init()
{
       TCON      = 0x40;
    TMOD      = 0x20;
    CKCON     = 0x08;
    TL1       = 0x60;
    TH1       = 0x60;
}

void UART_Init()
{
    SCON0     = 0x10;
}

void Port_IO_Init()
{
    XBR0      = 0x01;
    XBR1      = 0x40;
}

void Oscillator_Init()
{
    OSCICN    = 0x80;
}

void Interrupts_Init()
{
     IE        = 0x90;
}

void Init_Device(void)
{
    Timer_Init();
    UART_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}

//发送单个字符
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 3
{
    uchar rxch;
    if(RI0==1)                                    //中断标志 ri0=1 数据完整接收
    {
        RI0 = 0;                               //软件清零
     	rxch = SBUF0;                          //读缓冲
	    if(readcounts>=max_len) 
	    {
	        readcounts = 0;
	     	readflag = 1;
	    }
	   trdata[readcounts] = rxch;              //存入数组,供发送
	   readcounts++;
    }
}
//----------------------------------------------------------------------
//主函数
//----------------------------------------------------------------------
void main(void)
{uint i;
 	PCA0MD &= ~0x40;			//	Disable Watchdog timer
	Init_Device();
    while(1)
    {  
	//send_char_com(0x10);
       if(readflag)                            //已经读取
       {
          readflag = 0;   //清零
		  for(i=0;i<2500;i++);  
		  	for(i=0;i<2500;i++);                   
          send_string(trdata,max_len);        //发送字符串
       }
    }
}

⌨️ 快捷键说明

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