⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 down.cpp

📁 &#61548 下位机(客户机):下位机负责采集数据
💻 CPP
字号:

#include<iostream.h>
#include<dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>     //kbhit();
#include <time.h>

#define data51 0x308    //8251A数据口
#define ctrl51 0x309	   //8251A命令/状态口
#define ctrl55 0x303    //8255命令口
#define timer2 0x306    //8253的2号计数器端口
#define timctl 0x307    //8253命令口
#define factor 16	   //波特率因子16

const int spring_h=3;
const float spring_g=0.5;
const int spring_l=4;
const int summer_h=4;
const float summer_g=0.2;
const int summer_l=0.3;
const int fall_h=5;
const float fall_g=0.3;
const int fall_l=5;
const int winter_h=6;
const float winter_g=0.4;
const int winter_l=3;

int day=0;    //天数
char temp='a';

unsigned long int clk = 1193182;//8251输入时钟频率(十六进制表示)

void int51();           //初始化8251a
void set_bps(int bps);		   //8253-5记数初值计算与装入

void int51()
{
	outportb(ctrl51,0x00);
	delay(100);
	outportb(ctrl51,0x40);//8251复位
	delay(100);
	outportb(ctrl51,0x4e);//8251A方式命令
	delay(100);
	outportb(ctrl51,0x27);//8251A工作命令
}

void set_bps(int bps)
{
	int i,sendhigh,sendlow;
	i=clk/bps;
	i=i/factor;//计算计数初值
	sendhigh = (i>>8)&0x00ff;
	sendlow  = i & 0x00ff;
	outportb(timctl,0xb6);
	outportb(timer2,sendlow);//装计数初值低字节
	outportb(timer2,sendhigh);//装计数初值高字节
}

int charout(int dx,char al)  //实际发送到主控机
{
  char status;
  status=inportb(ctrl51);  //获取8251 TXRDY 状态
  if(status&0x01)
  {
    outportb(dx,al);
    delay(500);
    outportb(0x300,0x80);//灯 灭
    outportb(0x301,0xff);  //所有灯灭
    day++;
    return 0;
  }
  else
  {
    cout<<"send is not prepared! ";
    delay(100);
    return 1;
  }

}


void transmit(int rate)   //比较季度
{
  int i;
  int isright=0;
  srand(time(0));
  do
  {
    i=rand();
    i=i%10;
    if(i<rate)
    {
      outportb(0x300,0x00);//灯 亮
      isright=charout(data51,'1');
    }
    else
    {
      isright=charout(data51,'0');
    }
  } while(isright!=0);
  if(i<rate)
  {
    cout<<"1 ";
  }
  else
  {
    cout<<"0 ";
  }

}

void rain(int time)   //D\A转换使下雨时H灯亮 
{
	unsigned char i,  j;
   for(j=(time/1000);j>0;j--)
			do{
				i++;
				outportb(0x30f, i);//输出锯齿波
				delay(2);
			}while(i!=0x00);
}

void WeatherDetect(char season,int rainytime)     //根据季度(雨量)判断下雨概率
{
    rain(rainytime);
    delay(rainytime); 
    char status;
    if(season='!')
    {
      season=temp;
      delay(2000);
    }
    while(1)
    {
      status=inportb(ctrl51);  //从8251状态口接收数据存入c
      if(0x38&status)    //接收数据有误
           {
             cout<<"checkout is wrong! ";
             delay(100);
           }
           else if(0x02&status)          //接收准备好
           {
             temp=season;
             return;
           }

      switch(season)
      {
        case 'a': transmit(5); break;
        case 'b': transmit(9); break;
        case 'c': transmit(7); break;
        case 'd': transmit(6); break;
        default:  {cout<<"wrong season! ";delay(100);}break;
      }
    }
 }

void main(void)
{
  char receive='4';
  char status;
  while(1)
  {
    if (day==0)
    {
      set_bps(1200);        //设置波特率
      int51();              //对8251赋初值
      outportb(0x303,0x80); //置PC6=1,打开8253-5的GATE2,开始输出方波
      outportb(0x303,0x0d);
      outportb(0x301,0xff);
      WeatherDetect('a',0);
    }

    else{
           status=inportb(ctrl51);  //从8251状态口接收数据存入c
           if(0x38&status)    //接收数据有误
           {
             cout<<"checkout is wrong! ";
             delay(100);
           }
           else if(0x02&status)          //接收准备好
           {
             receive=inportb(data51);   //接收一个字符
             switch(receive)
             {
      				case '4': {outportb(0x301,0xf0);cout<<"-spring- ";}break;
       				case '5': {outportb(0x301,0xe0);cout<<"-fall- ";}break;
      				case '6': {outportb(0x301,0xc0);cout<<"-summer- ";}break;
    				   case '3': {outportb(0x301,0xf8);cout<<"-winter- ";}break;
      				case '!':  cout<<"flood! ";break;
                default: printf("Error!");
    				}
           }
     switch(receive)
      {
	     case '4': WeatherDetect('a',3000); break;
	     case '6': WeatherDetect('b',5000); break;
	     case '5': WeatherDetect('c',4000); break;
	     case '3': WeatherDetect('d',2000); break;
        case '!': WeatherDetect('!',0);break;
	     default : {cout<<"receive wrong information! ";delay(100);} break;
      }
    }
  }
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -