单片机实验箱一台;PC机一台;USB下载线一根。
三、实验内容
自行编制程序用8255实现交通红绿灯的控制。其控制要求如下:(a)初始状态全为红灯。(b)南北红灯亮并维持25s。在南北红灯亮的同时,东西绿灯也亮,并维持20s。到20s时,东西绿灯闪亮,闪亮3s后熄灭,在东西绿灯熄灭时,东西黄灯亮,并维持2s。到2s时,东西黄灯熄灭,东西红灯亮。与此同时,南北红灯熄灭,南北绿灯亮。(c)东西红灯亮维持30s。南北绿灯亮维持25s,然后闪亮3s再熄灭。同时南北黄灯亮,维持2s后熄灭,这时南北红灯亮,东西绿灯亮。(d)周而复始。其时序如图10-1所示。实验原理图见实验九中的图9-1。
南北红灯东西绿灯东西黄灯东西红灯南北绿灯南北黄灯20S3S2S25S3S2S
图10-1 交通灯控制时序图
五、思考题
1.8255的功能是什么?
2.如何计算8255的端口地址?
本题试验箱没有方向设置,故而编程时忽略了方向方面的设置。PC口接的led灯依次为红、绿、黄(还有一个灯颜色忘记了,)然后又是红、绿、黄??
这个程序主函数while(1)部分设置的非常好,简洁明了。我看过别人写的麻烦的。 实验代码:
#include
#define PC XBYTE[0xbeff]
#define COM8255 XBYTE[0xbfff] #define uint unsigned int #define uchar unsigned char int num;
void delayms(uint xms) //延时函数 {
uint a,b;
for(a=xms;a>0;a--)
for(b=125;b>0;b--); }
void main() {
26
TMOD=0X01;
TH0=(65536-50000)/256; TL0=(65536-50000)%6; TR0=1; ET0=1; EA=1;
COM8255=0x80;
PC=0X3F;//初始红灯 while(1) {
while(num<=400)
{
PC=0X4b; }
num=0;
while(num<=60) {
PC=0X6f;
delayms(100); PC=0X4b;
delayms(100); }
num=0;
while(num<=40) {
PC=0X27; }
num=0;
while(num<=500) {
PC=0x4b; }
num=0;
while(num<=60) {
PC=0x6f;
delayms(100); PC=0x4b;
delayms(100); }
num=0;
while(num<=40) {
PC=0X27;
//红绿20s
//绿闪烁3s,红亮
//红黄2s
//红绿25s
//绿闪烁3s,红亮 //红黄2s
27
} } }
void timer0() interrupt 1 {
TH0=(65536-50000)/256; TL0=(65536-50000)%6; num++; }
实验十一 矩阵键盘识别实验
一、实验目的
(1)掌握4×4矩阵键盘的工作原理和键盘的扫描方式。 (1)掌握键盘的去抖方法和键盘应用程序的设计。
二、实验设备
单片机实验箱一台;PC机一台;USB下载线一根。
三、实验内容
自行编制程序,用51单片机实现4×4矩阵键盘扫描,采用线反转法;并实现当S11按下时在数码管上显值“0”,当S12按下时在数码管上显值“1”??,即依次将S11至S26按下,在数码管上依次显示十六进制数“0-F”,矩阵键盘原理图如图11-1所示。单片机与数码管接口电路原理图见实验五中图5-1所示。
图11-1 矩阵键盘接口电路
四、思考题
28
1.画出所编程序的流程图;
2.若要实现2×4矩阵键盘,软硬件作如何修改。
3.实验中有何故障、问题出现,是否得到解决?如何解决的?
南北红灯东西绿灯东西黄灯东西红灯南北绿灯南北黄灯20S3S2S25S3S2S
实验代码:
#include
#define uchar unsigned char #define uint unsigned int sbit dula=P3^6; sbit wela=P3^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delayms(uchar xms) {
uchar a,b; for(a=xms;a>0;a--) { for(b=125;b>0;b--); } }
void display(uchar a) { dula=1;//wela=0; P0=table[a]; dula=0; //wela=1; // P0=0xfe; //delayms(10); // P0=0xff; }
uchar fun() {
29
uchar number,temp; P2 = 0xfe; temp = P2;
temp = temp&0xf0; while(temp!=0xf0) { delayms(5); temp = P2; temp = temp&0xf0; while(temp!=0xf0) { temp = P2; switch(temp) { case 0xee: number = 0;break; case 0xde: number = 1;break; case 0xbe: number = 2;break; case 0x7e: number = 3;break; } while(temp!=0xf0) { temp = P2; temp = temp&0xf0; } } }
P2 = 0xfd; temp = P2;
temp = temp&0xf0; while(temp!=0xf0) { delayms(5); temp = P2; temp = temp&0xf0; while(temp!=0xf0) { temp = P2; switch(temp) { case 0xed: number = 4;break; case 0xdd: number = 5;break; case 0xbd: number = 6;break;
30