Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_ЦОС_06_09_12.docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
497 Кб
Скачать
☆

Приложение б (обязательное) Листинг программы

#include "ADuC812.h" //прописаны основные регистры МК

#include "max.h" //модуль для работы с дополнительными регистрами

#include "lcd.h" //модуль для работы с ЖК-дисплеем

#include "kb.h" //модуль для работы с клавиатурой

#define Vref 2.5 //опорное напряжение для АЦП и ЦАП

#define Vz 0.27 //начальное напряжения для ЦАП

#define BUSY 0x80 //адрес бита занятости АЦП

#define START 0x10 //для старта однократно преобразования (5-ый бит ADCCON2)

#include "stdio.h"

//процедура инициализации ЦАП

void InitDac()

{

unsigned char wait;

DACCON &= ~0x03; //отключаем оба ЦАП

DACCON &= ~0x80;// устанавливаем режим 12-разрядного ЦАП

DAC0H = DAC0L = 0;//обнуляем ЦАП

DAC1H = DAC1L = 0;

DACCON &= ~0x60; //устанавливаем диапазон измерения от 0..2.5

DACCON |= 0x1C; //напряжение на выходе изменяется одновременно при записи в

//регистры DACxL

DACCON |= 0x01; //включить канал 0

for(wait = 0; wait < 30; ++wait); //задержка

}

//процедура усстановки напряжение V на выходе ЦАП0

void SetVoltage(float V)

{

unsigned short val;

val =(unsigned short)(V*0xFFF/ Vref );//преобразуем значение напряжения в

//соответствующий код ЦАП

val&=0xFFF; // проверка на выход из диапазона

DAC0H=val>>8; //установка значений, соответствующих напряжении V

DAC0L=val;

}

//инициализация АЦП

void init_adc(void)

{

while( ADCCON3 & BUSY ); //ожидание окончания возможного преобразования АЦП

ADCCON1 = 0x20; // установка делителя частоты равным 4

ADCCON2 = 0x00; //прерывания запрещено, режим ПДП отключен, одиночное

//преобразование, канал - 0

ADCCON1 |= 0x40; //включение АЦП

}

// функция возвращает значение напряжения на канале 0

unsigned short GetVoltage()

{

float v;

while( ADCCON3 & BUSY );// дождаться окончания предыдущего преобразования

ADCCON2 = START | ( 0 & 0x7 ); //запуск однократного преобразования на канале 0

while( ADCCON3 & BUSY ); //дождаться окончания преобразования

v = (( unsigned short )( ADCDATAH & 0xF ) << 8 ) | ADCDATAL;//получение кода от АЦП

v = v * Vref / 0xFFF;// преобразование кода в напряжение

return v;

}

//основная программа

void main()

{

float f,fDac;

char ch;

char buffer[10];

//Init_LCD(); //инициализация дисплея

InitDac(); //инициализация ЦАП

fDac=Vz; //начальное напряжение

SetVoltage(Vz); //установка напряжения на ЦАП

init_adc(); //инициализация АЦП

// LCD_Clear(); //очистка

f=GetVoltage(); //получение напряжения от АЦП

//sprintf(buffer,"%F",f); //преобразования числа f в строку buffer

//LCD_Type(&buffer); //вывод строки на ЖК-дисплей

while (1)

{

while (ScanKBOnce(&ch)!=1) //ожидаем нажатия клавиши клавиатуры

{

}//установка нового напряжения в зависимости от нажатой клавиши

if (ch="1") fDac=Vz;

if (ch="2") fDac=Vz*2;

if (ch="3") fDac=Vz*3;

if (ch="4") fDac=Vz*4;

if (ch="5") fDac=Vz*5;

if (ch="6") fDac=Vz*6;

if (ch="7") fDac=Vz*7;

if (ch="8") fDac=Vz*8;

if (ch="9") fDac=Vz*9;

SetVoltage(fDac);

f=GetVoltage();

//sprintf(buffer,"%F",f);

//LCD_Type(&buffer);

}

}