📄 down.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 + -