天津理工单片机实验三.docx

上传人:b****2 文档编号:1822969 上传时间:2022-10-24 格式:DOCX 页数:19 大小:893.32KB
下载 相关 举报
天津理工单片机实验三.docx_第1页
第1页 / 共19页
天津理工单片机实验三.docx_第2页
第2页 / 共19页
天津理工单片机实验三.docx_第3页
第3页 / 共19页
天津理工单片机实验三.docx_第4页
第4页 / 共19页
天津理工单片机实验三.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

天津理工单片机实验三.docx

《天津理工单片机实验三.docx》由会员分享,可在线阅读,更多相关《天津理工单片机实验三.docx(19页珍藏版)》请在冰豆网上搜索。

天津理工单片机实验三.docx

天津理工单片机实验三

天津理工大学

计算机与通信工程学院

 

实验报告

 

2014-2015学年第二学期

 

课程名称

单片机原理及接口技术

学号

xxxxx

学生姓名

xx

年级

201x级

专业

物联网工程

课程代码

0664886

实验地点

7-215

实验名称

实验三并口实验

主讲教师

xxx

辅导教师

xxx

成绩

实验(三)

实验名称

并口实验

软件环境

Keil-proteus

实验目的

1.熟悉和掌握AT89C51单片机的并口工作原理;

2.了解和掌握单片机的并口输入输出应用。

实验内容(应包括实验题目、实验要求、实验任务等)

1.实验题目:

80c51汇编语言编程

2.实验要求:

1、LED模拟交通灯

2、开关控制

3、设计题目

3实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)

这次的实验比起上次又有了一定的难度上的提升,不过问题不大,我们进行了相应的相关知识的学习,上次也为用Proteus积累了为数不少的经验,这次用Proteus明显少走了许多的弯路,甚至类似第一个问题的图。

它的左边几乎与上次的最后一个问题完全一致,因此我们可以及时的进行右边的绘图工作,节省了不少时间。

为了下次的实验,这次的绘图我也会及时的保留。

先进行的是第一个,先进行的是辛苦的作图工作。

作图完成

拷贝进去hex文件

进行相应的连接当中,找那个terminal中的那个终端费了比较大的劲,最终还是找到了。

开始的时候中心部分我忘了点上实心的点,这里表示终端。

第一次实验失败之后,我意识到了这个问题,及时的进行了修改。

程序源代码:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitRED_A=P0^0;//东西向灯

sbitYELLOW_A=P0^1;

sbitGREEN_A=P0^2;

sbitRED_B=P0^3;//南北向灯

sbitYELLOW_B=P0^4;

sbitGREEN_B=P0^5;

ucharFlash_Count=0,Operation_Type=1;//闪烁次数,操作类型变量

//延时

voidDelayMS(uintx)

{

uchari;

while(x--)for(i=0;i<120;i++);

}

//交通灯切换

voidTraffic_Light()

{

switch(Operation_Type)

{

case1:

//东西向绿灯与南北向红灯亮

RED_A=1;YELLOW_A=1;GREEN_A=0;

RED_B=0;YELLOW_B=1;GREEN_B=1;

DelayMS(2000);

Operation_Type=2;

break;

case2:

//东西向黄灯闪烁,绿灯关闭

DelayMS(300);

YELLOW_A=~YELLOW_A;GREEN_A=1;

if(++Flash_Count!

=10)return;//闪烁5次

Flash_Count=0;

Operation_Type=3;

break;

case3:

//东西向红灯,南北向绿灯亮

RED_A=0;YELLOW_A=1;GREEN_A=1;

RED_B=1;YELLOW_B=1;GREEN_B=0;

DelayMS(2000);

Operation_Type=4;

break;

case4:

//南北向黄灯闪烁5次

DelayMS(300);

YELLOW_B=~YELLOW_B;GREEN_B=1;

if(++Flash_Count!

=10)return;

Flash_Count=0;

Operation_Type=1;

}

}

//主程序

voidmain()

{

while

(1)Traffic_Light();

}

程序运行截图:

(顺序并非初始顺序)

在那个后面有个第二问,要求大致雷同,只不过把闪烁5次统统换为闪烁3次即可,反映到程序中,就是把所有注释表明的地方中,将10换成6即可,它反映的是一次整个的电位差的变化情况,程序运行与闪烁5次的几乎完全一致,由于程序的运行的频率与时间性静态的截图无法体现,这里就不进行二次截图了。

程序源代码:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitRED_A=P0^0;//东西向灯

sbitYELLOW_A=P0^1;

sbitGREEN_A=P0^2;

sbitRED_B=P0^3;//南北向灯

sbitYELLOW_B=P0^4;

sbitGREEN_B=P0^5;

ucharFlash_Count=0,Operation_Type=1;//闪烁次数,操作类型变量

//延时

voidDelayMS(uintx)

{

uchari;

while(x--)for(i=0;i<120;i++);

}

//交通灯切换

voidTraffic_Light()

{

switch(Operation_Type)

{

case1:

//东西向绿灯与南北向红灯亮

RED_A=1;YELLOW_A=1;GREEN_A=0;

RED_B=0;YELLOW_B=1;GREEN_B=1;

DelayMS(2000);

Operation_Type=2;

break;

case2:

//东西向黄灯闪烁,绿灯关闭

DelayMS(300);

YELLOW_A=~YELLOW_A;GREEN_A=1;

if(++Flash_Count!

=6)return;//闪烁5次

Flash_Count=0;

Operation_Type=3;

break;

case3:

//东西向红灯,南北向绿灯亮

RED_A=0;YELLOW_A=1;GREEN_A=1;

RED_B=1;YELLOW_B=1;GREEN_B=0;

DelayMS(2000);

Operation_Type=4;

break;

case4:

//南北向黄灯闪烁5次

DelayMS(300);

YELLOW_B=~YELLOW_B;GREEN_B=1;

if(++Flash_Count!

=6)return;

Flash_Count=0;

Operation_Type=1;

}

}

//主程序

voidmain()

{

while

(1)Traffic_Light();

}

第二个试验是开关控制,要求如下:

用AT89C51单片机控制四个按键K1到K4和四个发光二极管D1到D4,要求当按下K1或K2键时D1或D2点亮,松开时对应的发光二极管熄灭,当按下K3或K4后,D3或D4不停地闪烁。

Proteus仿真电路如下图。

(1)验证程序实现所要求的功能。

(2)若K3、K4同时按下时,D3和D4同时不停地闪烁,如何改写程序?

首先也是辛苦的作图工作

程序源代码:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitD1=P1^0;

sbitD2=P1^1;

sbitD3=P1^2;

sbitD4=P1^3;

sbitK1=P3^4;

sbitK2=P3^5;

sbitK3=P3^6;

sbitK4=P3^7;

voidDelayMS(uintx)//延时子程序

{

uchart;

while(x--)

{

for(t=120;t>0;t--);

}

}

voidmain()//主程序

{

P1=0xff;//四个二极管暗

while

(1)

{

D1=K1;//D1反映K1开关的状态

D2=K2;//D2反映K2开关的状态

if(K3==0)//K3按下时,D3的状态不停地变反

{

while(K3==0)

{D3=~D3;

DelayMS(10);

}

}

if(K4==0)//K4按下时,D4的状态不停地变反

{

while(K4==0)

{D4=~D4;

DelayMS(10);

}

}

}

}

程序运行截图:

之后进行第一个按钮的测试:

接着进行第二个按钮的测试:

然后进行第三个按钮的测试:

最后进行的是最后一个按钮的测试:

松开之后它还有一定的延时,十分的奇怪:

然后第二问也有了相应的修改要求,不过难度不大,代码修改后运行结果有些差异

程序源代码:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitD1=P1^0;

sbitD2=P1^1;

sbitD3=P1^2;

sbitD4=P1^3;

sbitK1=P3^4;

sbitK2=P3^5;

sbitK3=P3^6;

sbitK4=P3^7;

voidDelayMS(uintx)//延时子程序

{

uchart;

while(x--)

{

for(t=120;t>0;t--);

}

}

voidmain()//主程序

{

P1=0xff;//四个二极管暗

while

(1)

{

D1=K1;//D1反映K1开关的状态

D2=K2;//D2反映K2开关的状态

if((K3==0)&&(K4==0)){

while(K3==0)

{D3=~D3;

DelayMS(10);

}

while(K4==0)

{

D4=~D4;

DelayMS(10);

}

}

由于我个人认为使用鼠标实现同时控制两个按键是不可能的,于是这里借助与相关的离散数学知识就可以解决了

运行通过应该就没问题了

第三个是自己自主创新的试验,具体问题十分的经典,也算是一个经典难题了,程序源代码:

#include

#defineuintunsignedint

#defineucharunsignedchar

voiddelay(uintz);

voidmain()

{

while

(1)

{

P2=0xfe;

P0=0x06;

delay(500);

P2=0xfd;

P0=0x5b;

delay(500);

P2=0xfb;

P0=0x4f;

delay(500);

P2=0xf7;

P0=0x66;

delay(500);

}

}

voidde

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1