一、实验题目:
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
暂无评论内容