单片机实验报告含流水灯交通灯时钟双机通讯Word格式.docx
- 文档编号:8065110
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:36
- 大小:225.25KB
单片机实验报告含流水灯交通灯时钟双机通讯Word格式.docx
《单片机实验报告含流水灯交通灯时钟双机通讯Word格式.docx》由会员分享,可在线阅读,更多相关《单片机实验报告含流水灯交通灯时钟双机通讯Word格式.docx(36页珍藏版)》请在冰点文库上搜索。
{
while(--k);
}while(--j);
}while(--i);
}
//====================延时300毫秒=====================
voidDelay300ms()
i=13;
j=156;
k=83;
//========================流水灯顺时针旋转=======================
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;
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;
P3_3=0;
P3_4=0;
P3_5=0;
}
//========================流水灯逆时针旋转(interrupt0)=======
voidint0()interrupt0
EX0=0;
P4_4=1;
P3_3=1;
P2=0xff;
P3_5=0;
Delay300ms();
P3_5=1;
if(P0_5==0)break;
P3_4=0;
P3_4=1;
P3_3=0;
P4_4=0;
P2=0x7f;
for(n=0;
P2=P2>
>
P2=P2|0x80;
if(n==7)break;
if(P0_5==0)break;
}
//============================所有灯点亮并闪烁三下=============
voidSSS()
uintm,n;
EX0=0;
//所有灯顺时针点亮
Delay100ms();
{
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;
}
//==========================主函数=========================
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个共阴极四位数码管
intrins.h>
#defineucharunsignedchar
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;
//位定义
sbitP0_7=P0^7;
//===================================延时1毫秒======================
voidDelay1ms()
unsignedchari,j;
_nop_();
i=11;
j=190;
while(--j);
//==================================延时300毫秒=====================
//=====================================数码管显示==================
voiddisplay(ucharN,M)
P1M0=0xff;
P1M1=0x00;
P0=chocode[3];
P1=table[M];
Delay1ms();
P0=chocode[2];
P1=table[N];
P0=chocode[1];
P1=table[0];
P0=chocode[0];
//========================扫描键盘,设置倒计时初值===============
voidScan_Key(void)
ucharm;
bitFLAG0=0;
P3_7=1;
P0=0xff;
m=P0;
switch(m&
0xf0)
case0xd0:
N++;
FLAG0=1;
break;
case0xb0:
M++;
default:
break;
if(FLAG0)
while((P0|0x0f)!
=0xff)//松手检测
display(N,M);
else
display(N,M);
P3_6=1;
P3_7=0;
N--;
M--;
//==========================主函数==============================
main()
{
P4SW|=0x10;
P1=0x0;
while
(1)
uchari;
Scan_Key();
//扫描键盘,确定倒计时初值
if(P0_7==0)//检测是否开始倒计时
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;
}
if(M==0)
M=9;
N--;
elseM--;
1)如何进行按键扫描,使得每一次按键都能有效?
通过看书后面的例题,在结合课设核心板的具体情况,自己慢慢摸索出来了扫描键盘的方法。
2)怎样实现按一下按键,数码管显示的数值加1或者减1?
首先自己试了试很多种方法,但无论如何都无法实现此功能,最后通过询问同学才知道,在按下按键时要才用“松手检测”的方法,即当按下按键时数码管一直显示当前值,此方法用while()语句实现。
3)单片机的定时器最大只能实现几十毫秒的定时,怎样才能实现定时一秒的功能?
解决方法:
利用for循环语句使定时器多执行几次定时功能,然后再跳出循环语句,这样就能实现一秒的定时功能了。
实验三双机通信实验
UART串行通信接口技术应用
双机通信,当两块板的按键按下时,对方的数码管上显示该键键值
实验中用到硬件有:
两块课程设计核心板,四根杜邦线
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
i=108;
j=144;
//================确定定时器和串行口工作方式以及波特率计算===========
voidUartInit(void)//9600bps@11.0592MHz
PCON&
=0x7F;
//波特率不倍速
SCON=0x50;
//8位数据,可变波特率
AUXR&
=0xBF;
//定时器1时钟为Fosc/12,即12T
=0xFE;
//串口1选择定时器1为波特率发生器
TMOD&
=0x0F;
//清除定时器1模式位
TMOD|=0x20;
//设定定时器1为8位自动重装方式
TL1=0xFD;
//设定定时初值
TH1=0xFD;
//设定定时器重装值
ET1=0;
//禁止定时器1中断
TR1=1;
//启动定时器1
ES=1;
//开串口
EA=1;
//开总中断
//====================================键盘扫描=======================
ucharm,i;
bitFLAG0=0;
P3_6=0;
P3_7=1;
for(i=0;
2;
i++)
P0=0xf7;
//设置P0口,P0^3位是0,即最右边的数码管显示键值
Delay10ms();
//延时10毫秒,给按键消抖
n=i*3+1;
//检测第一列按键是否被按下,如果有则是table[i*3+1]键
//表示有按键被按下
n=i*3+2;
//检测第二列按键是否被按下,如果有则是table[i*3+2]键
case0x70:
n=i*3+3;
//检测第三列按键是否被按下,如果有则是table[i*3+3]键
//================================串行口发送========================
voidsend()
SBUF=table[n];
while(!
TI);
TI=0;
}
//================================串行口接收=========================
voidreceive()
while(RI==0);
P1=SBUF;
RI=0;
//===============================主函数=============================
UartInit();
//强推挽输出,使数码管更亮
Scan_Key();
send();
receive();
1)不懂得双机通信的原理。
仔细看书,不懂的地方问同学,参考书生的例程,最终把双机通信的原理弄懂了。
2)怎样实现串口的接收与发送数据?
翻阅参考资料,与同学一起探讨商量,最终找到了较好的办法。
实验四交通灯实验
1)按键、数码管、发光二极管综合应用编程技术
2)数据存储于EEPROM的技术(也可以不使用)
3)定时中断技术
4)按键中断技术
模拟交通灯:
通过按键1和按键2设置红灯点亮时间,通过按键4和按键5设置绿灯点亮时间(注意:
红灯时间要比绿灯时间多两秒),设置好时间后按下按键3,交通灯开始工作,交通灯工作时按下按键6,所有红灯点亮(出现紧急情况),再次按下按键6恢复正常。
实验中用到的硬件有:
1块stc51单片机、12个发光二极管、6个按键、1个共阴极四位数码管
实验程序如下:
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharN,U,M,K,a,b,c,d;
//位定义
sbitP1_7=P1^7;
//==========================延时1毫秒=============================
voidDelay1ms()//@11.0592MHz
//===========================延时10毫秒============================
//==============================数码管显示====================
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告 流水 交通灯 时钟 双机 通讯
![提示](https://static.bingdoc.com/images/bang_tan.gif)