单片机应用基础实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《单片机应用基础》实验报告

实验名称:实验1流水灯的实现指导教师:张正明成绩:

姓名: 班级: 学号:

一、实验目的与任务

(1)理解单片机的工作原理;

(2)理解数码管的动态显示方法和硬件连接;

(3)采用定时计数器实现比较准确的延时;

(4)可以对时间的小时和分钟进行增减设置;

二、实验原理

数码管动态显示是多数码管应用时常使用的一种方法,利用人眼的视觉暂留现象,轮流在不同的数码管上显示不同的内容,当每个固定的数码管的刷新时间短于40毫秒时,整个屏幕看起来就像静态显示一样,通过动态显示达到静态显示的效果,却节省了大量的硬件管脚。

数码管的控制包括两部分,一个是位选,即选择哪一个数码管,还有一个是段信号控制,即在这个数码管上显示的内容。编程时把这两者对应起来,一起实现,显示效果就会出来。

定时计数器比软件延时具有更准确的延时和更可靠的运行效果,程序要求使用定时计数器,要合理地利用系统的硬件资源,可以大量节省软件资源。

在程序运行过程中,随时可能修改时间值,这可以通过4个按键来实现,只对小时和分钟做加减,秒不变。

实验步骤:

1.程序设计,在KEIL环境下,编程、编译、链接、调试、产生可执行文件。

2.硬件设计,在PROTEUS平台上,设计硬件原理图,并加载程序运行。

3.更改电路连接,修改程序,再次运行。

三、实验内容与结果

#include

#define uchar unsigned char

uchar second=0;

uchar minute=0;

uchar hour=0;

uchar t20=0;

uchar code led[16]={0x3F,0x06,0x5B,0x4F,\

0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,\

0x7C,0x39,0x5E,0x79,0x71}; //LED编码,dp gfedcba,高电平有效

uchar dbit[6]={0x20,0x10,0x08,0x04,0x02,0x01}; //数码管选择位,高电平选择,秒个位,秒十位,分个位,分十位,时个位,时十位

uchar time[6]={0}; //秒个位,秒十位,分个位,分十位,时个位,时十位uchar bitp=0;

void T0init() //T0初始化,5ms定时,显示

{

TMOD=0x01;

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TR0=1;

ET0=1;

EA=1;

}

void T1init() //T1初始化,50ms定时,计时

{

TMOD|=0x10;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

TR1=1;

ET1=1;

EA=1;

}

void T0_ISR() interrupt 1 //T0中断服务,5ms定时,显示

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

P3=0xff;

P2=led[time[bitp]];

P3=~dbit[bitp];

if(++bitp==6)

bitp=0;

}void T1_ISR() interrupt 3 //T1中断服务,50ms定时,计时

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

t20++;

if(t20==20) //1秒到

{ t20=0;

if(++second==60)

{

second=0;

if(++minute==60)

{

minute=0;

if(++hour==24)

hour=0;

}

} //参考例5-3的clockadj

time[0]=second%10;

time[1]=second/10;

time[2]=minute%10;

time[3]=minute/10;

time[4]=hour%10;

time[5]=hour/10;

}

}

uchar getkey()

{

uchar ch;

P1=0x0f;

ch=P1&0x0f;

if(ch!=0x0f)

{

ch=P1;

if(ch!=0x0f)

{

switch(ch)

{

case 0x0e:ch=0;break;

case 0x0d:ch=1;break;

case 0x0b:ch=2;break;

case 0x07:ch=3;break;

}

while(P1!=0x0f);

}

}

return(ch);

}

void keytreat(uchar ch)

{

if(ch!=0x0f)

{

switch(ch)

{

case 0:if(minute==0) minute=59;

else minute--;break; //参考小时部分修改case 1:if(minute==59) minute=0;

else minute++;break;

case 2:if(hour==0) hour=23;

else hour--;break;

case 3:if(hour==23) hour=0;

else hour++;break;

}

time[2]=minute%10; //参考主函数修改

time[3]=minute/10;

time[4]=hour%10;

time[5]=hour/10;

}

}

void main()

{

uchar key;

T0init();

T1init();

time[0]=second%10;

time[1]=second/10;

time[2]=minute%10;

time[3]=minute/10;

time[4]=hour%10;

time[5]=hour/10;

while(1)

{

key=getkey();

if(key!=0x0f)

keytreat(key); //读取按键,处理按键}

}

四、实验心得

相关文档
最新文档