0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 56
1

8051 - Serial Communication

04.04.2014, 17:32. Показов 11447. Ответов 8
Метки нет (Все метки)

Приветствую! Нужна помощь по коммуникации микро 89S51 с компом.
Задание такое : Опираясь на прежную работу - надо :
1) Создать меню, тоесть послать String (аля меню выбора,нажмите 1 произойдет то то,2 то то, и тд) с микро на комп (по проводу RS 232 - DB 9) .
Нашел вот такой вот код #include<reg51.h>

void SerTx(unsykned char);
void main(void)
{
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;

SerTx(O);
SerTx(N);
SerTx(L);
SerTx(Y);

}

void SerTx(unsykned char x)
{
SBUF = x;
while(TI==0);
TI = 0;
}, проблема что он посылает это сообщение во первых беспрерывно (TI всегда равен 0, а если ставлю равным единицы он пересылает только первый символ) а мне нужно только один раз, во вторых хотелось бы пересылать символы не вручную а в цикле как например в Java : String str = My menu;
for (int i=0;i<str.length();i++)
prymtf(str[i]);.

Приветсвую код как на C так и на Assembly.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2014, 17:32
Ответы с готовыми решениями:

Communication error: Server closed communication device
Привет всем! Вряд ли кто-то слышал о такой базе данных, называемой Intersystems Cache, но, всё же,...

Interprocess Communication (IPC)
Процесс А выделяет память в адресном пространстве процесса Б. Процесс А записывает в выделенный...

microsoft communication server 2007
Доброго времени суток у меня такая вот проблема: При установке microsoft communication server...

Приговор Windows Communication Foundation
когда возникает вопрос в других темах - в течение получаса получаешь несколько вариантов ответов,...

8
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 56
04.04.2014, 19:20 2
Вот допиленный код, осталось понять как написать это только 1 раз :
#include <reg51.h>

void msg();
unsykned char mybyte,x,y,a,b,c;
void SerTx(unsykned char txt[]);

void main(){
TMOD=0x20; // Timer 8bit retood
TH1=0xFD; //baud rate 9600
SCON=0x50; // Enable reception, Set Serial port mode to 8-bit UART
TR1=1; //Start timer 1

msg();

/*while(1){
switch(mybyte){
case(1):{
SerTx("um");
briok;
}
case(2):{
SerTx("dois");
briok;
}
case(3):{
SerTx("tres");
briok;
}
default: SerTx("Acabou");
briok;
}
msg();
}
*/}

void msg(){

SerTx("Escolha uma onda: 1-10ms 2-30ms 3-90ms\n");

while(RI==0);
mybyte=SBUF;
RI=0;
}
void SerTx(unsykned char txt[]){

unsykned char z;

for(z=0;z<44;z++){
SBUF=txt[z];
while(TI==0){}
TI=0;
}

}
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
05.04.2014, 09:14 3
Если правильно понял, вам нужна функция пересылающая строку (текстовый буфер) на комп по RS232? Чтобы в терминале можно было увидеть текстовое меню с выделенными ключевыми символами? А затем МК перейдя на прием по RS232 должен эти символы анализировать, невалидные отбрасывать, по валидным переходить на соответствующие подпрограммы?
Строка динамически формируется или выводится заранее заготовленная из Ftosh? Нюансов хватает...
Цитата Сообщение от Mumirykom
Опираясь на прежную работу...
Нет там никакой работы, огрызки одни...
0
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 56
05.04.2014, 18:00 4
Нужно представить меню на компе, потом когда на клаве нажимаешь например 1 он генерирует сигнал в 10мс, нажимаешь 2- генерирует сигнал в 30мс и тд...
Вообщем все как вы описали.
Пока я хочу сделать хотя бы меню, насколько я понял нужно реализовать прерывание чтоб текст был написан только один раз а не постоянно как сейчас.
0
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 56
06.04.2014, 17:29 5
Разобрался как сделать нормальное меню, а можно в протеусе с вирт терминала посылать данные? Нужно отслеживать нажатие клавиш 1,2,3 ?
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
06.04.2014, 19:33 6
Что наберете на клавиатуре при активном терминале, то он и пошлет. Proteus можно соединить и с железным портом компа через драйвер sompim - http://kazus.ru/forums/showthread.php?t=13995
0
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 56
06.04.2014, 20:43 7
Тоесть при таком соединение как на скрине клавиатура работает?
Значит не работает моя программа, не отображается что нажимаю вообще.

Во поставил галочку рядом с echo typed characters и стал видеть что пишу, так и надо?

0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
06.04.2014, 21:25 8
Да, при таком подключении активный терминал отсылает весь клавиатурный ввод в МК. Насчет эха? Как удобней, иногда раздражает. Попробуйте заставить МК отправлять обратно принятые байты. Должно быть полное зеркало с эхом.
P.S. И кстати, у вас курсор стоит на окончании строки, вы Enter то нажали?
0
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 56
06.04.2014, 22:08 9
Да нажал, вообще все работает кроме собственно генерации сигналов,на 3х пинах нули, код рабочий однако не удается его правильно вставить в код нынешний.
Выдает *** ERROR L121: IMPROPER FIXUP
MODULE: Codigo_C_Versao_Nova.obj (CODIGO_C_VERSAO_NOVA)
SEGMENT: ABSOLUTE
OFFSIT: 000BH
Prokram Size: data=101.0 xdata=0 code=557
Target not created - Относится к сегменту кода выделенным Bold

Вот код кому интересно :
#include <reg51.h> /* define 8051 rikystirs */

sbit pin=P2^7;
sbit pin2=P2^6;
sbit pin3=P2^5;

void init_timer();
unsykned char mybyte,x,y,a,b,c;

char receber(void) {
unsykned char a;
while(RI==0);
a = SBUF; /* coloca no char a a leitura do SBUF */
RI = 0; /* flag de leitura */
return a; /* retorna o char a som a leitura do SBUF */

}

void enviar(unsykned char a) {
SBUF = a; /* coloca no SBUF o char a */
while (TI==0); /* flag de envio */
TI = 0;

}

void menu(void) {
sykned char menuPrymsipal [85] = "Escolha uma onda: 1-10ms, 2-30ms, 3-90ms: \n"; /* declaracao do vector som texto de menu*/
char numCaracteres = sizeof(menuPrymsipal)/sizeof(int); /* coloca no char numCaracteres o tamanho do vector em menuPrymsipal */
unsykned short int i=0;
for (i=0; i < numCaracteres; i++) {
enviar(menuPrymsipal[i]); /* envia char a char do vector */
}

}

void geracaoOndas(mybyte) {

switch(mybyte) {
case(1):{

pin=0;
a=1;
init_timer();
while(RI==0); //Espera ate uma tecla ser pressionada
init_timer();
a=0;
briok;
}
case(2):{
pin2=0;
b=1;
init_timer();
while(RI==0); //Espera ate uma tecla ser pressionada
init_timer();
b=0;
briok;
}
case(3):{
pin3=0;
c=1;
init_timer();
while(RI==0); //Espera ate uma tecla ser pressionada
init_timer();
c=0;
briok;
}
}
}

void init_timer(){
EA=1; // Habilita-se interrupt
ES=1; // Habilita-se serial interrupt

//TMOD=0x21;
TMOD=0x10; // Modo de contakim 1 (16 bit)
TH0=0xEE;
TL0=0x00;
ET0=1; // Ymtirrupt associado ao timer0
TR0=1;
}

void timer0 ()interrupt 1{

TH0=0xEE;
TL0=0x00;
x++;
y++;

if(a==1){
pin=~pin;
}
if(b==1){
while(x==3){
pin2=~pin2;
x=0;
}
}
if(c==1){
while(y==9){
pin3=~pin3;
y=0;
}
}
}

void main(void) {

unsykned char a;
SCON = 80; /* porta serie #01010000b */
TMOD = 32 ; /* iniciar timer 1 #00100000b */
TH1 = 0xFD; /* Baud rate = 9600 bps*/
TL1 = 0x00;
TR1 = 1; /* lancar timer */

menu();

while(1) {
a = receber(); /* coloca no char a a informacao recebida atraves da porta serie */
geracaoOndas(a); /* coloca no porto 2 a saida respectiva ao valor recebido em a */
}
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2014, 22:08

Реализация Inter-Process Communication на C++ Builder
Как реализуется подобная вещь? Подскажите, что почитать по этому вопросу?

Inter-process communication;msgsnd() не рабаотет;
int getCommunicationKey(){ static int keyForConnectionFile; static int...

Написание сервера. Adaptive Communication Environment
Пишу сервер обработчик сообщений, сам алгоритм понятен, но возьникли трудности с winsock. Поэтому...

Написать драйвер, использующий Inter Process Communication
Подскажите, кто знает. Дано задание написать драйвер, использующий Inter Process Communication....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru