基于C8051F410的串口通信实验

来源:互联网 发布:c语言fclose 编辑:程序博客网 时间:2024/05/20 14:19

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

但却很有调试价值,曾帮科协的一个同学调通了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 bpssbit 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 portsUART0_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 UARTswitch(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--);}



原创粉丝点击