当前位置:文档之家› 单片机 定时闹钟课程设计

单片机 定时闹钟课程设计

一、设计目的此次设计的目的是培养同学们系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力,以及一定的自学能力和独立分析问题、解决问题的能力,能通过独立思考、查阅工具书、参考文献,寻找解决方案;通过完成所选题目的分析与设计,达到技术性能要求。

二、设计要求1、能显示时时-分分-秒秒。

2、能够设定定时时间、修改定时时间。

3、定时时间到能发出报警声或者启动继电器,从而控制电器的启停。

三、设计的总体结构3.1 电路的总体原理框图n dAl l t h i ng si nt he i rb ei n ga re go od fo rs o图4.1 主电路4.2、显示电路显示电路即可以让我们看到时间的调整和定时时间的调整,显示调整后的时间。

e an dAl l t h i ng si nt he i rb ei n ga re go od fo rs o 图4.2显示电路4.3、 内部时钟方式的电路单片机内部有一个用于构成振荡器的高增益反向放大器,它的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。

这两个引脚跨接石英晶体和微调电容,构成一个稳定的自激振荡器。

时钟频率可以影响单片机的速度。

单片机的各功能部件的运行都以时钟控制信号为基准图4.3 内部时钟方式的电路4.4、按键及蜂鸣器电路按键可以对时间进行调整,蜂鸣器可以在到达定时的时间时提醒我们。

e an dAl l t h i ng si nt he i rb ei n ga re go od fo rs o 图4.5 按键及蜂鸣器电路五、整体电路图见附图。

六、设计总结6.1、设计过程中遇到的问题及解决方法在设计的过程中遇到问题是不可避免的,我遇到了很多问题,如下所示;1.做实物时无法驱动数码管显示,后来了解到可以加锁存器,如74LS253,74LS573等等,还可以加三极管用来加大电流。

当然如果换成液晶显示屏的话就不需要考虑驱动不了的问题了。

2.烧程序时没发烧进去,需要改变最高和最低波特率,才能按照步骤把程序烧进去。

3.仿真时没问题的电路,在做好实物时发现无法运行。

原因可能是程序出现问题,或者在连实物时线路连接错误等等都有可能。

这是很难的一部分,需要查找出原因。

在做实物的过程中我进行的很多检查,有很多连接错误,最终又重新焊接的。

4.复位电路在实物中可以运行,但是在仿真中不能正常运行。

目前还未找到原因。

6.2、设计体会这次设计中遇到了很多问题,例如刚开始我在在仿真时程序出现了每次按按钮时总是显示测量时需要关闭仿真的字样,试了很多方法都没有找到原因,最后才知道是因为按钮太近的缘故。

很多类似的经历让我明白:1.在设计程序之前,务必要对所学单片机课程的内容有一个系统的了解,知道单片机片内片外的内容及其功能。

2. 设计程序关键要有一个清晰的思路和一个完整的软件流程图。

模块化的设计思想在程序设计中的作用是重大的,它可以为你提供一个比较清晰的思路,并且很容易找到头绪,不至于在编写一个程序时感觉到无从下手。

3. 在设计程序时,不能妄想一次就将整个程序设计好,"反复修改,不断改进"是程序设计的必经之路。

程序刚开始编好时,一般情况下会存在很多错误,要不断地修改,不断的改进才能达到预期的目的,编写程序的时间并不是很长,主要是花很多时间去修改程序。

4. 要养成注释程序的好习惯,让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。

刚开始我在编写程序时,很不习惯于写注释,感觉很麻烦,而且没用,但是在修改的过程中我就遇到了较大的麻烦,以至于不得不重新的作了注释,以增加程序的易读性,从而使修改过程变得容易一些。

总之,通过这次课程设计不仅使我巩固了本课程所学的基本知识,还使我具有了撰写科研报告的初步训练能力,我相信这些能力在我以后的工作或者是再学习中一定会起到不小的作用,一切的辛苦和艰难都是值得的。

6.3、对设计的建议在设计前应该对所要实现的功能有一定的了解,定下有大概的流程图,把设计模块化,写程序时也应该一个模块一个模块的写,这样方便理解,也方便以后的检查。

在仿真和实物的过程中要了解所使用芯片的功能及引脚的排列方式,这样焊接时比较方便。

七、C语言程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="00:00:00";sbit lcden=P2^6 ;//位定义sbit lcdrw=P2^5;sbit lcdrs=P2^4;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit beep=P3^7;//定义蜂鸣器uchar num,count,s1num;//显示的位数;响应中断数;按键次数;uint i;char shi,fen,miao,shi1,fen1,miao1;void delay(uint z)//延时程序{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//控制指令{lcdrs=0; //低电平时选择指令寄存器lcdrw=0;// 低电平时进行写操作delay(5);lcden=1; //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令P0=com;delay(5);lcden=0;}void write_data(uchar date)//数据指令{lcdrs=1;lcden=1; //均为高时是读出数据的内容delay(5);P0=date;delay(5);lcden=0;}void init()//初始化{lcdrw=0;lcden=0;delay(15);write_com(0x38);//设置为4位总线,单行显示delay(5);write_com(0x38);delay(5);write_com(0x38);write_com(0x38);//重复多次以确定可以正确设置write_com(0x08);//无光标正常显示write_com(0x01);//清显示write_com(0x06);//光标和显示模式设置d1 I/D:光标移动方向,高电平右移d0 S:屏幕上所有文字是否左移或者右移。

低电平表示光标闪烁write_com(0x0c);// 显示开关控制。

d2 D:控制整体显示的开与关,高电平表示开显示d1 C:控制光标的开与关,低电平表示无光标B:控制光标是否闪烁,低电平不闪烁write_com(0x80+1);d7为高时,显示数据存储地址TMOD=0x11;工作方式3TH0=(65536-50000)/256;//定时时间为50msTL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//打开定时器TR0=1;//启动定时器write_com(0x80+4);//秒的设定for(num=0;num<8;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x40+4);for(num=0;num<8;num++){write_data(table1[num]);delay(20);}}void write_sfm(uchar add,uchar date)//调整时间{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);//控制指令,0x40:字符发生器RAM地址设置进行加write_data(0x30+shi);//数据指令,功能设置命令d4 DL:高电平时为4位总线d3 N:低电平时单行显示d2 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

write_data(0x30+ge);}void write_shedingsfm(uchar add1,uchar date1)//设定定时时间{uchar shi1,ge1;shi1=date1/10;ge1=date1%10;write_com(0x80+add1);//控制指令write_data(0x30+shi1);write_data(0x30+ge1);}void keyscan(){if(s1==0){delay(5);if(s1==0){s1num++;while(!s1);//s1按下}}if(s1num==1)//按下次数{TR0=0;//停止定时器工作write_com(0x80+0x40+11);//调整时间设置,控制秒设定write_com(0x0f); //d3 显示开关控制。

d2 D:控制整体显示的开与关,高电平表示开显示d1 C:控制光标的开与关,高电平表示有光标d0 B:控制光标是否闪烁,高电平闪烁}if(s1num==2){write_com(0x80+0x40+8);//控制分钟设定write_com(0x0f);//控制光标闪烁}if(s1num==3){write_com(0x80+0x40+5);//控制时设定write_com(0x0f);}if(s1num==4){TR0=1;//启动定时器,定时时间的设定write_com(0x80+11);//控制秒的设定write_com(0x0f);//光标显示}if(s1num==5){write_com(0x80+8);//定时分钟的设定write_com(0x0f);}if(s1num==6){write_com(0x80+5);//定时时的显示write_com(0x0f);}if(s1num==7){s1num=0; // 按键次数清零write_com(0x0c);//显示此时为无光标状态}if(s1num!=0)//有按键时{if(s2==0){delay(5);if(s2==0){while (!s2);if(s1num==1){miao++;if(miao==60){miao=0;}write_sfm(10,miao)//第10位进行秒的设定write_com(0x80+0x40+11);//控制秒的设定}if(s1num==2){fen++;if(fen==60){fen=0;}write_sfm(7,fen);write_com(0x80+0x40+8);}if(s1num==3){shi++;if(shi==24){shi=0;}write_sfm(4,shi);write_com(0x80+0x40+5);}if(s1num==4){TR0=1;//定时器启动miao1++;if(miao1==60){miao1=0;}write_shedingsfm(10,miao1);write_com(0x80+11);}if(s1num==5){fen1++;if(fen1==60){fen1=0;}write_shedingsfm(7,fen1);write_com(0x80+8);}if(s1num==6){shi1++;if(shi1==24){shi1=0;}write_shedingsfm(4,shi1);write_com(0x80+5);}}}}if(s3==0){delay(5);if(s3==0){while (!s3);if(s1num==1){miao--;if(miao==-1){miao=59;}write_sfm(10,miao);write_com(0x80+0x40+11);}if(s1num==2){fen--;if(fen==-1){fen=59;}write_sfm(7,fen);write_com(0x80+0x40+8);}if(s1num==3){shi--;if(shi==-1){shi=23;}write_sfm(4,shi);write_com(0x80+0x40+5); }if(s1num==4){TR0=1;miao1--;if(miao1==-1){miao1=59;}write_shedingsfm(10,miao1);write_com(0x80+11);}if(s1num==5){fen1--;if(fen1==-1){fen1=59;}write_shedingsfm(7,fen1);write_com(0x80+8);}if(s1num==6){shi1--;if(shi1==-1){shi1=23;}write_shedingsfm(4,shi1);write_com(0x80+5);}}}}void main()//主函数{init();//初始化函数while(1){keyscan();//键盘扫描if(count==20)//响应中断20次,时间1s{count=0;//清零miao++;//秒加1if(miao==60)//60秒时分加1{miao=0;fen++;if(fen==60)//60分时时加1{fen=0;shi++;if(shi==24)//24时时时全为0,从00:00:00开始计时{shi=0;}write_sfm(4,shi);//修改时}write_sfm(7,fen);//修改分}write_sfm(10,miao);//修改秒if((shi==shi1)&&(fen==fen1)&&(miao==miao1))//蜂鸣器电路的运行{for(i=0;i<10;i++){beep=0;//蜂鸣器响delay(50);beep=1;delay(50);}}}}}void timer0() interrupt 1//中断函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;}八、附图t at i me an dAl l t h i n g s i n t h e i r b e i n g a re go od fo rs o 21。

相关主题