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


#include 
#include 
#include 
#include 
#include 
#include "myport.h" 
 
/*定义常量*/ 
#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 factor 16 
#define Byte unsigned char 
#define Word unsigned char 
/*时钟频率*/ 
unsigned long int clk = 1193182; 
/*初始化8251*/ 
void intitial_8251(); 
/*初始化8253*/ 
void intitial_8253(); 
/*初始化8255*/ 
void intitial_8255(); 
/*发送函数*/ 
void send(int); 
// 
int ad(void); 
/*主程序*/ 
void soundl(); 
 
void main(void) 
{ 
  //int  driver,mode,i,j,f,odata,ndata,flag; 
  int sletter,rletter,status; 
 
  OpenPortTalk(); 
  //char pch[2]; 
  /*初始化8251*/ 
  intitial_8251(); 
 /*初始化8253*/ 
  intitial_8253(); 
  /*初始化8255*/ 
 intitial_8255(); 
  getch(); 
  outportb(0x303,0x80);//置PC6=1,打开8253-5的GATE2,开始输出方波 
  outportb(0x303,0x0d); 
 
 /*判断键盘是否击键*/ 
  for(;;)//判断是否Esc键 
	{ 
     if(kbhit()) 
			{ 
				if(getch()==0x1b)//是ESC?是,则退出,并返回DOS 
				{ 
					outportb(control_8255,0x0c);//关闭8253 
					return; 
				} 
 
			} 
		else 
			{ 
				sletter=ad(); 
				status=inportb(control_8251  );//获取8253 TXRDY 状态 
				if((status&0x01)!=0)//已准备好,则将键入的字符发送出去	 
				outportb(data_8251,sletter); 
				printf("\n"); 
				{ 
				status=inportb(control_8251);//已准备好,即有数据传送过来,则接收1个字符 
				if((status&0x02)!=0) 
				{ 
					rletter=inportb(data_8251); 
					if(rletter=='0') 
					{ 
				  	    printf("danger!danger!danger!\n"); 
				    	soundl(); 
						continue; 
					} 
				}  
			} 
           continue; 
			} 
  
} 
  ClosePortTalk(); 
} 
/*初试化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); 
} 
 
void intitial_8255() 
{ 
   outportb(control_8255,0x80); 
   _sleep(100); 
   outportb(data_8255b,0xff); 
   _sleep(100); 
   outportb(data_8255c,0x00); 
   _sleep(100); 
} 
 
int ad(void) 
{ 
	int ch,pa,pc4; 
//	clrscr(); 
	//printf("Please input the a/d channel NO(0--7):"); 
	ch=0; 
//	printf("During the process, press any key to exit!\n"); 
	outportb(0x303,0x88);                   /*初始化8255状态字,A口输出*/ 
	//outportb(0x300,0);                      /*A口清0*/ 
	outportb(0x300,ch);                     /*送通道号至A口*/ 
	outportb(0x303,0x03);              /*pc1置1进行地址锁存*/ 
	//_sleep(50); 
	 
	outportb(0x303,0x98);              /*重写8255方式字,A口输入,C口低四位输出,C口高四位输入*/ 
	do 
	{  
			outportb(0x303,0x01);				/*使PC0置高发启动信号*/ 
			outportb(0x303,0x02); 
			//_sleep(50); 
			outportb(0x303,0x00);				/*使PC0置低*/ 
		 do 
			 { 
				 pc4=inportb(0x302)&0x10; 
				 }while(pc4==0);  /*查询PC4的状态,直至为高电位,即,转换完成*/ 
		 outportb(0x303,0x05);              /*pc2=1,允许读转换结果*/ 
		 pa=inportb(0x300);                 /*读转换结果*/ 
		 printf("0x%x ",pa);                /* 显示转换结果*/ 
		 _sleep(1000); 
      return pa; 
		 }while(!kbhit());                  /*有任意键按下即退出转换*/ 
} 
 
 
void soundl() 
{ 
	int xu[8]={0x81,0x42,0x24,0x18,0x81,0x42,0x24,0x18};//LED发光顺 序 
	unsigned long int i=0,j=0; 
	//printf("\nPress sw3 to start!\n"); 
	//printf("if you want to quit,please hit Any Key!"); 
	outportb(0x303,0x83);//初始化 
	outportb(0x300,0x00);//LED全灭 
	outportb(0x303,0x0c);//关闭SPK 
	 
	outportb(0x300,0xff);//按顺序送发光信号 
	i++; 
	 // if(i==8) i=0; 
      for(j=0;j<=100;j++) 
	  { 
	    outportb(0x303,0x0d);//令PC6=1,发高频音 
		_sleep(1); 
	    outportb(0x303,0x0c);//令PC6=0,关闭SPK 
		_sleep(1); 
	  } 
	  outportb(0x300,0x00);//LED全灭 
      for(j=0;j<=10;j++) 
	  { 
		  outportb(0x303,0x0d); 
		  _sleep(10);//令PC6=1,发低频音 
	      outportb(0x303,0x0c);//令PC6=0,消音 
		  _sleep(10); 
	  } 
	 
	outportb(0x300,0x00);//LED全灭 
	outportb(0x303,0x0c);//关闭SPK 
}