Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Расчетно-графическая работа
по дисциплине: «Микроконтроллеры»
Исследование периферии микроконтроллеров семейства AVR
Новосибирск
2021
Для выполнения РГР нам понадобится эмулятор Simulide, рассмотрим
подробнее его возможности.
Базовые функции эмулятора:
1.Симуляция схем в реальном времени.
2.Симуляция микроконтроллеров PIC, AVR, Arduino.
3.Симуляция цифровых схем.
4.Симуляция аналоговых схем.
5.Широкий выбор измерительных инструментов (вольтметр,
амперметр, осциллограф (одноканальный), 4-х канальный плоттер
(аналоговый), пробник, частотомер.
6. Возможность создания своих моделей на основе примитивов.
7. Гибкие настройки встроенных примитивов:
количество входов, выходов, напряжения лог. 1 и лог. 0 для входа и выхода
(в том числе и отрицательные), открытий коллектор, инвертированный
выход и другие - для логических элементов, максимальный ток, цвет
свечения для светодиодов, количество строк/столбцов, расположение
выводов для матриц, количество разрядов для 7 сегментных индикаторов,
тип транзисторов, коэффициент их усиления для биполярных транзисторов,
основные параметры для полевых транзисторов, подсветка разными цветами
логических уровней для соединительных проводов при симуляции схем и
многое другое.
8. Реальная симуляция светодиодов: яркость пропорциональна току.
Работает ШИМ для управления яркостью.
9. Встроенный редактор кода для написания программ к
микроконтроллерам.
10. Возможность подключения компилятора кода.
11. Возможность отладки кода.
12. Настройки параметров симуляции.
13. Программа русифицирована.
14. Работает без установки (портативная версия).
15. Работает под Windows, Linux, MacOS.
16. Простой, интуитивно понятный интерфейс
17. Симуляция троичной логики.
Пример №2
Для работы с дисплеем glcd8544(pcd8544) скачаем несколько 2
библиотеки в ардуино Ардуино→скетч→подключитьбиблиотеку
→управлять библиотеками→Adafruit GFX и Adafruit PCD8544.
В эмуляторе собираем схему показанную на рисунке 6.
Рис5. Схема для примера №2
Код программы:
SWEEP.INO
#include <Servo.h>
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
BLINK.INO
int led=13;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(led, OUTPUT);
}
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ 0B00000000, 0B11000000,
0B00000001, 0B11000000,
0B00000001, 0B11000000,
0B00000011, 0B11100000,
0B11110011, 0B11100000,
0B11111110, 0B11111000,
0B01111110, 0B11111111,
0B00110011, 0B10011111,
0B00011111, 0B11111100,
0B00001101, 0B01110000,
0B00011011, 0B10100000,
0B00111111, 0B11100000,
0B00111111, 0B11110000,
0B01111100, 0B11110000,
0B01110000, 0B01110000,
0B00000000, 0B00110000 };
while (1) {
// draw each icon
for (uint8_t f=0; f< NUMFLAKES; f++) {
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);
}
display.display();
delay(200);
while(Serial.available()) {
switch (Serial.read()) {
case 'w':display.setContrast(display.getContrast() + 1);
break;
case 's':if(display.getContrast()) display.setContrast(display.getContrast() - 1);
break;
case 'e':display.setBias(display.getBias() + 1);
break;
case 'd':if(display.getBias()) display.setBias(display.getBias() - 1);
break;
case 'R':display.setReinitInterval(10);
break;
case 'r':display.initDisplay();
display.setReinitInterval(0);
break;
}
}
Serial.print("contrast (w/s): 0x");
Serial.print(display.getContrast(), HEX);
Serial.print(" bias (e/d): 0x");
Serial.print(display.getBias(), HEX);
Serial.print(" reinitialize display (r/R): 0x");
Serial.print(display.getReinitInterval(), HEX);
Serial.print(" \r");
void testdrawchar(void) {
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
void testdrawcircle(void) {
for (int16_t i=0; i<display.height(); i+=2) {
display.drawCircle(display.width()/2, display.height()/2, i, BLACK);
display.display();
}
}
void testfillrect(void) {
uint8_t color = 1;
for (int16_t i=0; i<display.height()/2; i+=3) {
// alternate colors
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
display.display();
color++;
}
}
void testdrawtriangle(void) {
for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
display.drawTriangle(display.width()/2, display.height()/2-i,
display.width()/2-i, display.height()/2+i,
display.width()/2+i, display.height()/2+i, BLACK);
display.display();
}
}
void testfilltriangle(void) {
uint8_t color = BLACK;
for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
display.fillTriangle(display.width()/2, display.height()/2-i,
display.width()/2-i, display.height()/2+i,
display.width()/2+i, display.height()/2+i, color);
if (color == WHITE) color = BLACK;
else color = WHITE;
display.display();
}
}
void testdrawroundrect(void) {
for (int16_t i=0; i<display.height()/2-2; i+=2) {
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4,
BLACK);
display.display();
}
}
void testfillroundrect(void) {
uint8_t color = BLACK;
for (int16_t i=0; i<display.height()/2-2; i+=2) {
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4,
color);
if (color == WHITE) color = BLACK;
else color = WHITE;
display.display();
}
}
void testdrawrect(void) {
for (int16_t i=0; i<display.height()/2; i+=2) {
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, BLACK);
display.display();
}
}
void testdrawline() {
for (int16_t i=0; i<display.width(); i+=4) {
display.drawLine(0, 0, i, display.height()-1, BLACK);
display.display();
}
for (int16_t i=0; i<display.height(); i+=4) {
display.drawLine(0, 0, display.width()-1, i, BLACK);
display.display();
}
delay(250);
display.clearDisplay();
for (int16_t i=0; i<display.width(); i+=4) {
display.drawLine(0, display.height()-1, i, 0, BLACK);
display.display();
}
for (int8_t i=display.height()-1; i>=0; i-=4) {
display.drawLine(0, display.height()-1, display.width()-1, i, BLACK);
display.display();
}
delay(250);
display.clearDisplay();
for (int16_t i=display.width()-1; i>=0; i-=4) {
display.drawLine(display.width()-1, display.height()-1, i, 0, BLACK);
display.display();
}
for (int16_t i=display.height()-1; i>=0; i-=4) {
display.drawLine(display.width()-1, display.height()-1, 0, i, BLACK);
display.display();
}
delay(250);
display.clearDisplay();
for (int16_t i=0; i<display.height(); i+=4) {
display.drawLine(display.width()-1, 0, 0, i, BLACK);
display.display();
}
for (int16_t i=0; i<display.width(); i+=4) {
display.drawLine(display.width()-1, 0, i, display.height()-1, BLACK);
display.display();
}
delay(250);
}
void setup() {
Serial.begin(9600);
Serial.println("PCD test");
display.begin();
// init done
// you can change the contrast around to adapt the display
// for the best viewing!
display.setContrast(75);
// draw rectangles
testdrawrect();
display.display();
delay(2000);
display.clearDisplay();
testdrawroundrect();
delay(2000);
display.clearDisplay();
testfillroundrect();
delay(2000);
display.clearDisplay();
testdrawtriangle();
delay(2000);
display.clearDisplay();
testfilltriangle();
delay(2000);
display.clearDisplay();
// rotation example
display.clearDisplay();
display.setRotation(1); // rotate 90 degrees counter clockwise, can also use values of 2
and 3 to go further.
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Rotation");
display.setTextSize(2);
display.println("Example!");
display.display();
delay(2000);
void loop() {
}