单片机应用基础实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); //读取按键,处理按键} } 四、实验心得