十字路口交通流量监控系统的实施 
1. 实时采样(下位机) 
在下位机,我们通过A/D转换通道的电压变化模拟实际环境下的交通流量变化,通过查询方式采用并行端口实时采集,并将采集的数据发送到主机,并实时检测接收反馈信号,并将反馈信号用屏幕模拟的十字路口交通灯显示出来。 
2. 实时监控(主机) 
主机收集到发送端发送过来的数据后,与设定的交通流量峰值相比较(峰值为90),然后作出判断得出下一周期的红绿灯控制信号,然后反馈给下位机。 
3. 报警 
当主机发现交通流量超过预警值90后,会在主机屏幕上显示出报警信息。随后会将当前通行方向延长一个周期。 
4. 双机通讯 
发送端和接受端采用查询方式,和串行传送方式传输数据。 
(三)以下是:8251,8253,8255,AD转换器初始化程序设计以及源程序清单 

主程序8255,8253,8251的设计 
首先设置8255的工作方式控制字 

8255的口A,口B,口C均作为输出,工作方式为0 
固工作方式控制字为10000000即0x80 

其次设置8255的对口C的按位置位/复位控制字 
设置PC6=1打开8253的GATE2门输出方波 
即控制字为00001101,为0x0d 
8255的初始化程序代码如下: 

void ST_8255(void) 

outportb(Com8255,0x80); /* 初始化 */ 
outportb(Com8255,0x0d); /* 按位置位复位命令 */ 
/* 设置 8255 的 PC6=1 来打开 8253 的 GATE2 ,输出方波 */ 

其次设置8253的初始化 
8253使用2号计数器,读/写方式选择为先写低8位计数值,再写高8位计数值 
工作方式为3 
计数初值为二进制数,减一计数器按二进制规律减一 
所以8253的工作方式控制字为10110110 
即0Xb6 
8253的计数器时钟脉冲频率为1193182HZ 
计数初值为1193182/(16*1200)即62 
最后将计数值先高位再低位分两次写入CLK中 


8253的初始化程序代码如下: 

void ST_8253(void) 

int bps=1200; 
int datah; 
int datal; 
int tp; 
tp = 1193182/(16*bps); 
datah = (tp >> 8)&0x00ff; 
datal = tp & 0x00ff; 
outportb(timctrl,0xb6); /* 8253 初始化 */ 
outportb(timer2,datal); 
outportb(timer2,datah); 


最后设置8251的初始化 
首先激活8251,将0写入命令口ctr151 
其次进行复位操作,即D6=1,命令码为01000000, 即 OX40 
再进行方式命令字设置,异步位为1位,无奇偶校验,字符长度为8位,波特率因子为16 综合得命令码为01001110 即0X4E 
最后进行工作命令字设置,D5位(RTS发送请求)D2位(RxE接受允许),D1位(DTR数据终端准备好),D0位(发送允许)设置为1 
命令码为00100111 即0X27 

8251的初始化程序设计代码如下: 
void ST_8251(void) 

int i; 
/* 激活8251 */ 
outportb(ctrl51,0); 
outportb(ctrl51,0x40); /* 8251 内部复位 */ 
for(i=20;i>0;i--){;} 
outportb(ctrl51,0x4e); /* 8251 方式命令 */ 
for(i=20;i>0;i--){;} 
outportb(ctrl51,0x27); /* 8251 工作命令 */ 
/*i=inportb(ctrl51);*/ 
/*printf("%d",i);*/ 



[2]从程序8253,8251,的初始化设计 
8253使用2号计数器,读/写方式选择为先写低8位计数值,再写高8位计数值 
工作方式为3 
计数初值为二进制数,减一计数器按二进制规律减一 
所以8253的工作方式控制字为10110110 
即0Xb6 
8253的计数器时钟脉冲频率为1193182HZ 
计数初值为1193182/(16*1200)即62 
最后将计数值先高位再低位分两次写入CLK中 


8253的初始化程序代码如下: 
_ #define timer2 0x306 /* 8253 counter 2 port address */ 
#define timctrl 0x307 /* 8253 control port address */ 
void ST 8253(void) 

int bps=1200; 
int datah; 
int datal; 
long tp; 

tp = 1193182/(16*bps); 
datah = tp>> 8; 
datal = tp & 0x00ff; 
outportb(timctrl,0x0b6); /* 8253 初始化 */ 
outportb(timer2,datal); 
outportb(timer2,datah); 


最后设置8251的初始化