sbit red_nb=P2^0
......
void main()
{
TMOD=
TH0
TL0
ET0
TR0
while(1)//根据楼主所给,有4种状态森巧信
{
state1
state2
state3
state4
}
}
void timer0() interrupt 1 /宽稿/定时器0
{
TH0=0x3c
TL0=0xb0
counter++
}
void state1() //控制南北红灯亮,东西绿灯亮此轮,30s
{
unsigned char temp = 30
red_nb=1
.....
green_dx=1
while(1)
{
if( counter>19){counter=0temp--} //每次counter=20,即1s,temp自减
if(temp) break //当temp为0时,即30秒,退出状态1,进入状态2
}
}
没经过测试,完全是5分诱惑不大。。
通灯显示控制一、前言
(1)通过8255A实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用.
(2)进一步学习微处理器的编程技术.
二、8255的工作原理:
8255有三种方式可以选择:
方式0:基本输入/输出方式;
方式1:樱禅带选通的输入/输出方式
方式2:双向传输方式。卖世
8255为总线兼容型,可以与CPU的总线直接接口。其中,口地址取决于片选CS和A1、A0
如图所示,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、中颂肢L0作为东西路口的交通灯与PC2、PC1、PC0相连。编程时六个灯按交通灯变化规律燃灭。
交通灯变化要求:
(1)、南北路口的绿灯,东西路口的红灯同时亮30秒左右;
(2)、南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮;
(3)、南北路口的红灯,东西路口的绿灯同时亮30秒左右;
(4)、南北路口的红灯继续亮,同时东西路口的黄灯闪烁若干次;
(5)、转(1)重复。
1.硬件原理图如图
2.硬件线路连接
4.流程图
按上面所述过程得出5.程序
DATA SEGMENT
PC DB ?
MESS DB 'ENTER ANY KEY CAN EXIT TO DOS!',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK
STA DW 200 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AH,09H
MOV DX,OFFSET MESS
INT 21H
MOV DX,28BH
MOV AL,10000001B
OUT DX,AL
MOV DX,28AH
IN AL,DX
MOV PC,AL
MOV DX,28BH
MOV AL,10000000B
OUT DX,AL
MOV DX,28AH
MOV AL,PC
MOV DX,28AH
MOV AL,00000000B
OUT DX,AL
LLL: MOV DX,28AH
MOV AL,00100100B 1绿2红
OUT DX,AL
CALL DONE2
CALL DONE2
MOV DX,28AH
MOV AL,01000100B ;1黄2红
OUT DX,AL
CALL DONE2
MOV DX,28AH
MOV AL,10000001B 1红2绿
OUT DX,AL
CALL DONE2
CALL DONE2
MOV DX,28AH
MOV AL,10000010B 1红2黄
OUT DX,AL
CALL DONE 2
MOV AH,06H
MOV DL,0FFH
INT 21H
JNZ PPP
JMP LLL
PPP: MOV AX,4C00H
INT 21H
DONE1 PROC NEAR
PUSH CX
MOV CX,0FFFFH
CC: LOOP CC
POP CX
RET
DONE1 ENDP
DONE2 PROC NEAR
PUSH AX
PUSH CX
MOV CX,0FFFH
UU: CALL DONE1
LOOP UU
POP CX
POP AX
RET
DONE10 ENDP
CODE ENDS
END START
有些东西发不上来 要的Q我
#include <reg51.h>#define uint unsigned int
#define uchar unsigned char
#define BLKN 2 //列锁存器数
sbit G = P1^7 //P1.7为显示丛陪允许控制信号端口
sbit RCLK = P2^0 //P2.0为输出锁存咐茄器时钟信号端
sbit SCLR = P2^1 //P2.1为移位寄存器清○端
void delay(uint) //延时函数
uchar data display[32]//显示缓存
uchar code BMP[][32]={{16,0,16,0,37,248,36,64,120,64,8,64,16,64,32,64,124,64,0,64,0,64,12,64,112,64,3,252,0,0,0,0},
{16,0,19,240,32,16,41,240,120,16,19,252,32,64,122,72,1,80,0,224,25,80,102,76,0,64,1,192,0,0,0,0},
{4,64,4,64,63,248,4,64,127,252,1,0,31,240,17,16,31,240,17,16,31,240,8,32,16,16,32,8,0,0,0,0}} //字模表'红‘’绿‘‘黄’
void main()
{
register uchar i,j
SCON=0x00 //串口工作模式0:移位寄存器方式
TMOD=0x01 //定时器T0工作方式1:16位方式
P1=0x3f//P1端口初值:允许接收、锁存、显示
TR0=1 //启动定时器T0
ET0=1 //允许定时器T0中断
EA=1 //开启总中断;
while(1)
{
delay(2000)
for(j=0j<3j++)
{
for(i=0i<32i++)
{
display[i]=~BMP[j][i]
if (i%2) delay(100)
}
delay(10000)
}
}
}
void delay(uint x)
{
register uchar i,j
for (i=xi>0i--)
for (j=120j>0j--)
}
void leddisplay(void) interrupt 1 using 1
{
register uchar i, j=BLKN
TH0 =(65536-100)/256 //衡郑察设定显示屏刷新率每秒60帧
TL0 =(65536-100)%256
i = P1 //读取当前显示的行号
i = ++i &0x0f //行号加1,屏蔽高4位
while(j)
{
j--
SBUF = display[i*BLKN + j]//送显示数据
while (!TI)
TI = 0
}//完成一行数据的发送
G = 1//消隐(关闭显示)
P1 &= 0xf0 //行号端口清○
RCLK = 1 //显示数据打入输出锁存器
P1 |= i //写入行号
RCLK = 0 //锁存显示数据
G = 0//打开显示
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)