
- •Проектирование микропроцессорных систем на базе учебного стенда sdk 1.1
- •Введение
- •1. Описание компонентов мп системы.
- •Микропроцессорный стенд sdk - 1.1.
- •Микроконтроллер aDuC812
- •Плис max3064
- •Дискретные входы-выходы
- •Аналоговые входы-выходы
- •Инструкция по работе с программой
- •Обзор основных свойств, методов, событий компоненты ComPort
- •4. Датчики
- •5. Пример 1
- •Расчет параметров технологического процесса
- •5.2. Описание функций для работы с sdk 1.1
- •5.3. Алгоритм программы для sdk
- •5.4. Программа для sdk
- •5.5. Интерфейс программы для пк
- •5.6. Алгоритм программы для пк
- •5.7. Программа для пк
- •6. Пример 2
- •6.1. Алгоритм работы системы
- •6.2. Имитация датчиков
- •6.3. Расчет параметров технологического процесса
- •6.4. Программа для работы микропроцессорного контроллера на языке Ассемблер
- •6.5. Программа для работы цап и ацп на языке c
- •6.6. Программа для персонального компьютера на языке с в среде c-Builder
- •6.7. Интерфейс программы для пк
- •7. Графическая часть
- •Sdk 1.1
- •5.2. Описание функций для работы с sdk 1.1 …………………... 21
- •5.4. Программа для sdk ………………………………………….. 35
- •5.5. Интерфейс программы для пк ………………………………. 41
- •5.6. Алгоритм программы для пк ………………………………... 43
5.3. Алгоритм программы для sdk
Алгоритм основной программы.
Нет
Да
Нет
Да
Нет
Да
Нет
Да
Алгоритм прерывания.
5.4. Программа для sdk
#include <ADUC812.h>
#include <ser_inc.h>
bit start_process=FALSE;
bit rrr=TRUE;
int i=1;
/////////////////////// For KB///////////////////////
char KBTable[]="147*2580369#ABCD";
char* symbol_from_kb;
///////////////////////////////////////////////////////
///////////////////////For LCD////////////////////////
static bit CurPosCtrl=1;
static char cur_x=0;//0-15
static bit cur_y=0; //0/1
///////////////////////////////////////////////////////
void Initilization(void);
void Buzz(void);
bit ScanKBOnce(char *ch);
unsigned char ReadMax(unsigned char xdata* regnum);
void WriteMax(unsigned char xdata* regnum,unsigned char val);
void Svetik(bit);
///////////////////Functions for LCD///////////////////////////
void SwitchCurPosControl(bit o);
void Strobe(char c);
void LCD_SwitchCursor(bit cursor, bit blink);
void LCD_Clear(void);
void InitLCD(void);
void LCD_Putch(char ch);
void LCD_GotoXY(unsigned char x,bit y);
void LCD_Type(char* s);
/////////////////////////////////////////////////////////////
///////////////////Function for Interrupt////////////////////
void SetVect(unsigned char num, void code * handler);
void TIMER0_ISR(void);
void COM_ISR(void);
////////////////////////////////////////////////////////////
////////////////////Functions for COM-port///////////////////////
void WSio(unsigned char Sym);
unsigned char RSio(void);
void Type(char * Str);
void MyInitSIO(void);
///////////////////////////////////////////////////////////////////
///////////////////Functions for ADC and DAC///////////////////////
void SetVoltage(float v, bit channel);
float GetVoltage(unsigned char channel);
///////////////////////////////////////////////////////////////////
void main(void)
{
Initilization();
while(1)
{
if(rrr)
{
char start_mes[] = {0xA1,0x6f,0xbf,0x6f,0xb3,0xbd,0x6f,0x63,0xbf,0xc4,0x20,0xba,0x20,0xbe,0x79,0x63,0xba,0x79};
LCD_Clear();
LCD_Type(start_mes);
rrr=FALSE;
}
if(start_process)
{
if(ScanKBOnce(symbol_from_kb)==0x01)
{
char sym=*symbol_from_kb;
float voltage=0;
switch(sym)
{
case '1': {// 1 impuls
Type("1");
//SetVoltage(0.1,DAC0);
//voltage=GetVoltage(0);
break;
}
case '2': {// 10 impulsov
Type("10");
break;
}
case '3': { // 100 impulsov
Type("100");
break;
}
case 'A': { // 1000 impulsov
Type("1000");
break;
}
case '4': {
Type("10000");//10 000 impulsov
break;
}
case '5': {
Type("100000");
break;
}
case '6': { // 0.0001 metra
SetVoltage(0.2,DAC0);
voltage=GetVoltage(0);
Type("0.0001");
break;
}
case '7': {// -0.0001 metra
SetVoltage(-0.2,DAC0);
voltage=GetVoltage(0);
Type("-0.0001");
break;
}
case '8': {// 0.001 metra
SetVoltage(1.2,DAC0);
voltage=GetVoltage(0);
Type("0.001");
break;
}
case '9': {// -0.001
SetVoltage(-1.2,DAC0);
voltage=GetVoltage(0);
Type("-0.001");
break;
}
}//switch
}
}
}//while(1)
}//main
void Initilization(void)
{
DACCON = 0x7F;
ADCCON1 = 0xAC;
InitLCD();
MyInitSIO();
SetVect(0x04,(void code*)COM_ISR);
IE=0x10;
EA=TRUE;
}
unsigned char ReadMax(unsigned char xdata *regnum)
{
unsigned char oldDPP=DPP;
unsigned char val=0;
DPP=MAXBASE;
val=*regnum;
DPP=oldDPP;
return val;
}
void WriteMax(unsigned char xdata *regnum, unsigned char val)
{
unsigned char oldDPP=DPP;
DPP=MAXBASE;
*regnum=val;
DPP=oldDPP;
}
void Buzz(void)
{
int dur,i;
for(dur = 0; dur < 8000; dur++)
{
WriteMax(ENA,0x3C);
for(i=0; i < 25; i++)continue;
WriteMax(ENA,0x20);
for(i=0; i < 25; i++)continue;
}
}
bit ScanKBOnce(char *ch)
{
unsigned char row,col,rownum,colnum;
unsigned int i;
for(colnum = 0; colnum < 4; colnum++)
{
col = 0x1 << colnum; //0001,0010,0100,1000,0001,...
WriteMax(KB, ~col); //11111110,11111101,11111011,11110111,11111110,...
for(rownum = 0; rownum < 4; rownum++)
{
row = ReadMax(KB) & (0x10 << rownum);
if( !row )
{
for(i = 0; i<10000; i++)continue;
row = ReadMax(KB) & (0x10 << rownum);
if( !row )
{
*ch = (KBTable[(colnum<<2) + rownum]);
return 1;
}
}
}
}
return 0;
}
void Svetik(bit tetrad)
{
int j,u;
if(tetrad)
{
for(j=0;j<50;j++)
{
WriteMax(SV,0x0F);
for(u=0;u<31000;u++) continue;
WriteMax(SV,0xF0);
for(u=0;u<31000;u++) continue;
}
}else
{
WriteMax(SV,i);
i++;
}
}
////////////////////////////////////////////////////////for LCD///////////////////////////////////////////
void SwitchCurPosControl(bit o)
{
CurPosCtrl=o;
}
void Strobe(char c)
{
unsigned int i;
WriteMax(C_IND,c | 0x1);
WriteMax(C_IND,c & 0xFE);
for (i=0;i<300;i++)continue;
}
void LCD_SwitchCursor(bit cursor, bit blink)
{
unsigned char i=0;
WriteMax( DATA_IND, DISPLAY_CTRL |
DISPLAY_ON |
((cursor)?CURSOR_ON:0) |
((blink)?BLINK:0) );
Strobe(0x8); //R/W = 0; RS = 0
}
void LCD_Clear(void)
{
int i;
WriteMax(DATA_IND, CLEAR);
Strobe(0x8); //clear
cur_x = 0;
cur_y = 0;
// for(i=0; i<1600; i++)continue;
}
void InitLCD(void)
{
unsigned short i;
for(i=0; i<4000; i++)continue;
// cmd = 0x30; //
WriteMax(DATA_IND, FUNCTION_SET|EIGHT_BITS);
Strobe(0x8);
for(i=0; i<1500; i++)continue;
// cmd = 0x30; //
WriteMax(DATA_IND, FUNCTION_SET|EIGHT_BITS);
Strobe(0x8);
for(i=0; i<50; i++)continue;
// cmd = 0x30; //
WriteMax(DATA_IND, FUNCTION_SET|EIGHT_BITS);
Strobe(0x8);
// for(i=0; i<100; i++)continue;
// cmd = 0x38; //
WriteMax(DATA_IND, FUNCTION_SET|EIGHT_BITS|TWO_LINE);
Strobe(0x8);
// cmd = 0x08; //
WriteMax(DATA_IND, DISPLAY_CTRL); //Display off
Strobe(0x8);
// cmd = 0x01; //
WriteMax(DATA_IND, CLEAR);
Strobe(0x8);
// for(i=0; i<1600; i++)continue;
WriteMax(DATA_IND, ENTRY_MODE|INCR);
Strobe(0x8);
// cmd = 0x0F; //Display ON
WriteMax(DATA_IND, DISPLAY_CTRL|DISPLAY_ON); //Cursor OFF, Blinking OFF
Strobe(0x8);
}
void LCD_Putch(char ch)
{
if(CurPosCtrl)
{
LCD_GotoXY(cur_x,cur_y);
if(++cur_x>15)cur_x=0,cur_y=~cur_y;
}
WriteMax(DATA_IND,ch);
Strobe(0xC); //R/W = 0, RS = 1 (¤ лҐ)
}
void LCD_GotoXY(unsigned char x,bit y)
{
WriteMax(DATA_IND,RAM_DD|(x+((y)?0x40:0)));
Strobe(0x8); //set ram
cur_x = x;
cur_y = y;
}
void LCD_Type(char* s)
{
bit t = CurPosCtrl;
SwitchCurPosControl(1);
while(*s)
LCD_Putch(*s++);
SwitchCurPosControl(t);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////Functions interrupticus/////////////////////////////////////////////////////////////////////////////////////
void SetVect(unsigned char num, void code * handler)
{
unsigned char xdata * p = RAM_TABLE + (num << 3) + 3;
*p++ = LJMP;
*(unsigned short xdata *)p = (unsigned short)handler;
}
void COM_ISR(void) interrupt 4
{
if(RI)//read from RS-232
{
switch(RSio())
{
case 'Y':
{
start_process=TRUE;
LCD_Clear();
rrr=TRUE;
break;
}
case 'N':
{
char stop_mes[]={0xa8,0x70,0x6f,0xe5,0x65,0x63,0x63,0x20,0x6f,0x63,0xbf,0x61,0xbd,0x6f,0xb3,0xbb,0x65,0xbd};
start_process=FALSE;
LCD_Clear();
LCD_Type(stop_mes);
rrr=FALSE;
i=1;
break;
}
case 'M':
{
int h=0;
char mes1[]={0x48,0x61,0x20,0xba,0x61,0xbf,0x79,0xc1,0xba,0x65,0x20,0x35,0x4f,0x4f,0xba,0xb4,0x20,0xbe,0x70,0x6f,0xb3,0x6f,0xbb,0x6f,0xba,0xb8};
LCD_Clear();
LCD_Type(mes1);
Svetik(TRUE);
Buzz();
LCD_Clear();
WriteMax(SV,0x00);
rrr=TRUE;
start_process=FALSE;
i=1;
for(;h<32000;h++) continue;
break;
}
case 'L':
{
char mes2[]={0x31,0x4f,0x4f,0x20,0xbc,0x65,0xbf,0x70,0x6f,0xb3,0x20,0xbe,0x70,0x6f,0xb3,0x6f,0xe3,0x61};
int h=0;
LCD_Type(mes2);
Svetik(FALSE);
Buzz();
for(;h<32000;h++) continue;
LCD_Clear();
WriteMax(SV,0x00);
break;
}
}
}
if(TI)// write to RS-232
{
}
}
//////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////COM-port functions/////////////////////////////////////
void WSio(unsigned char Sym)
{
SBUF=Sym;
TI=0;
while(!TI);
TI=0;
}
unsigned char RSio(void)
{
while(!RI);
RI=0;
return SBUF;
}
void Type(char * Str)
{
while(*Str)
WSio(*Str++);
}
void MyInitSIO(void)
{
T3CON= 0x83;
T3FD= 0x2D;
SCON= 0x50;
}
///////////////////////////////////////////////////ADc DAc////////////////////////
void SetVoltage(float v, bit channel)
{
unsigned short max_val;
unsigned short val;
if(DACCON & 0x80)
{
max_val = 0xFF;
}
else
{
max_val = 0xFFF;
}
val = (unsigned short)(v * max_val / VDD);
val &= max_val;
if(channel == DAC0)
{
DAC0H = val >> 8;
DAC0L = val;
}
else
{
DAC1H = val >> 8;
DAC1L = val;
}
}
float GetVoltage(unsigned char channel)
{
float v;
while(ADCCON3 & BUSY);
ADCCON2 = 0x10 | channel ;
while(ADCCON3 & BUSY);
v = ((unsigned short)(ADCDATAH&0xF) << 8) | ADCDATAL;
v = v * 5.0 / 0xFFF;
return v;
}
/////////////////////////////////////////////////////