单片机实验报告含流水灯交通灯时钟双机通讯.docx

上传人:b****8 文档编号:11485973 上传时间:2023-03-01 格式:DOCX 页数:36 大小:225.25KB
下载 相关 举报
单片机实验报告含流水灯交通灯时钟双机通讯.docx_第1页
第1页 / 共36页
单片机实验报告含流水灯交通灯时钟双机通讯.docx_第2页
第2页 / 共36页
单片机实验报告含流水灯交通灯时钟双机通讯.docx_第3页
第3页 / 共36页
单片机实验报告含流水灯交通灯时钟双机通讯.docx_第4页
第4页 / 共36页
单片机实验报告含流水灯交通灯时钟双机通讯.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

单片机实验报告含流水灯交通灯时钟双机通讯.docx

《单片机实验报告含流水灯交通灯时钟双机通讯.docx》由会员分享,可在线阅读,更多相关《单片机实验报告含流水灯交通灯时钟双机通讯.docx(36页珍藏版)》请在冰豆网上搜索。

单片机实验报告含流水灯交通灯时钟双机通讯.docx

单片机实验报告含流水灯交通灯时钟双机通讯

实验一流水灯实验

一、实验目的

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);

}

//==============================数码管显示====================

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

当前位置:首页 > 农林牧渔 > 林学

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

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