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

📄 uart0.c

📁 C8051F020单片机用UART0实现RS-232通信
💻 C
字号:
//-----------------------------------------------------------------------------
// WUART0.c
//-----------------------------------------------------------------------------
//
// 作者: daqian
// DATE: 2007年12月7号
//
// Target: C8051F02x
// Tool chain: KEIL C51
//
// 描述:
//    用UART0实现RS-232通信,运行前将TX0和P0.0短接,将RXD和P0.1短接,当接收到一个
//    数据后,再将接收到的数据送出。
//
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------

#include <c8051f020.h>              // SFR声明
#include <intrins.h>

//-----------------------------------------------------------------------------
// C8051F02X的16位SFR定义
//-----------------------------------------------------------------------------

sfr16 DP       = 0x82;              // 数据指针寄存器
sfr16 TMR3RL   = 0x92;              // Timer3 重加载寄存器
sfr16 TMR3     = 0x94;              // Timer3 寄存器
sfr16 ADC0     = 0xbe;              // ADC0 转换结果寄存器
sfr16 ADC0GT   = 0xc4;              // ADC0 下限寄存器
sfr16 ADC0LT   = 0xc6;              // ADC0 上限寄存器
sfr16 RCAP2    = 0xca;              // Timer2 捕捉寄存器
sfr16 T2       = 0xcc;              // Timer2 寄存器
sfr16 RCAP4    = 0xe4;              // Timer4 捕捉寄存器
sfr16 T4       = 0xf4;              // Timer4 寄存器
sfr16 DAC0     = 0xd2;              // DAC0 数据寄存器
sfr16 DAC1     = 0xd5;              // DAC1 数据寄存器

//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------

#define SYSCLK          22118400          // SYSCLK frequency in Hz
#define BAUDRATE        9600              // Baud rate of UART in bps
bit ReceiveBit;                           // 接受标志位
unsigned char temp;

//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------


sbit button = P0^5;
sbit b0=P1^0;
sbit light7=P2^7;
sbit light6=P2^6;
sbit light5=P2^5;
sbit light4=P2^4;
sbit light3=P2^3;
sbit light2=P2^2;
sbit light1=P2^1;
sbit light0=P2^0;



void main (void);
void SYSCLK_Init (void);              
void PORT_Init (void);
void UART0_Init (void);
void UART0_ISR (void);
void delay (unsigned int x);//unsigned int m

//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------

void main (void) 
{ 
    char bdata i;
    WDTCN = 0xde;                    // 禁止看门狗定时器
    WDTCN = 0xad;
	ReceiveBit = 1;
    SYSCLK_Init ();
	PORT_Init ();
    UART0_Init ();
    EA = 1;                          // 允许全局变量
    ES0 = 1;
//	T1M=0;                           //系统时钟12分频,兼容51
	temp = 0x22;
	light7 = 0;
	delay(100000);
	light6 = 0;
	delay(100000);
	light5 = 0;
	delay(100000);
	light4 = 0;
	delay(100000);
	light3 = 0;
	delay(100000);
	light2 = 0;
	delay(100000);
	light1 = 0;
	delay(100000);
	light0 = 0;
	delay(100000);

	while(1)
	{                                // 是否接收到一个数据
//       if(button==0)
	   {
/*       b0=1;
	   delay (6000000);                // 延时
	   b0=0;
	   delay (6000000);*/
//       if(ReceiveBit) 
	   {
	       SBUF0 = temp;                 // 将接收到的数据送出
	       while(TI0 == 0);// 发送标志位是否产生
	       TI0 = 0;// 清发送标志位
//		   ReceiveBit=0;
	   }
	   }

	}
	_nop_();

}


//-----------------------------------------------------------------------------
// 初始化程序
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
//
// 该程序初始化系统时钟,使用11.0592MHz的晶振作为时钟源
//
void SYSCLK_Init (void)
{
   int i;                           // 延时计数器

   OSCXCN = 0x67;                   // 启动外部振荡器使用
                                    // 11.0592MHz 的晶体

   for (i=0; i < 256; i++) ;        // 等待振荡器起振
 
   while (!(OSCXCN & 0x80)) ;       // 等待晶体振荡器稳定

   OSCICN = 0x88;                   // 选择外部振荡器作为系统时钟源并允许时钟丢失检测器
                                    

}

//-----------------------------------------------------------------------------
// IO口初始化
//-----------------------------------------------------------------------------
//
// 配置交叉开关和GPIO端口
//
void PORT_Init (void)
{
   XBR0     = 0x04;                 // 允许UART0
   XBR1     = 0x00;
   XBR2     = 0x40;                 // 允许交叉开关和弱上拉
   P0MDOUT |= 0x01;                 // 使能TX0作为推拉输出
   P1MDOUT |= 0x40;                 // 允许P1.6(LED)为推挽输出
}

//-----------------------------------------------------------------------------
// UART0_Init(串口通信扩展用)
//-----------------------------------------------------------------------------
//
// 配置UART0使用Timer1, 波特率为<baudrate>,桢格式为8-N-1.
//
void UART0_Init (void)
{
   SCON0   = 0x50;                  // SCON0: mode 1, 8-bit UART, enable RX
   TMOD    = 0x20;                  // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = 244;  // set Timer1 reload value for baudrate:-(SYSCLK/BAUDRATE/16)
   TL1    = TH1;
   TR1    = 1;                      // start Timer1
//   CKCON |= 0x10;                   // Timer1 uses SYSCLK as time base
   PCON  |= 0x80;                   // SMOD0 = 1
   //TI0    = 1;                      // Indicate TX0 ready
}

//-----------------------------------------------------------------------------
// UART0_ISR(串口中断0子程序)
//-----------------------------------------------------------------------------
//
void UART0_ISR (void) interrupt 4
{
    if(RI0)// 是发送中断还是接收中断
	{
      RI0 = 0;// 清接收标志位
      temp = SBUF0; // 保存接收到的数据
      ReceiveBit = 1;                 // 置接收标志
	delay(200);

	}
}


void delay(unsigned int x)
{
	int i;
	for(i=0;i<=x;i++);
}

⌨️ 快捷键说明

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