Прием и передача данных по UART

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
HeyHey
Родился
Сообщения: 2
Зарегистрирован: Вт сен 01, 2015 15:10:11

Прием и передача данных по UART

Сообщение HeyHey »

Начинаю изучать программирование микроконтроллеров. Помогите написать программу на С для микроконтроллера Silabs с8051f320, которая будет отправлять по UART 8 байт случайных данных и обратно принимать их в ПК. Через прерывания. 1 стоп-бит, бит паритета - четный.

#include "C8051F320.h"
#include <stdio.h>

#define BAUDRATE 9600 // Baud rate of UART
#define SYSTEMCLOCK 12000000 // SYSCLK frequency in Hz
#define UART_BUFFERSIZE 64

unsigned char UART_Buffer[UART_BUFFERSIZE];
unsigned char UART_Buffer_Size = 0;
unsigned char UART_Input_First = 0;
unsigned char UART_Output_First = 0;
unsigned char TX_Ready =1;
static char Byte;
sbit LED1 = P2^2; // LED1
sbit LED2 = P2^3; //LED2

void main (void)
{
unsigned char inputcharacter;
PCA0MD &= ~0x40; // WDTE = 0
EA = 1;

while(1)
{
if(TX_Ready == 1 && UART_Buffer_Size != 0 && Byte == 13)
// If the complete word has been entered via the hyperterminal followed by
// carriage return
{
TX_Ready = 0; // Set the flag to zero
TI0 = 1; // Set transmit flag to 1


printf ("\nEnter character: ");
inputcharacter = getchar ();
printf ("\nCharacter entered : %c",inputcharacter);
printf ("\n Value in Hex: %bx",inputcharacter);

}
}
}


void Timer_Init()
{
TCON = 0x40; //enable timer 1
TMOD = 0x20; //timer 1 in 8-bit autoreload
CKCON = 0x08;
TH1 = 0xF9; //249
}

void UART_Init()
{
SCON0 = 0x90;
}

void Port_IO_Init()
{
P0MDOUT = 0x10;
P2MDOUT = 0x0C;
XBR0 = 0x01;
XBR1 = 0x40;
}

void Oscillator_Init()
{
OSCICN = 0x83;
}

void Interrupts_Init()
{
IE = 0x90;
}
void UART0_Interrupt (void) interrupt 4
{
if (RI0 == 1)
{
if( UART_Buffer_Size == 0) { // If new word is entered
UART_Input_First = 0; }

RI0 = 0; // Clear interrupt flag

Byte = SBUF0; // Read a character from UART
LED1 = 1;
LED2 = 1;
if (UART_Buffer_Size < UART_BUFFERSIZE)
{
UART_Buffer[UART_Input_First] = Byte; // Store in array

UART_Buffer_Size++; // Update array's size

UART_Input_First++; // Update counter
}
}

if (TI0 == 1) // Check if transmit flag is set
{
TI0 = 0; // Clear interrupt flag

if (UART_Buffer_Size != 1) // If buffer not empty
{
// If a new word is being output
if ( UART_Buffer_Size == UART_Input_First ) {
UART_Output_First = 0; }

// Store a character in the variable byte
Byte = UART_Buffer[UART_Output_First];

if ((Byte >= 0x61) && (Byte <= 0x7A)) { // If upper case letter
Byte -= 32; }

SBUF0 = Byte; // Transmit to Hyperterminal

UART_Output_First++; // Update counter

UART_Buffer_Size--; // Decrease array size

}
else
{
UART_Buffer_Size = 0; // Set the array size to 0
TX_Ready = 1; // Indicate transmission complete
}
}
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
Timer_Init();
UART_Init();
Port_IO_Init();
Oscillator_Init();
Interrupts_Init();
}
Реклама
Ответить

Вернуться в «Разные вопросы по МК»