单片机实验报告含流水灯交通灯时钟双机通讯.docx
《单片机实验报告含流水灯交通灯时钟双机通讯.docx》由会员分享,可在线阅读,更多相关《单片机实验报告含流水灯交通灯时钟双机通讯.docx(36页珍藏版)》请在冰豆网上搜索。
![单片机实验报告含流水灯交通灯时钟双机通讯.docx](https://file1.bdocx.com/fileroot1/2023-3/1/7c623328-0d2e-4e96-87b5-63b550918fb3/7c623328-0d2e-4e96-87b5-63b550918fb31.gif)
单片机实验报告含流水灯交通灯时钟双机通讯
实验一流水灯实验
一、实验目的
1)简单I/O引脚的输出
2)掌握软件延时编程方法
3)简单按键输入捕获判断
二、实验实现的功能
按下电源开关,首先所有发光二极管点亮并闪烁三下,然后顺时针依次亮灭,形成顺时针流水灯。
在发光二极管顺时针旋转时,按下按键1,则发光二级管逆时针依次亮灭,形成逆时针流水灯。
当再次按下按键1时,又恢复顺时针流水灯。
三、系统硬件设计
四、系统软件设计
试验程序如下:
#include<10f08.h>
#defineuintunsignedint
sbitP3_2=P3^2;
sbitP3_3=P3^3;
sbitP3_4=P3^4;
sbitP3_5=P3^5;
sbitP3_6=P3^6;
sbitP3_7=P3^7;
sbitP0_5=P0^5;
sbitP0_6=P0^6;
sbitP4_4=P4^4;
//===============延时100毫秒=================
voidDelay100ms()
{
unsignedchari,j,k;
i=5;
j=52;
k=195;
do
{
do
{
while(--k);
}while(--j);
}while(--i);
}
//====================延时300毫秒=====================
voidDelay300ms()
{
unsignedchari,j,k;
i=13;
j=156;
k=83;
do
{
do
{
while(--k);
}while(--j);
}while(--i);
}
//========================流水灯顺时针旋转=======================
voidshun_z()
{
uintm,n;
bita;
for(m=0;m==0;)
{
EX0=1;//开外部中断0
a=P0_5;//将P0_5口赋给P3_2口
P3_2=a;
P2=0xfe;
P4_4=1;
a=P0_5;
P3_2=a;
P3_3=1;
P3_4=1;
P3_5=1;
Delay300ms();
for(n=0;n<8;n++)
{
a=P0_5;
P3_2=a;
P2=P2<<1;
P2=P2|0x01;
if(n==7)break;
Delay300ms();
}
P4_4=0;
Delay300ms();
P4_4=1;
P3_3=0;
Delay300ms();
P3_3=1;
P3_4=0;
Delay300ms();
P3_4=1;
P3_5=0;
Delay300ms();
P3_5=1;
}
}
//========================流水灯逆时针旋转(interrupt0)=======
voidint0()interrupt0
{
uintm,n;
EX0=0;
for(m=0;m==0;)
{
P4_4=1;
P3_3=1;
P2=0xff;
P3_5=0;
Delay300ms();
P3_5=1;
if(P0_5==0)break;
P3_4=0;
Delay300ms();
P3_4=1;
if(P0_5==0)break;
P3_3=0;
Delay300ms();
P3_3=1;
if(P0_5==0)break;
P4_4=0;
Delay300ms();
P4_4=1;
if(P0_5==0)break;
P2=0x7f;
Delay300ms();
if(P0_5==0)break;
for(n=0;n<8;n++)
{
P2=P2>>1;
P2=P2|0x80;
if(n==7)break;
Delay300ms();
if(P0_5==0)break;
}
if(P0_5==0)break;
}
}
//============================所有灯点亮并闪烁三下=============
voidSSS()
{
uintm,n;
EX0=0;
P2=0xfe;//所有灯顺时针点亮
P4_4=1;
P3_3=1;
P3_4=1;
P3_5=1;
Delay100ms();
for(n=0;n<8;n++)
{
P2=P2<<1;
if(n==7)break;
Delay100ms();
}
P4_4=0;
Delay100ms();
P3_3=0;
Delay100ms();
P3_4=0;
Delay100ms();
P3_5=0;
Delay100ms();
for(m=0;m<4;m++)//所有灯闪三下
{
P2=0x00;
P4_4=0;
P3_3=0;
P3_4=0;
P3_5=0;
Delay300ms();
P2=0xff;
P4_4=1;
P3_3=1;
P3_4=1;
P3_5=1;
Delay300ms();
}
Delay300ms();
}
//==========================主函数=========================
voidmain()
{
P4SW|=0x10;//将P4_4口定义为普通I/O口
P3_6=0;
IT0=0;
EX0=1;
EA=1;
SSS();
shun_z();
}
五、实验过程中遇到的问题及解决方法
1)如何将外部中断0与按键1联系到一起?
解决方法:
通过设置一个中间变量a,将按键1的端口P0^5的值赋给a,再把a的值赋给外部中断0的端口P3^2,这样问题就解决了。
2)外部中断0的端口与灯D9的端口重合,怎样才能使它们相互不受影响?
解决方法:
利用杜邦线吧D9的端口移到空管脚P4^4上,但是在此之前要把P4^4端口定义为普通I/O口才可以用。
定义方法为在主函数里写一条语句,P4SW|=0x10,这样问题就解决了。
指导老师签字:
日期:
实验二定时器实验
一、实验目的
1)数码管动态显示技术
2)定时器的应用
3)按键功能定义
二、实验实现的功能
利用按键1、2、4、5设置定时器初值,按键1和按键4分别实现十位加一和减一功能,按键2和键5分别实现个位加一和减一功能,按下键3,开始倒计时,时间到所有灯开始闪烁。
三、系统硬件设计
试验中用到的硬件有:
1块stc51单片机、5个按键、1个共阴极四位数码管
四、系统软件设计
试验程序如下:
#include<10f08.h>
#include
#defineucharunsignedchar
#defineuintunsignedint
Ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的共阴极字段码表
ucharchocode[]={0xfe,0xfd,0xfb,0xf7};//位选码表
ucharN,M;
sbitP3_5=P3^5;//位定义
sbitP3_6=P3^6;
sbitP3_7=P3^7;
sbitP4_4=P4^4;
sbitP3_3=P3^3;
sbitP3_4=P3^4;
sbitP0_7=P0^7;
//===================================延时1毫秒======================
voidDelay1ms()
{
unsignedchari,j;
_nop_();
i=11;
j=190;
do
{
while(--j);
}while(--i);
}
//==================================延时300毫秒=====================
voidDelay300ms()
{
unsignedchari,j,k;
i=13;
j=156;
k=83;
do
{
do
{
while(--k);
}while(--j);
}while(--i);
}
//=====================================数码管显示==================
voiddisplay(ucharN,M)
{
P1M0=0xff;
P1M1=0x00;
P0=chocode[3];
P1=table[M];
Delay1ms();
P0=chocode[2];
P1=table[N];
Delay1ms();
P0=chocode[1];
P1=table[0];
Delay1ms();
P0=chocode[0];
P1=table[0];
Delay1ms();
}
//========================扫描键盘,设置倒计时初值===============
voidScan_Key(void)
{
ucharm;
bitFLAG0=0;
P3_6=0;
P3_7=1;
P0=0xff;
m=P0;
switch(m&0xf0)
{
case0xd0:
N++;
FLAG0=1;
break;
case0xb0:
M++;
FLAG0=1;
break;
default:
break;
}
if(FLAG0)
{
while((P0|0x0f)!
=0xff)//松手检测
{
display(N,M);
}
}
else
{
display(N,M);
}
P3_6=1;
P3_7=0;
P0=0xff;
m=P0;
switch(m&0xf0)
{
case0xd0:
N--;
FLAG0=1;
break;
case0xb0:
M--;
FLAG0=1;
break;
default:
break;
}
if(FLAG0)
{
while((P0|0x0f)!
=0xff)//松手检测
{
display(N,M);
}
}
else
{
display(N,M);
}
P3_7=1;
P3_6=0;
}
//==========================主函数==============================
main()
{
P4SW|=0x10;//将P4_4口定义为普通I/O口
P1=0x0;
while
(1)
{
uchari;
Scan_Key();//扫描键盘,确定倒计时初值
P0=0xff;
if(P0_7==0)//检测是否开始倒计时
{
while((P0|0x0f)!
=0xff)//松手检测
{
display(N,M);
}
while
(1)//定时开始
{
for(i=0;i<120;i++)//循环定时120次,实现定时1秒钟
{
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
TR0=1;
display(N,M);
do{display(N,M);}while(TF0==0);//检测是否完成一次定时
}
if((M|N)==0)//定时到,所有灯闪烁
{
while
(1)
{
P0=0xff;
P2=0x00;
P4_4=0;
P3_3=0;
P3_4=0;
P3_5=0;
Delay300ms();
P2=0xff;
P4_4=1;
P3_3=1;
P3_4=1;
P3_5=1;
Delay300ms();
}
}
if(M==0)
{
M=9;
N--;
}
elseM--;
}
}
}
}
五、实验过程中遇到的问题及解决方法
1)如何进行按键扫描,使得每一次按键都能有效?
解决方法:
通过看书后面的例题,在结合课设核心板的具体情况,自己慢慢摸索出来了扫描键盘的方法。
2)怎样实现按一下按键,数码管显示的数值加1或者减1?
解决方法:
首先自己试了试很多种方法,但无论如何都无法实现此功能,最后通过询问同学才知道,在按下按键时要才用“松手检测”的方法,即当按下按键时数码管一直显示当前值,此方法用while()语句实现。
3)单片机的定时器最大只能实现几十毫秒的定时,怎样才能实现定时一秒的功能?
解决方法:
利用for循环语句使定时器多执行几次定时功能,然后再跳出循环语句,这样就能实现一秒的定时功能了。
指导老师签字:
日期:
实验三双机通信实验
一、实验目的
UART串行通信接口技术应用
二、实验实现的功能
双机通信,当两块板的按键按下时,对方的数码管上显示该键键值
三、系统硬件设计
实验中用到硬件有:
两块课程设计核心板,四根杜邦线
四、系统软件设计
试验程序如下:
#include<10f08.h>
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};//0~6的共阴极字段码表
sbitP3_6=P3^6;//位定义
sbitP3_7=P3^7;
sbitP0_3=P0^3;
ucharn;
//==================================延时10毫秒======================
voidDelay10ms()//@11.0592MHz
{
unsignedchari,j;
_nop_();
_nop_();
i=108;
j=144;
do
{
while(--j);
}while(--i);
}
//================确定定时器和串行口工作方式以及波特率计算===========
voidUartInit(void)//9600bps@11.0592MHz
{
PCON&=0x7F;//波特率不倍速
SCON=0x50;//8位数据,可变波特率
AUXR&=0xBF;//定时器1时钟为Fosc/12,即12T
AUXR&=0xFE;//串口1选择定时器1为波特率发生器
TMOD&=0x0F;//清除定时器1模式位
TMOD|=0x20;//设定定时器1为8位自动重装方式
TL1=0xFD;//设定定时初值
TH1=0xFD;//设定定时器重装值
ET1=0;//禁止定时器1中断
TR1=1;//启动定时器1
ES=1;//开串口
EA=1;//开总中断
}
//====================================键盘扫描=======================
voidScan_Key(void)
{
ucharm,i;
bitFLAG0=0;
P3_6=0;
P3_7=1;
for(i=0;i<2;i++)
{
P0=0xf7;//设置P0口,P0^3位是0,即最右边的数码管显示键值
m=P0;
Delay10ms();//延时10毫秒,给按键消抖
switch(m&0xf0)
{
case0xd0:
n=i*3+1;//检测第一列按键是否被按下,如果有则是table[i*3+1]键
FLAG0=1;//表示有按键被按下
break;
case0xb0:
n=i*3+2;//检测第二列按键是否被按下,如果有则是table[i*3+2]键
FLAG0=1;
break;
case0x70:
n=i*3+3;//检测第三列按键是否被按下,如果有则是table[i*3+3]键
FLAG0=1;
break;
default:
break;
}
P3_6=1;
P3_7=0;
}
}
//================================串行口发送========================
voidsend()
{
SBUF=table[n];
while(!
TI);
TI=0;
}
//================================串行口接收=========================
voidreceive()
{
while(RI==0);
P1=SBUF;
RI=0;
}
//===============================主函数=============================
main()
{
UartInit();
P1M0=0xff;//强推挽输出,使数码管更亮
P1M1=0x00;
P1=0x0;
while
(1)
{
Scan_Key();
send();
receive();
}
}
五、实验过程中遇到的问题及解决方法
1)不懂得双机通信的原理。
解决方法:
仔细看书,不懂的地方问同学,参考书生的例程,最终把双机通信的原理弄懂了。
2)怎样实现串口的接收与发送数据?
解决方法:
翻阅参考资料,与同学一起探讨商量,最终找到了较好的办法。
指导老师签字:
日期:
实验四交通灯实验
一、实验目的
1)按键、数码管、发光二极管综合应用编程技术
2)数据存储于EEPROM的技术(也可以不使用)
3)定时中断技术
4)按键中断技术
二、实验实现的功能
模拟交通灯:
通过按键1和按键2设置红灯点亮时间,通过按键4和按键5设置绿灯点亮时间(注意:
红灯时间要比绿灯时间多两秒),设置好时间后按下按键3,交通灯开始工作,交通灯工作时按下按键6,所有红灯点亮(出现紧急情况),再次按下按键6恢复正常。
三、系统硬件设计
实验中用到的硬件有:
1块stc51单片机、12个发光二极管、6个按键、1个共阴极四位数码管
四、系统软件设计
实验程序如下:
#include<10f08.h>
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的共阴极字段码表
ucharchocode[]={0xfe,0xfd,0xfb,0xf7};//位选码表
ucharN,U,M,K,a,b,c,d;
sbitP3_5=P3^5;//位定义
sbitP3_6=P3^6;
sbitP3_7=P3^7;
sbitP4_4=P4^4;
sbitP3_2=P3^2;
sbitP3_3=P3^3;
sbitP3_4=P3^4;
sbitP0_7=P0^7;
sbitP1_7=P1^7;
//==========================延时1毫秒=============================
voidDelay1ms()//@11.0592MHz
{
unsignedchari,j;
_nop_();
i=11;
j=190;
do
{
while(--j);
}while(--i);
}
//===========================延时10毫秒============================
voidDelay10ms()//@11.0592MHz
{
unsignedchari,j;
_nop_();
_nop_();
i=108;
j=144;
do
{
while(--j);
}while(--i);
}
//==============================数码管显示====================