一、实验目的
1、学习在单片机系统中扩展简单1/0接口的方法;
2、学习数据输出程序的设计方法;
二、实验内容
1、以741S276做为输出口,控制十二个发光二极管的亮灭,模拟交通灯控制;
2、观察发光二极管的状态是否满足实验要求。
实验说明:
本实验是模拟交通灯控制,故实验前首先应该了解交通灯的亮灭规律。
设某十字路口2、4为南、北方向,1、3为东、西方向。初始状态为四个路口的红灯全亮。然后,东、西路口绿灯亮,南、北路口红灯亮,东、西路口通车。延迟一段时间后,东、西路口绿灯灭,黄灯开始闪烁。黄灯闪烁若干次后,东、西路口红灯亮,南、北路口绿灯亮,南、北方向通车。延迟一段时间后,南、北路口绿灯灭,黄灯闪烁。黄灯闪烁若干次后,再切换到东、西路口方向。······
本实验所用发光二极管为共阳极,由于阴极处接有与非门,故输出高电平亮。
三、实验参考电路图
四、实验程序框图
五、实验步骤
1. 连接好复位电路,并与单片机U0的RST端相连;
2. 连接好晶振电路,并与单片机U0的XTAL1和XTAL2端相连;
3. 将U1(74LS273),U2(74LS273)的D0~D7与单片机U0的P1.0~P1.7相连;
4. 将或非门U4:A(74LS02)的输入端一端接地, 另一端与单片机U0的P2.6/A14相连,输出端与U1的MR和CLK端相连;
5. 将或非门U6:A(74LS02)的输入端一端接地, 另一端与单片机U0的P2.7/A15相连,输出端与U2的MR和CLK端相连;
6. 将非门U3(74LS04),U7(74LS04)的输入端与U1,U2的Q0~Q7相连, 输出端与对应的发光二极管的阴极相连
7. 将发光二极管的阳极与限流电阻相连, 再与高电平相连。
六、程序清单
#include "reg51.h"
#include <intrins.h>
#define UCH unsigned char
// delay for (time) s
void delay(UCH time);
// send data to the first 74LS273
void senddata_1();
// send data to the second 74LS273
void senddata_2();
// all red on, others off
// time : this stage lasts for (time) seconds
void allred(UCH time);
// west and east are passable
// west and east : green on, others off
// north and south : red on others off
// time : this stage lasts for (time) seconds
void we_passable(UCH time);
// north and south are passable
// west and east : red on, others off
// north and south : green on, others off
// time : this stage lasts for (time) seconds
void ns_passable(UCH time);
// west and east are waiting for red on
// west and east : yellow flicker, others off
// flicker every 2 seconds (yellow on for 1s, yellow off for 1s)
// north and south : red on, others off
// time : this stage lasts for (time * 2) seconds
void we_wait(UCH time);
// north and south are waiting for red on
// north and south : yellow flicker, others off
// flicker every 2 seconds (yellow on for 1s, yellow off for 1s)
// west and east : red on, others off
// time : this stage lasts for (time *2) seconds
void ns_wait(UCH time);
sbit sw1 = P2 ^ 6; //use P2.6 to contral the first 74LS273
sbit sw2 = P2 ^ 7; //use P2.7 to contral the second 74LS273
void main() {
//start : all red on
allred(1);
// loop on
while (1) {
// 1st
// west and east, green on
// north and south, red on
we_passable(30);
//2st
// west and east, green off, yellow flicker
we_wait(3);
//3rd
//west and east, red on
//north and south, red off, green on
ns_passable(30);
//4th
//north and south, green off, yellow flicker
ns_wait(3);
}
}
// send data to the first 74LS273
void senddata_1() {
sw1 = 1;
sw1 = 0;
}
// send data to the second 74LS273
void senddata_2() {
sw2 = 1;
sw2 = 0;
}
//delay time s
void delay(UCH time) {
UCH i, j, k;
for (; time > 0; time--) {
for (k = 10; k > 0; k--) {
for (i = 250; i > 0; i--) {
for (j = 133; j > 0; j--) {
_nop_();
}
}
}
}
}
void allred(UCH time) {
P1 = 0x49;
senddata_1();
P1 = 0x02;
senddata_2();
delay(time);
}
void we_passable(UCH time) {
P1 = 0x0C;
senddata_1();
P1 = 0x03;
senddata_2();
delay(time);
}
void ns_passable(UCH time) {
P1 = 0x61;
senddata_1();
P1 = 0x08;
senddata_2();
delay(time);
}
void we_wait(UCH time) {
for (; time > 0; time--) {
P1 = 0x8A;
senddata_1();
P1 = 0x02;
senddata_2();
delay(1);
P1 = 0x08;
senddata_1();
P1 = 0x02;
senddata_2();
delay(1);
}
}
void ns_wait(UCH time) {
for (; time > 0; time--) {
P1 = 0x51;
senddata_1();
P1 = 0x04;
senddata_2();
delay(1);
P1 = 0x41;
senddata_1();
P1 = 0x00;
senddata_2();
delay(1);
}
}
七、实验分析
1. 锁存器74LS273的工作机制为:当MR脚为低电平时,无论CLK脚有无脉冲,数据端(D端)是高或低电平,输出端(Q端)都为低电平;仅当MR脚为高电平时,“D”端的数据在脉冲的上升期间被传送到“Q”端, 如下表所示:
Tabel 1.truth table of 74LS273 |
|||
MR |
CLK |
Di |
Qi |
L |
X |
X |
L |
H |
|
H |
H |
H |
|
L |
L |
i = 0~7 |
|||
L – low logic level, H – high logic level |
|||
X – immaterial |
故而在该电路中,P2.6/A14(P2.7/A15)由高电平变为低电平时,P1脚的状态输出至U1(U2)的Q端。
2. 本实验中采取软件延时,即在循环中不断发出NOP指令以达到延时的目的。在C语言中使用软件计时,为提高精准度,需要注意:
a) 循环控制变量类型为unsigned char;
b) 使用自减循环。
本文由 joe_zhouman 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:2019-07-15 00:00:00