8255控制交通灯设计者:金勇电子信息工程2007.12.6题目:用8255做输出口,控制十二个发光二极管亮灭,模拟交通灯管理。十字路口东西南北走向。初始状态0:为东西红灯,南北红灯。状态1(10s):东西绿灯通车,南北红灯;状态2(3s):东西绿灯灭,黄灯闪几次,南北红灯;状态3(10s):东西红灯,南北绿灯通车;状态4(3s):东西红灯,南北绿灯灭,黄灯闪几次。依次循环。实验程序流程图电路原理图(一)电路原理图(二)电路原理图(三)完整的实验原理图:8255的初始化:根据实验的原理图可以计算出8255的控制字地址为FF7FH,A口的地址为FF7CH,B口的地址为FF7DH,然后对8255初始化,使用的语句为:MOVDPTR,#0FF7FHMOVA,#88HMOVX@DPTR,A这样将方式控制字送到控制寄存器。其中方式控制字为88H(10001000),表示8255工作在方式0,A,B口作为输出口,C口高4位作为输入口,低4位作为输出口。状态0:东西红灯,南北红灯。相应程序为:MOVDPTR,#0FF7CHMOVA,#0B6HMOVX@DPTR,A;从A口输出数据0B6H,来控制相应二极管发光INCDPTRMOVA,#0DHMOVX@DPTR,A;从B口输出数据0DH,来控制相应二极管发光黄绿绿红绿黄绿红红黄黄东南西北A口(0B6H)B口低4位(ODH)0000红11111111状态1:东西绿灯亮,南北红灯亮相应程序为:MOVDPTR,#0FF7CHMOVA,#75HMOVX@DPTR,A;从A口输出数据75H来控制相应二极管发光INCDPTRMOVA,#0DHMOVX@DPTR,A;从A口输出数据0DH来控制相应二极管发光黄绿红黄绿红黄绿红黄绿红东南西北B口低4位(ODH)A口(75H)101111111000状态2:东西绿灯灭,黄灯闪几次,南北红灯相应程序为:MOVDPTR,#0FF7CHMOVA,#0F3HMOVX@DPTR,AINCDPTRMOVA,#0CHMOVX@DPTR,A;东西黄灯亮,南北红灯亮MOV20H,#0AHMOV21H,#01HLCALLDELY;延时0.5sMOVDPTR,#0FF7CHMOVA,#0F7HMOVX@DPTR,AINCDPTRMOVA,#0DHMOVX@DPTR,A;南北红灯亮MOV20H,#0AHMOV21H,01HLCALLDELY;延时0.5sDJNZR7,JOD1;闪烁次数未到继续状态2的实现过程:实现过程是先将先从A,B口输出数据控制二极管使东西绿灯灭,黄灯亮,南北红灯亮;然后再调用一个延时子程序,延时0.5s;延时完成后通过指令从A,B口输出数据使东西绿灯灭,黄灯灭,南北红灯亮,然后又调用一个演示0.5s的子程序。整个过程中通过R7计数使黄灯亮灭3次。同理,状态3和状态4的实现方法与状态1和状态2的实现方法一样,只是在控制发光二极管的时候从A,B口输出的数据不相同,而程序指令是相同的。延时子程序:程序过程中需要延时10s,0.5s,2s,因为定时时间比较大,所以将定时器的时间定为50ms,然后再根据不同的定时时间循环定时不同次数就可以得到需要的定时时间:10s=50msX20次X10次0.5s=50msX10次2s=50msx20次X2次程序清单:ORG0000HSJMPJOD0ORG01B0HSJMPINT1JOD0:MOVSP,#60HMOVDPTR,#0FF7FHMOVA,#88HMOVX@DPTR,A;8255初始化MOVDPTR,#0FF7CHMOVA,#0B6HMOVX@DPTR,AINCDPTRMOVA,#0DHMOVX@DPTR,A;点亮4个红灯MOV20H,#14HMOV21H,02H;延时2sLCALLDELYJOD3:MOVDPTR,#0FF7CHMOVA,#75HMOVX@DPTR,AINCDPTRMOVA,#0DHMOVX@DPTR,A;东西绿灯亮,南北红灯亮MOV20H,#14HMOV21H,#0AHLCALLDELY;延时10sMOVR7,#03H;闪烁次数JOD1:MOVDPTR,#0FF7CHMOVA,#0F3HMOVX@DPTR,AINCDPTRMOVA,#0CHMOVX@DPTR,A;东西黄灯亮,南北红灯亮MOV20H,#0AHMOV21H,#01HLCALLDELY;延时0.5sMOVDPTR,#0FF7CHMOVA,#0F7HMOVX@DPTR,AINCDPTRMOVA,#0DHMOVX@DPTR,A;南北红灯亮MOV20H,#0AHMOV21H,01HLCALLDELY;延时0.5sDJNZR7,JOD1;闪烁次数未到继续MOVDPTR,#0FF7CHMOVA,#0AEHMOVX@DPTR,AINCDPTRMOVA,#0BHMOVX@DPTR,A;东西红灯亮,南北绿灯亮MOV20H,#14HMOV21H,#0AHLCALLDELY;延时10sMOVR7,#03H;闪烁次数JOD2:MOVDPTR,#0FF7CHMOVA,#9EHMOVX@DPTR,AINCDPTRMOVA,#07HMOVX@DPTR,A;东西红灯亮,南北黄灯亮MOV20H,#0AHMOV21H,#01HLCALLDELY;延时0.5sMOVDPTR,#0FF7CHMOVA,#0BEHMOVX@DPTR,AINCDPTRMOVA,#0FHMOVX@DPTR,A;东西红灯亮MOV20H,#0AHMOV21H,#01HLCALLDELY;延时0.5sDJNZR7,JOD2;闪烁次数未到继续LJMPJOD3;循环延时子程序:DELAY:MOVTMOD#10HMOVTH1,#3CHMOVTL1,#0B0H;定时器装初值MOVER1,20HMOVER2,21HSETBEA;允许全局中断SETBET1;允许定时器1中断SEYBTR1;打开定时器1SJMP$SER:MOVTH1,#3CHMOVTL1,#0B0H;定时器重装初值DJNZR1,NO;循环定时(20H)次MOVR1,20HDJNZR2,NO;循环定时(21H)次MOVR2,21HRETNO:RETIEND谢谢大家!