www.pudn.com > voltage_monitor.rar > get.cpp


#include 
#include 
#include 
#include 
#include 
#include "get.h" 
#include "myport.h" 
 
/*定义全局常量*/ 
#define MAX           260  /*定义AD通道最大值*/ 
#define control_8255  0x303 
#define data_8255b    0x301 
#define data_8255c    0x302 
#define data_clock2   0x306 
#define control_clock 0x307 
#define data_8251     0x308 
#define control_8251  0x309 
#define data_clock1   0x305 
#define factor 16 
int  flag16,flag24; 
 
/*时钟频率*/ 
unsigned long int clk = 1193182; 
/*初始化8251*/ 
void intitial_8251(); 
/*初始化8253*/ 
void intitial_8253(); 
/*初始化8255*/ 
void intitial_8255(); 
/*接受函数*/ 
int  receive(); 
/*声光报警*/ 
void soundl(); 
 
void send(); 
 
#define DATA_MAX 20 
 
int index = 0; 
int data[DATA_MAX] = {0}; 
 
 
void get(int a[], int& m) 
{ 
	int   AtoD; 
	int b[DATA_MAX]; 
 
	OpenPortTalk(); 
 
	//初始化8251,8253,8255 
	intitial_8251(); 
	intitial_8253();	 
	intitial_8255(); 
	 
	while(1){//监测数据 
		AtoD = receive(); 
		if(AtoD<0) 
			continue; 
		else  
			break; 
	} 
	//printf("The current data is: %d\n",AtoD); 
	if(AtoD>180){//如果电压值超过警戒值 
		//printf("danger!danger!danger!\n"); 
		send(); 
		soundl();	   		 
	}//end of if 
			 
	for(int j=0; j180){//如果电压值超过警戒值 
		   //printf("danger!danger!danger!\n"); 
           //send(); 
		   soundl();	   		 
		}//end of if 
	}//end of for*/ 
	ClosePortTalk(); 
} 
 
/*接收函数*/ 
int receive() 
{ 
	int data_receive,status; 
	status=inportb(control_8251); 
	//printf("%d\n",status);//correct 
	if(status&0x02) 
	{ 
		data_receive=inportb(data_8251); 
		return  data_receive; 
	}else{ 
		return  -1; 
	} 
} 
/*初始化8251*/ 
void intitial_8251() 
{ 
       outportb(control_8251,0x00); 
       _sleep(100); 
       outportb(control_8251,0x40); 
       _sleep(100); 
       outportb(control_8251,0x4e); 
       _sleep(100); 
       outportb(control_8251,0x27); 
} 
/*初始化8253*/ 
void intitial_8253() 
{ 
     int counter,sendhigh,sendlow,bps=1200; 
     counter=clk/bps;/*初始化8253*/ 
     counter=counter/factor; 
     sendhigh = (counter>>8)&0x00ff; 
     sendlow  = counter & 0x00ff; 
     outportb(control_clock,0xb6); 
     outportb(data_clock2,sendlow); 
     outportb(data_clock2,sendhigh); 
     outportb(control_clock,0x76); 
     outportb(data_clock1,200); 
     outportb(data_clock1,0); 
} 
/*初始化8255*/ 
void intitial_8255() 
{ 
   outportb(control_8255,0x80); 
   _sleep(100); 
   outportb(data_8255b,0xff); 
   _sleep(100); 
   outportb(data_8255c,0x00); 
   _sleep(100); 
} 
 
void soundl() 
{ 
	int xu[8]={0x81,0x42,0x24,0x18,0x81,0x42,0x24,0x18};//LED发光顺序 
	unsigned long int i=0,j=0; 
 
	outportb(0x303,0x83);//初始化 
	outportb(0x300,0x00);//LED全灭 
	outportb(0x303,0x0c);//关闭SPK 
    outportb(0x300,0xff);//按顺序送发光信号 
	  i++; 
	  if(i==8)i=0; 
      for(j=0;j<=20;j++) 
	  { 
	    outportb(0x303,0x0d);//令PC6=1,发高频音 
		_sleep(10); 
	    outportb(0x303,0x0c);//令PC6=0,关闭SPK 
		_sleep(10); 
	  } 
      outportb(0x300,0x00);//LED全灭 
      for(j=0;j<=10;j++) 
	  { 
		  outportb(0x303,0x0d); 
		  _sleep(30);//令PC6=1,发低频音 
	      outportb(0x303,0x0c);//令PC6=0,消音 
		  _sleep(30); 
	  } 
	outportb(0x300,0x00);//LED全灭 
	outportb(0x303,0x0c);//关闭SPK 
} 
 
void send() 
{ 
	int sletter ,status;	 
		sletter='0';     
        status=inportb(control_8251);//获取8253 TXRDY 状态 
     	if((status&0x01)!=0)//已准备好,则将键入的字符发送出去 
		{ 
		outportb(data_8251,sletter); 
		} 
}