这段程序功能很简单,就是按一个按键就发送特定命令,收到命令就控制灯的亮灭,
但却很有调试价值,曾帮科协的一个同学调通了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--);
}