51单片机实验报告包含万年历流水灯等.docx

上传人:b****5 文档编号:5792607 上传时间:2023-01-01 格式:DOCX 页数:29 大小:1.51MB
下载 相关 举报
51单片机实验报告包含万年历流水灯等.docx_第1页
第1页 / 共29页
51单片机实验报告包含万年历流水灯等.docx_第2页
第2页 / 共29页
51单片机实验报告包含万年历流水灯等.docx_第3页
第3页 / 共29页
51单片机实验报告包含万年历流水灯等.docx_第4页
第4页 / 共29页
51单片机实验报告包含万年历流水灯等.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

51单片机实验报告包含万年历流水灯等.docx

《51单片机实验报告包含万年历流水灯等.docx》由会员分享,可在线阅读,更多相关《51单片机实验报告包含万年历流水灯等.docx(29页珍藏版)》请在冰豆网上搜索。

51单片机实验报告包含万年历流水灯等.docx

51单片机实验报告包含万年历流水灯等

中国计量学院

 

《单片机原理与应用技术》课程报告

 

题目:

 

专   业

班   级

姓   名

学号

成绩

 

2013年月日

实验1:

流水灯相关实验·············································1

·

实验2:

数码管相关实验·············································3

实验3:

矩阵键盘相关实验···········································8

实验4:

定时器相关实验·············································14

实验5:

LCD相关实验··············································21

实验6:

万年历设计实验·············································25

心得体会·············································31

实验一流水灯相关实验

一、实验任务

学习流水灯电路的基本知识。

二、实验内容

用8个LED设计一个流水灯。

三、实验要求

点亮8个LED,实现交替亮灭,亮灭间隔0.2秒,即实现流水灯。

四、设计思路

原理图:

LED的工作是有方向性的,只有当正级接到LED阳极,负极接到LED的阴极的时候才能工作,如果反接LED是不能正常工作的。

开发板上面LED的原理图如下图,LED的阳极串联一个电阻,然后连接到VCC,而LED的阴极连接到单片机的P1口。

所以,当单片机的IO口为低电平,LED的阳极和阴极之前就会有正向电压差,LED导通,LED发光二级管会发光。

反之当单片机的IO口为高电平LED截止,LED发光二级管不会发光。

先使一个灯亮,然后用一个延时函数使得每0.2秒LED灯左移一位,实现流水灯的效果。

 

流程框图:

程序:

#include

#include

#defineuintunsignedint

voiddelay(uintz);

voidmain()

{uintk;

while

(1)

{

P1=0xfe;

for(k=0;k<7;k++)

{

delay(200);

P1=_crol_(P1,1);//循环左移

}

for(k=0;k<4;k++)

{

delay(200);

P1=_cror_(P1,2);

}

}

}

voiddelay(uintz)//延时1ms

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

五、实验结果

实验流水灯的依次点亮和循环交互功能。

 

实验二数码管相关实验

一、实验任务

学习单片机数码管显示电路衍生。

二、实验内容

用定时器间隔1s在6位数码管上依次显示F、E、D、C….4、3、2、1,重复,同时每显示一次LED灯亮一次。

三、实验要求

1、上电时,六个数码管全显示0,调用定时器使得每过1s数码管改变一次,依次显示F、E、D、C….4、3、2、1。

2、在数码管改变的同时,依次点亮8个LED(间隔也为1s),依此循环。

四、设计思路

原理图:

实验板用共阴LED显示器,根据电路连接图显示16进制数的编码如下表:

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x7b,0x7c,

0123456789AB

0x39,0x5e,0x79,0x71,0x00

CDEF无显示

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。

选亮数码管采用动态扫描显示。

所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

流程框图:

程序:

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

uchartemp,num,aa;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x77,

0x7c,0x39,0x5e,0x79,0x71,};

sbitdula=P2^6;

sbitwela=P2^7;

voiddelay(uintz);

voidmain()

{num=1;

aa=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;//开定时器

TR0=1;

temp=0xfe;

P1=temp;

dula=1;

P0=table[0];

dula=0;

wela=1;

P0=0xc0;

wela=0;

while

(1)

{delay(1000);

temp=_crol_(temp,1);

P1=temp;

}

}

voiddelay(uintz)//延时1ms

{uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidtimer0()interrupt1//中断

{TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

if(aa==40)

{aa=0;

dula=1;

P0=table[16-num];

dula=0;

num++;

if(num==16)

num=0;

}

}

五、实验结果

实现数码管动态显示电路。

 

实验三矩阵键盘相关实验

一、实验任务

学习单片机中按键控制电路的相关实验。

二、实验内容

借用数码管来判别所按的键。

三、实验要求

按下16个矩阵键盘依次在数码管上显示0、1、2、3、…、c、d、e、f

四、设计思路

原理图

矩阵键盘检测的原理和方法:

检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。

当然我们也可以将行线置低电平,扫描列是否有低电平。

再将按矩阵键盘分别显示在数码管上面显示十六进制的0到F。

流程框图:

程序:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitdula=P2^6;

sbitwela=P2^7;

sbitkey1=P3^4;

ucharnum,temp,num1;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x77,

0x7c,0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0};

voiddelay(uintz)//延时1ms

{uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

ucharkeyscan();

voiddisplay(uchar);

voidmain()

{num=17;

dula=1;

P0=0;

dula=0;

wela=1;

P0=0xc0;

wela=0;

while

(1)

{display(keyscan());

}

}

ucharkeyscan()

{P3=0xfe;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{case0xee:

num=1;

break;

case0xde:

num=2;

break;

case0xbe:

num=3;

break;

case0x7e:

num=4;

break;

}

while(temp!

=0xf0)

{temp=P3;

temp=temp&0xf0;

}

}

}

delay(5);

P3=0xfd;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{case0xed:

num=5;

break;

case0xdd:

num=6;

break;

case0xbd:

num=7;

break;

case0x7d:

num=8;

break;

}while(temp!

=0xf0)

{temp=P3;

temp=temp&0xf0;

}

}

}

delay(5);

P3=0xfb;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{case0xeb:

num=9;

break;

case0xdb:

num=10;

break;

case0xbb:

num=11;

break;

case0x7b:

num=12;

break;

}

while(temp!

=0xf0)

{temp=P3;

temp=temp&0xf0;

}

}

}

delay(5);

P3=0xf7;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P3;

switch(temp)

{case0xe7:

num=13;

break;

case0xd7:

num=14;

break;

case0xb7:

num=15;

break;

case0x77:

num=16;

break;

}

while(temp!

=0xf0)

{temp=P3;

temp=temp&0xf0;

}

}

}

returnnum;

}

voiddisplay(ucharaa)

{dula=1;

P0=table[aa-1];

dula=0;

}

五、实验结果

成功实验了矩阵键盘的作用:

人为控制单片机的工作方式。

 

实验四定时器相关实验

一、实验任务

学习单片机开发的定时与显示。

二、实验内容

在数码管上显示出一个数开始下递减,直至另一个数并保持显示此数,与此同时流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,流水灯全部关闭、数码管上显示。

到此保持住。

三、实验要求

利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。

到此保持住。

四、设计思路

原理图:

(将实验二和实验三结合起来,具体见实验二、三)

流程框图:

 

程序:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitdula=P2^6;

sbitwela=P2^7;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x77,

0x7c,0x39,0x5e,0x79,0x71,

0x77,0x73,0x38,0x79};

uchartemp,t0,t1,bai,shi,ge,flag,flag1;

uintshu;

voidinit();

voiddisplay(ucharaa,ucharbb,ucharcc,ucharbai,ucharshi,ucharge);

voiddelay(uintz);

voidmain()

{init();

while

(1)

{if(flag1!

=1)

display(1,2,3,bai,shi,ge);

else

display(16,17,17,18,19,20);

}

}

voidinit()

{shu=432;

temp=0xfe;

P1=temp;

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

ET0=1;

ET1=1;

TR1=1;

TR0=1;

}

voidtimer0()interrupt1

{TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t0++;

if(flag!

=1)

{if(t0==10)

{t0=0;

temp=_crol_(temp,1);

P1=temp;

}

}

else

{if(t0%4==0)

{P1=~P1;

if(t0==60)

{TR0=0;

P1=0xff;

flag1=1;

}

}

}

}

voidtimer1()interrupt3

{TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

t1++;

if(t1==2)

{t1=0;

shu--;

bai=shu/100;

shi=shu%100/10;

ge=shu%10;

if(shu==398)

{TR0=0;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

flag=1;

P1=0xff;

TR1=0;

}

}

}

voiddelay(uintz)

{uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voiddisplay(ucharaa,ucharbb,ucharcc,ucharbai,ucharshi,ucharge)

{dula=1;

P0=table[aa];

dula=0;

wela=1;

P0=0xfe;

wela=0;

delay(5);

dula=1;

P0=table[bb];

dula=0;

wela=1;

P0=0xfd;

wela=0;

delay(5);

dula=1;

P0=table[cc];

dula=0;

wela=1;

P0=0xfb;

wela=0;

delay(5);

dula=1;

P0=table[bai];

dula=0;

wela=1;

P0=0xf7;

wela=0;

delay(5);

dula=1;

P0=table[shi];

dula=0;

wela=1;

P0=0xef;

wela=0;

delay(5);

dula=1;

P0=table[ge];

dula=0;

wela=1;

P0=0xdf;

wela=0;

delay(5);

}

五、实验结果

实现定时器的功能:

计时和中断控制电路。

 

实验五1602相关实验

一、实验任务

学习1602的特殊作用以及在电路中的应用。

二、实验内容

利用单片机在LCD1602上显示出字符。

三、实验要求

能够在LCD1602液晶模块上的任意位置显示任意字符。

四、设计思路

原理图:

时序:

①当我们要写指令字,设置LCD1602的工作方式时:

需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

②当我们要写入数据字,在1602上实现显示时:

需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

流程框图:

程序:

#include

#defineGPIO_LCDP0

sbitLCDE=P2^7;

sbitRW=P2^5;

sbitRS=P2^6;

unsignedchartable[]="HappyEveryday";

unsignedchartable1[]="2013-12-22";

voidDelay1ms(unsignedinta)

{

unsignedintb,c;

for(c=a;c>0;c--)

for(b=110;b>0;b--);

}

voidLcdWriteCom(unsignedcharcom)//写入命令

{

RS=0;

RW=0;

GPIO_LCD=com;

Delay1ms(10);

LCDE=1;

Delay1ms(10);

LCDE=0;

}

voidLcdWriteData(unsignedchardat)//写入数据

{

RS=1;

RW=0;

GPIO_LCD=dat;

Delay1ms(10);

LCDE=1;

Delay1ms(10);

LCDE=0;

}

voidLcdInit()//LCD初始化子程序

{

LcdWriteCom(0x3c);//开显示

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1

LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点

}

voidmain()

{

unsignedchari;

LcdInit();

for(i=0;i<16;i++)

LcdWriteData(table[i]);

LcdWriteCom(0x80+0x40);

for(i=0;i<11;i++)

LcdWriteData(table1[i]);

while

(1)

{

}

}

五、实验结果

实验结果成功,可以用LCD1602在任意位置显示字符。

实验六万年历设计实验

1.设计任务及要求:

任务:

设计一个用51单片机控制的电子万年历:

1、显示年月日时分秒及其星期信息。

2、具有可调整日期和时间功能。

3、具有闹钟功能。

4、采用LCD1602显示时间数据。

要求:

1具有基本的时钟功能,显示年、月、日、星期、时、分、秒。

2可以对年份,月份,日期,和时钟进行调节。

3具有闹钟模式,可设置闹铃时间。

4掉电后,可保存有关数据至实验板上的E

PROM器件。

上电后,继续上次的数据进行计时。

2、程序流程图构建:

 

 

四.实验原理图

 

心得体会

通过这个学期对51单片机的学习,收获很多。

虽然在我刚开始编程序时,对书本的依赖性很大,喜欢套用书上的语句,却对语句的理解不够。

于是当程序出现问题时,不知道如何修改,眼前的程序都是一块一块的被拼凑整合起来的,没法知道哪里错了。

但是编程是一件很严肃的事情,容不得半点错误。

于是便只能狠下决心,坚持自己编写,即使套用时,也把每条语句弄懂。

也能激发了学习的兴趣。

渐渐地也对单片机有了一个初步的了解。

开始能够够独立的看懂51单片机一些简单的模块,比如数码管,流水灯模块,并且能够自己写程序来驱动而不靠书本。

然后也能看懂一些简单的芯片时序图,比如在控制1602的时候可以根据1602的时序图来写驱动程序。

在学习这门课程时,我遇到过许多困难,这并不可怕,因为只要我们敢于面对,团结合作,就没有解决不了的问题。

在焊接电路过程中,我们需要互相学习焊接技巧,互相帮助、互相鼓励。

在编写程序的时候,要善于把自己好的算法给大家分享,不会的时候要虚心向同学和老师请教。

当然更要利用当今社会为我们提供的网络资源,学会在网络上搜索资料,自主学习。

切忌拿别人做好的实验和编写好的程序去蒙混过关,这样对自己百害无一利。

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

当前位置:首页 > 初中教育 > 数学

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

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