Пример UART для MCU STC

    Пример программы использования UART интерфейса в микроконтроллерах STC MCU, взят из заводского описания для STC89C51-52 (datasheet). Мне пришлось попотеть что бы заставить Keill работать с этим кодом.
 1. Открываем Keill и создаём новый проект Projekt -> New mVision Projekt…
 2. Называем его, например proba_uart

3. Выбираем базу микроконтроллеров «STC»

4. Выбираем микроконтроллер STC89C52

5. Соглашаемся

6. Правой кнопкой мыши кликаем по Source Group 1 -> Add New item to Group «Source Group 1″…

7. Выбираем язык программирования (я выбрал С)

8. Получаем чистый лист, в который и будем писать свою программу.

Вам можно просто скопировать этот код 

/* — STC MCU International Limited */
/* — STC89-90xx Series MCU UART (8-bit/9-bit)Demo */
/* — Mobile: (86)13922809991 */
/* — Fax: 86-755-82944243 */
/* — Tel: 86-755-82948412 */
/* — Web: www.STCMCU.com */
/* ???? ?? ?????? ???????????? ????????? ??? progr am, ?? ??????? ????????? ?????? * / / *, ???????, ? ????? ?????? ? ?????????? ?? STC
*/
/* */
#include <REG52.H>
#include <INTRINS.H>
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 6000000L
#define BAUD 9600 //System frequency //UART baudrate
/*Defme UART parity mode*/
#define NONE_PARITY 0
#define ODD_PARITY 1
#define EVEN_PARITY 2
#define MARK_PARITY 3
#define SPACE_PARITY 4
#define PARITYBIT EVEN_PARITY
//None parity //Odd parity //Even parity //Mark parity //Space parity
//Testing even parity
sbit bit9 = P2^2; //P2.2 show UART data bit9
bit busy;
void SendData(BYTE dat); void SendString(char *s);
void main( )
{
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9-bit vaiiable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9-bit variable UART, parity bit initial to 0
#endif

TMOD = 0x20; //Set Timerl as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
TR1 = 1; //Timerl stall run
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
SendString(«Hello STC89C52RC\r\nUart Test !\r\n»);
while(1);
}
/*
UART interrupt service routine
*/
void Uait_Isr() interrupt 4 using 1
{
if(RI)
{
RI = 0; //Clear receive interrupt flag
P0 = SBUF; //P0 show UART data
bit9 = RB8; //P2.2 show parity bit
}
if (T0)
{
TI = 0; busy = 0;
}
}
/*
???????? ?????? ????? ? UART Input: dat (??????, ??????? ?????????? ?????????)
?????: ???
*/
void SendData(BYTE dat)
{
while (busy);
ACC = dat;
if (P)
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 0;
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 1;
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 1; //Set parity bit to 1
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 0; //Set parity bit to 0
#endif
}
busy = 1;
SBUF = ACC; //Send data to UART buffer
}
/*
Send a string to UART Input: s (address of string)
Output :None
*/
void SendString(char *s)
{
while (*s) //Cheek the end of the string
{
SendData(*s++); //Send current char and increment string ptr
}
}

и вставить в окно программы.

9. Открываем настройки

10. Выбираем рабочую частоту микроконтроллера (у меня 6 МГц, а можно до 45 МГц!!)

11. Ставим галочку для выбора выходного файла hex

12. Нажимаем ОК, и компилируем наш код, hex файл находиться в папке проекта

Проверить, что получилось можно в симуляторе Proteus

Теперь поговорим как полученный hex прошить в реальный микроконтроллер.

Прошивать микроконтроллеры STC MCU  можно простым преобразователем USB-UART, но я нашел на просторах интернета схемку с применением Ардуино (использовал АрдуиноНано).

Питание программатора происходит от USB-разъема. В Ардуину заливаем следующий

:

void setup() {
pinMode(13, OUTPUT); // LED on UNO board
pinMode(A2, OUTPUT); // GND output to POV
pinMode(A3, OUTPUT); // connected to RxD/P3.0 on POV
pinMode(A4, INPUT_PULLUP); // connected to TxD/P3.1 on POV
pinMode(A5, OUTPUT); // outputs +5V to power POV
pinMode(0, INPUT); // RX input on UNO
pinMode(1, OUTPUT); // TX output on UNO
digitalWrite(A2, LOW); // GND output to POV is low
digitalWrite(A5, LOW); // +5V output to POV also low (powered off) for now
}

void loop() {
uint32_t powerOnTillMillis = 0UL; //
if (!digitalRead(0)) { // PC is writing to serial port
digitalWrite(A5, HIGH); // power up POV board
digitalWrite(13, HIGH); // switch on UNO LED to indicate power is on
powerOnTillMillis = millis() + 20000UL; // keep it powered up for twenty seconds
}

while (millis() < powerOnTillMillis) { // for the duration of the powered-up time
digitalWrite(A3, digitalRead(0)); // copy serial output of PC to POV
digitalWrite(1, digitalRead(A4)); // copy serial output of POV back to PC
}

digitalWrite(A5, LOW); // POV board can now be powered down
if (millis() >= powerOnTillMillis) { // while the POV is not powered up
digitalWrite(13, millis() % 1000UL > 500UL); // blink the UNO LED on and off to indicate ‘ready’
}
}


Теперь скачаем утилиту с сайта производителя MCU STC. Открываем и видим интерфейс программы:

Подключаем наш программатор к USB компьютера (в поле COM Port увидим наше подключение). Нажимаем кнопку OpenCodeFile  и открываем наш hex. Жмем Download/Program  и наблюдаем как прошивается наш микроконтроллер.

 

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *