山东大学单片机硬件实验–4.5 8255 并行I/O 扩展及交通信号灯控制实验

一、实验题目:

4.5 8255并行I/O扩展及交通信号灯控制实验

二、实验要求:

       利用8255实现I/O扩展,完成交通灯控制。使用静态数码管显示灯亮倒计时。

三、实验源程序

#include<reg51.h>
#include<absacc.h>//可使用其中定义的宏来访问绝对地址
#define uchar unsigned char
#define uint unsigned int
#define pa XBYTE[0x7FFC]//代表8255的A口的地址
#define com XBYTE[0x7fff]//代表8255的控制寄存器的地址
uint temp,t;
uchar a;//存放显示倒计时的BCD码
void show(uint temp);
void delay500ms();
void delay1s();
void int_8255();//函数声明
/*************************************************************
						  主程序
*************************************************************/
void main()
{  int_8255();
	while(1)
	{ 
		a=0x26;//赋初值
		for(temp=25;temp>19;temp--)	 //显示25~20
		{
			a=a-1;
			pa=0x59;//东西绿灯亮,南北红灯亮
			show(a);
			delay1s();
		}
		a=0x1a;//对a中的BCD码调整
		for(temp=19;temp>9;temp--)//显示19~9
		{ 
			a=a-1; 
			pa=0x59;  //东西绿灯亮,南北红灯亮
			show(a);
			delay1s();
		}
		a=0x0a;//对a中的BCD码调整
		for	(temp=9;temp>0;temp--)//显示9~0
		{ 
			a=a-1; 
			pa=0x59;  //东西绿灯亮,南北红灯亮
			show(a);
			delay1s();
		}
		a=0;
		for(t=5;t>0;t--)  //绿灯闪烁5次
		{
 			show(a);
  			pa=0x7d;//东西绿灯灭,南北红灯亮
  			delay500ms();
  			pa=0x59;//东西绿灯亮,南北红灯亮
  			delay500ms();
  		}
		a=0x26;//赋初值
		for(temp=25;temp>19;temp--)	 //显示25~20
		{
			a=a-1;
			pa=0x0a6;//南北绿灯亮,东西红灯亮
			show(a);
			delay1s();
		}
		a=0x1a;//对a中的BCD码调整
		for	(temp=19;temp>9;temp--)//循环显示19~9
		{ 
			a=a-1;  
			pa=0x0a6;  //南北绿灯亮,东西红灯亮
			show(a);
			delay1s();
		}
		a=0x0a;//对a中的BCD码调整
		for	(temp=9;temp>0;temp--)//显示9~0
		{ 
			a=a-1; 
			pa=0x0a6;  //南北绿灯亮,东西红灯亮
			show(a);
			delay1s();
		}
		a=0;
 		for(t=5;t>0;t--)  //绿灯闪烁5次
 		{
 			show(a);
  			pa=0x0e7;//南北绿灯灭,东西红灯亮
  			delay500ms();
  			pa=0x0a6;//南北绿灯亮,东西红灯亮
  			delay500ms();
  		}
	}
}
/*************************************************************
						 500ms延时函数
*************************************************************/
void delay500ms()
{
	uint i,j;
	for(i=500;i>0;i--)
	for(j=110;j>0;j--)  ;
}
/*************************************************************
						  1s延时函数
*************************************************************/
void delay1s()
{
	uint i,j;
	for(i=1000;i>0;i++)
 	for(j=110;j>0;j--);
}
/*************************************************************
						   8255设置函数
*************************************************************/
void int_8255()
{
	com=0x80; //方式0下工作,A,B口,C口全部用来输出
}
/*************************************************************
						  数码管显示函数
*************************************************************/
void show(uint a)
{ 
	SCON =0x00;	//串行口工作在方式0,作为八位移位寄存器
  	SBUF=a;
  	TI=0;		 //清除串行口发送完一个字节产生的中断标志
}
© 版权声明
THE END
喜欢就支持以下吧
点赞2赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容