基于C8051F410的串口通信实验

发布者:茶叶侠最新更新时间:2022-04-13 来源: eefocus关键字:C8051F410  串口通信 手机看文章 扫描二维码
随时随地手机看文章

这段程序功能很简单,就是按一个按键就发送特定命令,收到命令就控制灯的亮灭,但却很有调试价值,曾帮科协的一个同学调通了C8051F410和avr的通信,还有自己的一些项目用到它。故上传上来给大家参考下。


#include                  // SFR declarations

#include

 

#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--);

}

关键字:C8051F410  串口通信 引用地址:基于C8051F410的串口通信实验

上一篇:8051与ESP32 CAM串行通讯
下一篇:基于C8051F410的波形发生器设计

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved