天津理工单片机实验三.docx
《天津理工单片机实验三.docx》由会员分享,可在线阅读,更多相关《天津理工单片机实验三.docx(19页珍藏版)》请在冰豆网上搜索。
天津理工单片机实验三
天津理工大学
计算机与通信工程学院
实验报告
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