单片机倒数计时器2周文档格式.docx
- 文档编号:18655712
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:22
- 大小:58.95KB
单片机倒数计时器2周文档格式.docx
《单片机倒数计时器2周文档格式.docx》由会员分享,可在线阅读,更多相关《单片机倒数计时器2周文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
9、总结与设计调试体会;
10、附录(总的源程序);
11、参考文献;
12、课程设计成绩评分表。
进度安排
星期一上午:
布置课题,讲解课题。
星期一下午-------星期五
查资料、焊接电路板、设计程序,仿真;
下载调试并演示结果
第二周的星期三、四写总结报告
星期五答辩
参考文献
《单片机原理与应用》王迎旭编著机械工业出版社
目录
一、总体思路与基本框图:
1
1)总体思路:
2)基本框图:
二、具体源程序片段:
2
1、延时函数:
2、lcd的写指令函数与写数据函数:
3、lcd显示屏与定时器的初始化函数:
3
4、主函数:
4
三、故障分析与改进:
四、仿真:
5
五、总结与设计调试体会:
七、参考文献:
6
八、课程设计成绩评分表:
17
该课程设计要求在lcd液晶显示屏上显示时间,则可以利用51系列单片机的芯片来让lcd液晶显示屏显示出课程设计的要求,用定时器T0来定时,定时器T1来控制当时、分、秒都为零时,发出一段音乐响,用独立键盘来调节时、分、秒。
用独立按键s17来代表功能键,控制该调节时还是分或者是秒钟,用s18、s19按键来表示增加键和减小键,即可调节时分秒的大小。
用s20来代表启动键和暂停键。
基本框图如图1-1所示:
图1-1
由上图可知,该系统由单片机AT89C52,lcd显示器,蜂鸣器,独立按键等构成的几个模块连接起来的。
2、具体源程序片段:
3、1、延时函数:
对于该系统我写了两个延时函数,一个延时函数是毫秒级的,还有一个是50us级的。
程序源片段如下:
//延时50微秒级;
voiddelay50us(uintt)
{
uchari;
for(;
t>
0;
t--)
for(i=19;
i>
i--);
}
//延时毫秒级函数;
voiddelay(uintt)
{
uinti,j;
for(i=t;
i--)
for(j=110;
j>
j--);
}
这两个函数,我根据lcd的时序图一步一步的写出来的,都是一些固定的指令,源程序如下:
//写指令函数;
voidwrite_com(ucharcom)
en=0;
rs=0;
rw=0;
P0=com;
delay50us(100);
en=1;
delay50us(500);
//写数据函数;
voidwrite_data(uchardat)
{en=0;
rs=1;
P0=dat;
Lcd初始化:
{second=10;
minut=0;
hour=0;
delay50us(300);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
write_com(0x80);
for(i=0;
i<
16;
i++)
{
write_data(table2[i]);
delay50us(100);
}
write_com(0x80+0x40);
write_data(table1[i]);
delay(5);
//定时器初始化;
{TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
ET1=1;
//TR1=1;
voidmain()
{init();
//初始化函数;
while
(1)
{
keycontrol();
fmq();
还有其他一些函数等等,后面的总源程序会一一呈现。
在我把整个程序写好编译成功后,把生成的hex文件下载到单片机里运行时,遇到了很多问题,刚开始lcd显示出来我初始化的内容,不断地跳动出现乱码。
经过不断地找原因排查,才发现我把lcd的显示地址弄错了,在把地址修改好后,又发现时、分、秒跑得不对。
最后在T0定时器函数里发现我的时分秒在减到零的时候我就赋值为24,60,60所以不符合倒计时跑的要求。
在做仿真的时候,也是遇到了很多问题。
不过也是一点一点的不断修改后仿真成功,比如说我把电路连好后运行时,lcd亮但是不显示程序所写的内容,这个问题把我想了好长时间才想出来了。
那就是我对lcd送数据时用的是P0口,而我在连线时在P0口并没有加上拉电阻导致电流过小。
蜂鸣器也是,有的连接好后运行就会一直想,而有的到最后时分秒都为零了还不想。
不过这些问题都在自己反复修改调试后成功。
仿真图如图1-2所示:
图1-2
该图中c1、c2与晶振构成了时钟电路,RP1为排阻与lcd,P0口相连有上拉作用。
在就是按键与蜂鸣器。
对于此次课程设计来说,收获很大,特别是在编程方面的知识。
也让我深刻了解到实践是理论运用的最好检验,我们这学期刚学完单片机课程,接着就弄单片机课程设计,按道理当我拿到课题时应该有自己的想法的。
但是,事与愿违,我拿到课题点开一看。
脑袋里完全一片空白,所以,在设计的时候很多东西不得不又拿起课本去看,去学。
想lcd的初始化,我不得不去翻书复习。
因为要写的东西太多。
当时学的时候根本就没记住。
所以通过这次课程设计我对它就更熟悉了。
虽然没有完全记住,但是我对lcd的了解确实更加的深刻了。
而对于它的写操作等时序图,我却是牢牢记在了脑海里。
在编程的过程中,定时器那一模块的运用也是得到了提高。
这次设计是对我这一学期所学知识的一次综合性检测与考验,无论是理论知识还是动手能力都得到了很大的提高。
在用proteus仿真的过程中,我熟悉了这个软件的一些基本知识。
在设计的过程中遇到了不少问题。
针对不同的问题我采取了不同的解决方法,最终经过不断地努力都一一解决了。
总的来说。
我自己对这次课程设计还是比较满意的,而我更高兴的是我在这次课程设计中所学到的的东西是无价的
六、附录(总的源程序):
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
uchari,num,num1,num2;
ucharnum3,flag=1;
ucharsecond,minut,hour,cnt=0;
ucharcodetable1[]="
----00:
00:
10----"
;
ucharcodetable2[]="
---DAOJISHI---"
sbitrs=P2^0;
sbitrw=P2^1;
sbiten=P2^2;
sbits17=P3^0;
//功能键;
sbits18=P3^1;
//增大键;
sbits19=P3^2;
//减小键;
sbits20=P3^3;
//启动键;
ucharflag;
sbitbeepIO=P3^5;
ucharm,n,i;
ucharcodeT[49][2]={{0,0},
{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
};
ucharcodemusic[][2]={{0,4},
{27,4},{19,4},{19,4},{27,4},{26,4},{26,2},{27,2},{24,8},
{22,4},{17,4},{24,4},{22,4},{19,16},
{15,4},{12,4},{12,4},{15,4},{17,8},{19,8},
{26,6},{26,2},{26,4},{24,4},{24,4},{19,4},{19,8},
{27,4},{19,4},{19,4},{27,4},{26,4},{26,2},{27,2},{24,6},{24,2},
{15,4},{12,4},{12,4},{15,4},{17,8},{19,8},{19,6},{19,2},{19,4},{17,4},{14,4},{14,4},{14,4},{7,4},{12,24},
{0xFF,0xFF}};
voiddelay1(ucharp)
uchari,j;
p>
p--)
for(i=181;
for(j=181;
voidpause()
for(i=150;
for(j=150;
voidtime1()interrupt3
beepIO=!
beepIO;
TH1=T[m][0];
TL1=T[m][1];
voidmusicFunction()
uchark;
for(k=0;
k<
10;
k++)//加一个for循环是10次;
m=music[i][0];
n=music[i][1];
if(m==0x00)
{TR1=0;
delay1(n);
i++;
elseif(m==0xFF)
delay1(30);
i=0;
elseif(m==music[i+1][0])
{TR1=1;
TR1=0;
pause();
else
beepIO=1;
//延时50微秒;
voiddelay50us(uintt)
t--)
//延时函数;
voidfmq()
if((hour==0)&
&
(minut==0)&
(second==0))
musicFunction();
//写数据函数;
//lcd液晶显示初始化函数;
voidinit(void)
second=10;
//不检测忙信号;
//设置16*2显示,5*7点阵,8位数据接口;
//显示关闭。
//显示清屏;
//显示光标移动设置;
//显示开及光标设置;
TMOD=0x11;
voidset_dis_time(ucharadd,uchardat)
ucharshi,ge;
shi=dat/10;
ge=dat%10;
write_com(0x80+0x40+add);
//要显示的位置。
write_data(0x30+shi);
//要显示的十位数。
write_data(0x30+ge);
//要显示的个位数。
voidkeycontrol()
if(s17==0)
if(s17==0)
{
num++;
while(!
s17);
//等待释放按键;
if(num==1)//第一次被按下时;
{
TR0=0;
//关闭定时器;
write_com(0x80+0x40+10);
//光标定位到秒;
write_com(0x0f);
//光标开始闪烁;
}
if(num==2)
{
write_com(0x80+0x40+7);
//第二次按下按键时光标定位到分钟的位置;
if(num==3)
write_com(0x80+0x40+4);
//第三次按下按键时光标定位到小时的位置;
if(num==4)
num=0;
//记录按键按下次数清零;
write_com(0x0c);
//第四次按下取消光标闪烁;
//TR0=1;
//启动定时器使时钟开始走;
}
}
}
if(num!
=0)
//只有按键按下后。
功能才有效;
{
if(s18==0)
delay50us(100);
if(s18==0)//增加键确认被按下的时;
while(!
s18);
//delay50us(100);
//while(!
//确认按键释放;
if(num==1)//若按键第一次按下;
second++;
//调整秒加1;
if(second==60)
second=0;
set_dis_time(10,second);
//每调一下就送到液晶先试一下;
write_com(0x80+0x40+10);
//显示重新回到调节处;
minut++;
if(minut==60)
minut=0;
set_dis_time(7,minut);
hour++;
if(hour==24)
hour=0;
set_dis_time(4,hour);
}
if(s19==0)
delay50us(100);
if(s19==0)//确认减小键被按下;
s19);
//delay50us(100);
//while(!
if(num==1)
{
if(second==0)
{
second=60;
}
second--;
set_dis_time(10,second);
write_com(0x80+0x40+11);
}
if(num==2)
if(minut==0)
minut=60;
minut--;
set_dis_time(7,minut);
write_com(0x80+0x40+8);
if(num==3)
if(hour==0)
hour=24;
hour--;
set_dis_time(4,hour);
write_com(0x80+0x40+5);
}
if(s20==0)
if(s20==0)
num2++;
while(!
s20);
if(num2==1)
TR0=0;
write_com(0x0c);
if(num2==2)
TR0=1;
if(num2==3)
num2=0;
//while(!
//TR0=1;
//write_com(0x0c);
init();
}
voidtime0()interrupt1
num1++;
if(num1==20)//1秒时间到(20次50ms)
num1=0;
//second--;
if(second==0)
second=59;
//minut--;
if(minut==0)
minut=59;
//hour--;
if(hour==0)
hour=23;
elsehour--;
set_dis_time(4,hour);
elseminut--;
set_dis_time(7,minut);
elsesecond--;
set_dis_time(10,second);
51单片机c语言教程郭天祥编著电子工业出版社
项目
评价
优
良
中
及格
差
设计方案的合理性与创造性(10%)
硬件设计或软件编程完成情况(10%)
硬件测
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 倒数 计时器