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 }