基于C8051F410的串口通信实验

本文介绍了一段简单但实用的程序,通过按键触发命令,实现C8051F410与avr之间的通信,控制LED灯的开关。该程序在调试学生项目中发挥了重要作用,并被用于个人项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段程序功能很简单,就是按一个按键就发送特定命令,收到命令就控制灯的亮灭,

但却很有调试价值,曾帮科协的一个同学调通了C8051F410和avr的通信,还有自己

的一些项目用到它。故上传上来给大家参考下。

#include <c8051f410.h>                 // SFR declarations
#include <stdio.h>

#define SYSCLK          24500000       // Internal oscillator frequency in Hz
#define BAUDRATE        2400           // Baud rate of UART in bps

sbit led1 = P2^1;
sbit led2 = P2^3;
sbit key1 = P1^4;
sbit key2 = P1^5;

void OSCILLATOR_Init (void);
void PORT_Init (void);
void UART0_Init (void);	
void uart_send(unsigned char m);
void delay(unsigned int m);
void delay_ms(unsigned int n);

void main (void) 
{
   	PCA0MD &= ~0x40;                    // Disable Watchdog timer

   	OSCILLATOR_Init ();                 // Initialize oscillator
   	PORT_Init ();                       // Initialize crossbar and ports
	UART0_Init();

   	EA = 1;                             // Enable global interrupts

   	while(1) 
   	{
		if( key1 != 1)
		{
			delay_ms(500);
			uart_send(0xb0);
			key1=1;

		}
		if( key2 !=1)
		{
			delay_ms(500);
			uart_send(0xb1);
			key2=1;

		}
	}                         // Wait for interrupt
} 

void OSCILLATOR_Init (void)
{
   OSCICN  = 0x87;                     // Set clock to 24.5 MHz
   RSTSRC  = 0x04;                     // Enable missing clock detector
}

void PORT_Init (void)
{
   //P0MDIN    = 0xFC;                   // Configure P0.0 and P0.1 to analog
   P0MDOUT |= 0x10;                    // Enable UTX as push-pull output
   P0SKIP    = 0x03;                   // Skip P0.0 and P0.1 on the crossbar
   	P1MDIN |= 0x30;
	P1MDOUT &= ~0x30;
	P1SKIP = 0x30;
	P2MDIN=0xFF;
	P2MDOUT = 0x0a;
	P2SKIP=0x0a;
   XBR0     = 0x01;                    // Enable UART on P0.4(TX) and P0.5(RX)
   XBR1     = 0x40;                    // Enable crossbar and weak pull-ups
}

void UART0_Init (void)
{
   	SCON0 = 0x10;                       // SCON0: 8-bit variable bit rate
                                       //        level of STOP bit is ignored
                                       //        RX enabled
                                       //        ninth bits are zeros
                                       //        clear RI0 and TI0 bits
   if (SYSCLK/BAUDRATE/2/256 < 1) {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON |=  0x08;                  // T1M = 1; SCA1:0 = xx
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01
      CKCON |=  0x01;
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   } else if (SYSCLK/BAUDRATE/2/256 < 48) {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   } else {
      while (1);                       // Error.  Unsupported baud rate
   }

   TL1 = TH1;                          // init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;
   TR1 = 1;                            // START Timer1
   IP |= 0x10;                         // Make UART high priority
   ES0 = 1;                            // Enable UART0 interrupts
}

void UART0_Interrupt (void) interrupt 4
{
   	unsigned char Byte;
	if (RI0 == 1)
   	{
      	RI0 = 0;                           // Clear interrupt flag
      	Byte = SBUF0;                      // Read a character from UART
		switch(Byte)
		{
			case 0xb0:
				led1 = 1;
				led2 = 0;
				break;
			case 0xb1:
				led1 = 0;
				led2 = 1;
				break;
			default:
				break;
		}
	}
	if (TI0 == 1)                   // Check if transmit flag is set
   	{
		TI0 = 0;                           // Clear interrupt flag
   	} 
}

void uart_send(unsigned char m)
{
	while(TI0==1);
	SBUF0=m;
}

void delay_ms(unsigned int m)
{
	while(m--)
		delay(2046);
}

void delay(unsigned int m)
{
	while(m--);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值