单片机倒数计时器2周.docx
- 文档编号:5668617
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:22
- 大小:58.95KB
单片机倒数计时器2周.docx
《单片机倒数计时器2周.docx》由会员分享,可在线阅读,更多相关《单片机倒数计时器2周.docx(22页珍藏版)》请在冰豆网上搜索。
单片机倒数计时器2周
湖南工程学院
课程设计任务书
课程名称:
题目:
倒数计时器
专业班级:
电子技术1002班
学生姓名:
学号:
201001180208
指导老师:
审批:
任务书下达日期2013年5月13日星期一
设计完成日期2013年5月24日星期五
设计内容与设计要求
一.设计内容:
1、按照给出的电路原理图焊接好电路板。
2、结合51单片机和字符型LCD显示器,设计一个简单的倒数计数器。
做一段时间的倒计数,计到0时,发出一段音乐声响。
3、字符显示格式为:
时时:
分分:
秒秒
4、初始时间由键盘设定,按启动建开始倒计时。
。
二、设计要求:
1.掌握基本的电路板安装技能,能够正确焊接电路板上的元件;
2.掌握正确的电路板调试方法;
3.掌握单片机C语言编程的技巧,能编写出合格的程序;
4.掌握程序仿真和调试的方法,下载并正确运行程序,;
主要设计条件
1.提供必要的实验设备;
说明书格式
1、课程设计封面;
2、课程设计任务书;
3、说明书目录;
4、总体设计思路,基本框图;
5、具体的设计思路、源程序片断;
6、故障分析与改进;
7、仿真及波形;
8、下载演示的结果;
9、总结与设计调试体会;
10、附录(总的源程序);
11、参考文献;
12、课程设计成绩评分表。
进度安排
星期一上午:
布置课题,讲解课题。
星期一下午-------星期五
查资料、焊接电路板、设计程序,仿真;
下载调试并演示结果
第二周的星期三、四写总结报告
星期五答辩
参考文献
《单片机原理与应用》王迎旭编著机械工业出版社
目录
一、总体思路与基本框图:
1
1)总体思路:
1
2)基本框图:
1
二、具体源程序片段:
2
1、延时函数:
2
2、lcd的写指令函数与写数据函数:
2
3、lcd显示屏与定时器的初始化函数:
3
4、主函数:
4
三、故障分析与改进:
4
四、仿真:
5
五、总结与设计调试体会:
5
七、参考文献:
6
八、课程设计成绩评分表:
17
一、总体思路与基本框图:
1)总体思路:
该课程设计要求在lcd液晶显示屏上显示时间,则可以利用51系列单片机的芯片来让lcd液晶显示屏显示出课程设计的要求,用定时器T0来定时,定时器T1来控制当时、分、秒都为零时,发出一段音乐响,用独立键盘来调节时、分、秒。
用独立按键s17来代表功能键,控制该调节时还是分或者是秒钟,用s18、s19按键来表示增加键和减小键,即可调节时分秒的大小。
用s20来代表启动键和暂停键。
2)基本框图:
基本框图如图1-1所示:
图1-1
由上图可知,该系统由单片机AT89C52,lcd显示器,蜂鸣器,独立按键等构成的几个模块连接起来的。
2、具体源程序片段:
3、1、延时函数:
对于该系统我写了两个延时函数,一个延时函数是毫秒级的,还有一个是50us级的。
程序源片段如下:
//延时50微秒级;
voiddelay50us(uintt)
{
uchari;
for(;t>0;t--)
for(i=19;i>0;i--);
}
//延时毫秒级函数;
voiddelay(uintt)
{
uinti,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
2、lcd的写指令函数与写数据函数:
这两个函数,我根据lcd的时序图一步一步的写出来的,都是一些固定的指令,源程序如下:
//写指令函数;
voidwrite_com(ucharcom)
{
en=0;
rs=0;
rw=0;
P0=com;
delay50us(100);
en=1;
delay50us(500);
en=0;
}
//写数据函数;
voidwrite_data(uchardat)
{en=0;
rs=1;
rw=0;
P0=dat;
delay50us(100);
en=1;
delay50us(500);
en=0;
}
3、lcd显示屏与定时器的初始化函数:
Lcd初始化:
{second=10;
minut=0;
hour=0;
delay50us(300);
write_com(0x38);
delay50us(100);
write_com(0x38);
delay50us(100);
write_com(0x38);
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);
for(i=0;i<16;i++)
{
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;
}
4、主函数:
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
#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},
{22,4},{17,4},{24,4},{22,4},{19,16},
{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;
for(;p>0;p--)
for(i=181;i>0;i--)
for(j=181;j>0;j--);
}
voidpause()
{
uchari,j;
for(i=150;i>0;i--)
for(j=150;j>0;j--);
}
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)
{TR1=0;delay1(30);i=0;}
elseif(m==music[i+1][0])
{TR1=1;delay1(n);TR1=0;pause();i++;}
else
{TR1=1;delay1(n);i++;}
beepIO=1;
}
}
//延时50微秒;
voiddelay50us(uintt)
{
uchari;
for(;t>0;t--)
for(i=19;i>0;i--);
}
//延时函数;
voiddelay(uintt)
{
uinti,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
voidfmq()
{
if((hour==0)&&(minut==0)&&(second==0))
{
musicFunction();
TR0=0;
}
}
//写指令函数;
voidwrite_com(ucharcom)
{
en=0;
rs=0;
rw=0;
P0=com;
delay50us(100);
en=1;
delay50us(500);
en=0;
}
//写数据函数;
voidwrite_data(uchardat)
{
en=0;
rs=1;
rw=0;
P0=dat;
delay50us(100);
en=1;
delay50us(500);
en=0;
}
//lcd液晶显示初始化函数;
voidinit(void)
{
second=10;
minut=0;
hour=0;
delay50us(300);
write_com(0x38);
delay50us(100);
write_com(0x38);
delay50us(100);
write_com(0x38);//不检测忙信号;
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口;
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);
for(i=0;i<16;i++)
{
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;
}
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)
{
delay50us(100);
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(!
s18);//确认按键释放;
if(num==1)//若按键第一次按下;
{
second++;//调整秒加1;
if(second==60)
second=0;
set_dis_time(10,second);//每调一下就送到液晶先试一下;
write_com(0x80+0x40+10);//显示重新回到调节处;
}
if(num==2)
{
minut++;
if(minut==60)
minut=0;
set_dis_time(7,minut);
write_com(0x80+0x40+7);
}
if(num==3)
{
hour++;
if(hour==24)
hour=0;
set_dis_time(4,hour);
write_com(0x80+0x40+4);
}
}
}
if(s19==0)
{
delay50us(100);
if(s19==0)//确认减小键被按下;
{
while(!
s19);
//delay50us(100);
//while(!
s19);
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)
{
delay50us(100);
if(s20==0)
{
num2++;
while(!
s20);
if(num2==1)
{
TR0=0;
write_com(0x0c);
}
if(num2==2)
{
TR0=1;
write_com(0x0c);
}
if(num2==3)
{
num2=0;
}
//while(!
s20);
//TR0=1;
//write_com(0x0c);
}
}
}
voidmain()
{
init();//初始化函数;
while
(1)
{
keycontrol();
fmq();
}
}
voidtime0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 倒数 计时器
![提示](https://static.bdocx.com/images/bang_tan.gif)