51单片机实验报告包含万年历流水灯等.docx
《51单片机实验报告包含万年历流水灯等.docx》由会员分享,可在线阅读,更多相关《51单片机实验报告包含万年历流水灯等.docx(29页珍藏版)》请在冰豆网上搜索。
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的时序图来写驱动程序。
在学习这门课程时,我遇到过许多困难,这并不可怕,因为只要我们敢于面对,团结合作,就没有解决不了的问题。
在焊接电路过程中,我们需要互相学习焊接技巧,互相帮助、互相鼓励。
在编写程序的时候,要善于把自己好的算法给大家分享,不会的时候要虚心向同学和老师请教。
当然更要利用当今社会为我们提供的网络资源,学会在网络上搜索资料,自主学习。
切忌拿别人做好的实验和编写好的程序去蒙混过关,这样对自己百害无一利。