цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Программируемый генератор последовательности битов своими руками

Программируемый генератор последовательности битов своими руками

Автор: Mike(admin) от 3-01-2017, 19:05

В некоторых случаях при тестировании цифровых приборов и оборудования необходимо формировать определенные комбинации битов, чтобы подавать их на вход цифровой системы и смотреть, как она себя при этом ведет.


Программируемый генератор последовательности битов своими руками

Данный проект позволяет самостоятельно создать генератор на основе микроконтроллера AT89C51 для формирования определенных битовых последовательностей.


На рисунке ниже изображен пример битовой комбинации, состоящей из восьми битов 10110101. По своей сути она представляет собой последовательность импульсов (логических единиц) и промежутков, где они отсутствуют (логических нулей). Также в начале этой восьмибитовой последовательности добавляется старт-бит (10), а в конце стоп-бит (1010). Помимо этого, время одного бита можно задавать в диапазоне от 100 мкс до 1мс. Ниже показана схема генератора битовой комбинации на базе микроконтроллера AT89C51.


Программируемый генератор последовательности битов своими руками

Устройство оснащено пятикнопочной клавиатурой для задания желаемой последовательности битов и изменения периода одного бита, которые также отображаются на символьном ЖК-дисплее. Кнопка 1 на клавиатуре устанавливает логическую единицу, кнопка 2 устанавливает логический ноль, с помощью кнопки 3 можно увеличивать период бита, а кнопкой 4 уменьшать его. Кнопка 5 действует как ввод. Также в схеме присутствуют три индикаторных светодиода. Красный светодиод загорается, когда вводится лог. 1, зеленый светодиод загорается, когда вводится лог. 0, а синий светодиод загорается, когда завершается формирование восьмибитной последовательности. Ниже приведен код функционирования программируемого генератора последовательности битов на основе микроконтроллера AT89C51.



#include<reg51.h>                        // заголовочный файл

#include <string.h>

 

#define lcd_data_bus P0                  // порт 0 для передачи данных на ЖК-дисплей

 

sbit rs = P2^7;                          // установка линий порта

sbit en = P2^6;

sbit led = P2^0;

sbit led1 = P2^1;

sbit led2 = P2^2;

sbit op = P2^3;

 

unsigned int byte[8],time=1,p=0,q=0;

 

void lcddly()                            // задержка для периода занятости ЖК-дисплея

 {

       int x;

       for(x=0;x<1500;x++);

 }

void lcd_send_cmd(unsigned char a) // отправка команды на дисплей

  {

       lcddly();

       rs = 0;

       lcd_data_bus = a;

       en = 1;

       en = 0;

  }

void lcd_send_data(unsigned char b)      // отправка данных на дисплей

  {

       lcddly();

       rs = 1;

       lcd_data_bus = b;

       en = 1;

    en = 0;

  }

void lcd_print(unsigned char *s)         // вывод сообщения на дисплее

  {

       unsigned char l,i;

       l = strlen(s);

       for(i=1;i<=l;i++)

         {

              lcd_send_data(*s);

              s++; 

         }

  }

void dly()                               // задержка против дребезга контактов

  {

    int a,b;                 

    for(b=0;b<20;b++)                   

         for(a=0;a<2000;a++);    

  }

void timedly(int t)                      // задержка для битового периода

  {

    int a;

    TR0=1;

    for(a=0;a<t;a++)

     {

       while(TF0==0);

       TF0=0;

      }

     TR0=0;

  }

void delay()                              // задержка для старт-бита и стоп-бита

  {

       TR1=1;

       while(TF1==0);

       TF1=0;

       TR1=0;

  }                                        

void generate_bit_pattern()       // генерирование битовой последовательности

  {

       int x=0;

       op=1;                             // старт-бит 10

       delay();

       op=0;

       delay();

       for(x=0;x<8;x++)                  // генерирование 8-битовой последовательности

          {

              if(byte[x]==1) op=1; // если бит = 1, то на выходе 1

              else op=0;                 // иначе на выходе 0

              timedly(time);             // задержка для битового периода

          }

       op=1;                             // стоповый бит 1010

       delay();

       op=0;

       delay();

       op=1;

       delay();

       op=0;

       led=1;

       lcd_send_cmd(0x01);               // отображение сообщения

       lcd_print("pattrn generated");

       lcd_send_cmd(0xC0);

       lcd_print("press Reset");

  }

void inc_time_delay()                    // увеличение битового периода

  {

       char w;

       if(time<10) time++;               // увеличение периода на 1, пока он не составит 1 мс

       w=0x30+time;

       lcd_send_cmd(0xC0);

       if(time==10) lcd_print("1 mili sec   "); // отображаем это

       else

         {

           lcd_send_data(w);

           lcd_print("00 micro sec");

         }   

   }

void dec_time_delay()                    // уменьшение периода

  {

       char z;

         if(time>=2) time--;             // уменьшение периода на 1, пока он не составит 100 мкс

         z=0x30+time;

         lcd_send_cmd(0xC0);

         lcd_send_data(z);

         lcd_print("00 micro sec");

  }

void initialize()                        // инициализация таймера и порта

  {

       P0 = 0x00;

       P2 = 0x00;

       P2 = 0x0F;

       P1 = 0xFF;

       TMOD=0x22;

       TH0=155;

       TL0=155;

       TH1=205;

       TL1=205;

  }   

             

void main()

  {

       int i=0,j=0,f=0,f2=0;

       initialize();                     

       lcd_send_cmd(0x3C);               // инициализация ЖК-дисплея

       lcd_send_cmd(0x0E);

       lcd_send_cmd(0x01);

       lcd_print("set bit time");        // отображение сообщения

       lcd_send_cmd(0xC0);

       lcd_print("100 micro sec");

back:  if(f==1)                          

         {

              lcd_send_cmd(0x01);

              lcd_print("Enter bit pattrn");    

              lcd_send_cmd(0xC0);             

              lcd_print("(8-bit):");

              f=0;

              f2=1;

         }

       P1=0xFF;

       while(P1==0xFF);                         // ожидание нажатия кнопки

       switch(P1)

          {

            case 0xFE:                          // для кнопки 1

                 led1=0;

                 dly();

                 if(i<8 && f2==1)

                   {

                     byte[i]=1;                 // вводим 1 и

                      lcd_send_data(0x31);      // отображаем 1 на дисплее

                      i++;

                   }

                 led1=1;

                 break;

            case 0xFD:                          // для кнопки 2

                led2=0;

                 dly();

                 if(i<8 && f2==1)

                   {

                     byte[i]=0;                 // вводим 0 и

                     lcd_send_data(0x30); // отображаем 0 на дисплее

                     i++;

                  }

                 led2=1;

                 break;

              case 0xFB:                        // для кнопки 3                  

                     inc_time_delay();          // увеличение периода

                    dly();

                    break;

             case 0xF7:                         // для кнопки 4

                   dec_time_delay();            // уменьшение периода

                   dly();

                   break;

            case 0xEF:                          // для кнопки 5

                  dly();

                 j++;

                 if((j%2)==1) f=1;       // первое время ничего не делаем

                 else generate_bit_pattern();   // затем генерируем битовую комбинацию                            

                }

       if(i==8) led=0;                    

              goto back;

  }



© digitrode.ru


Теги: AT89C51



Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий