单片机实训-设计一个小闹钟

虽然说懵懵懂懂,还是把它做出来了。下学期也没这课程了,还是得加油复习~

 

《单片机与接口技术》课程

设计报告

 

 

 

目录

一、正 2

1 、题目与要求 2

1.1 问题提出 2

1.2 本系统涉及的知识点 2

2、系统硬件设计 2

2.1 模块图 2

2.2 模块电路图 4

二、系统软件设计 6

1、分模块(函数)简述其功能 6

2、仿真运行效果图: 13

 、总结 13

4.1程序调试情况 13

4.2本人在程序设计中感想 14

四、参考文献 14

五、答辩问题记录 14

 

 

一、正 文

1 、题目与要求

1.1 问题提出

实现一个“时钟系统设计 ”,具体要求如下。

1)设计一时钟系统,系统具有时钟功能,能在8只数码管准确显示时、分、秒 (00:00:00)。  2)系统还应具有校正功能:能够使用按键修改当前的时间。(功能选择键1、+键、-键)

3)闹钟功能:具备设定闹钟和定时闹钟响功能。(功能选择键2、 +键、-键;蜂鸣器)综合上述,分析功能要求,对单片机资源进行合理选取和分配。

1.2 本系统涉及的知识点

数码管,按键,蜂鸣器。ISIS 7 Professional、Keil uVision3

2、系统硬件设计

2.1 模块图

 

图0 系统硬件框架图

图0.1 代码框架

 

图0.2 闹钟函数框架图

 

图0.3定时器T0中断服务程序流程图

2.2 模块电路图

 

本时钟系统主要由AT89C51芯片、复位电路,晶振电路,电源等几部分组成。

 

 

图1 复位电路 图2 晶振电路

电源:单片机的供电电源是5V的直流电。

键盘控制系统设计:如果设置过多按键,将会占用较多I/O口,浪费按键,不高效,程序繁琐。本次设计适用于按键较少的情况。为了尽量实现按键的高效性,此次设计采用四个独立式按键,其电路如 图3所示:

 

图3 按键调时电路

通过控制键来控制所要调节的是时、分、还是秒。

显示电路:显示电路图如图4所示:

 

图4  显示电路图

闹钟部分:闹钟部分通过三极管放大后驱动蜂鸣器工作,单片机I/O接三极管基极。

 

图5嗡鸣器电路

当单片机的P1^5接口输出为高电平时,蜂鸣器响,当输出为低电平时,蜂鸣器停止。

二、系统软件设计

1、分模块(函数)简述其功能

模块中使用的各变量的类型及作用

主函数

void main(){

TMOD=0x01; //选择单片机内部定时器中断的工作状态为1

// 表示定时器0的计数器从0开始加到50000,其中每加一次的时间为晶振频率的倒数。 1*12/12000000 秒。

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

ET0=1; //定时器0的中断允许开关

EA=1; //允许中断

TR0=1; //定时器/计数器启动

EX0=1; //外部中断0请求标志

IT0=1;

IT1=1;

while(1){

display1(s,f,m);

if(s==ts&&f==tf&&m==tm){

BEEP=0;

}

if(k4==0){

delay(1);

if(k4==0){

while(k4==0);

BEEP=1;

/*  if(s==ts && f==tf+1)          //响铃一分钟

{ BEEP=1;}    */

} } }}

函数声明

void SetClock();

void SetTime();

void display1(uchar shi,uchar fen,uchar miao);

sbit BEEP=P1^5;

sbit k1=P3^5;

sbit k2=P3^6;

sbit k3=P3^7;

sbit k4=P3^4;

数码管显示表

uchar code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code duan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

定义变量

uchar count=0,flag=0;

对定时中断进行初始化。 

void time0_int(void) interrupt 1{

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

count++;

if(count==20){

count=0;

m++;

if(m==60){

m=0;

f++;

if(f==60){

f=0;

s++;

if(s==24){

s=0;

} } }}}

定义正常显示时间、闹钟初始化时间

uchar s=0,f=0,m=0;

uchar ts=0,tf=0,tm=0;

定义调整时间、调整闹钟时间

void naozhong(void) interrupt 0{

delay(1);

if(INT0==0){

flag=0;

if(INT0==0)

SetClock();

while(INT0==0);

}

flag=0;

}

void tiaoshi(void) interrupt 2{

delay(1);

if(INT1==0){

TR0=0;

SetTime();

while(INT1==0);

}

TR0=1;

flag=0;

}

void SetClock(){

while(1){

if(k1==1){

display1(ts,tf,tm);

}

else if(k1==0){

delay(1);

if(k1==0){

flag++;

}

while(!k1)

display1(ts,tf,tm);

}

if(flag==0){

display1(ts,tf,tm);

}

else if(flag==1){

if(k2==0){

delay(1);

if(k2==0){

while(!k2);

tm++;

if(tm==60){

tm=0;

}

}

}

if(k3==0){

delay(1);

if(k3==0){

while(!k3);

tm--;

if(tm==-1){

tm=59;

}

}

}

}

else if(flag==2){

if(k2==0){

delay(1);

if(k2==0){

while(!k2);

tf++;

if(tf==60){

tf=0;

}

}

}

if(k3==0){

delay(1);

if(k3==0){

while(!k3);

tf--;

if(tf==-1){

tf=59;

}

}

}

}

else if(flag==3){

if(k2==0){

delay(1);

if(k2==0){

while(!k2);

ts++;

if(ts==24){

ts=0;

}

}

}

if(k3==0){

delay(1);

if(k3==0){

while(!k3);

ts--;

if(ts==-1){

ts=23;

}

}

}

}

else if(flag==4){

break;

}

}

}

void SetTime(){

while(1){

if(k1==1){

display1(s,f,m);

}

else if(k1==0){

delay(1);

if(k1==0){

flag++;

}

while(!k1)

display1(s,f,m);

}

if(flag==0){

display1(s,f,m);

}

else if(flag==1){

if(k2==1||k3==1){

display1(s,f,m);

}

if(k2==0){

delay(1);

if(k2==0){

while(!k2);

m++;

if(m==60){

m=0;

}

}

}

if(k3==0){

delay(1);

if(k3==0){

while(!k3);

m--;

if(m==-1){

m=59;

}

}

}

 

}

else if(flag==2){

if(k2==1||k3==1){

display1(s,f,m);

}

if(k2==0){

delay(1);

if(k2==0){

while(!k2);

f++;

if(f==60){

f=0;

}

}

}

if(k3==0){

delay(1);

if(k3==0){

while(!k3);

f--;

if(f==-1){

f=59;

}

}

}

 

}

else if(flag==3){

if(k2==1||k3==1){

display1(s,f,m);

}

if(k2==0){

delay(1);

if(k2==0){

while(!k2);

s++;

if(s==24){

s=0;

} } }

if(k3==0){

delay(1);

if(k3==0){

while(!k3);

s--;

if(s==-1){

s=23;

}}}}

else if(flag==4){

break;

} }}

将时间送显

void display1(uchar shi,uchar fen,uchar miao){

P2=wei[7];

P0=duan[shi/10];

delay(1);

P2=wei[6];

P0=duan[shi%10];

delay(1);

P2=wei[5];

P0=duan[10];

delay(1);

P2=wei[4];

P0=duan[fen/10];

delay(1);

P2=wei[3];

P0=duan[fen%10];

delay(1);

P2=wei[2];

P0=duan[10];

delay(1);

P2=wei[1];

P0=duan[miao/10];

delay(1);

P2=wei[0];

P0=duan[miao%10];

delay(1);

}

延时

void delay(uchar x)

{  uchar i,j,k;

for(i=x;i>0;i--)

for(j=10;j>0;j--)

for(k=100;k>0;k--)

2、仿真运行效果图

 

 

三 、总结

4.1程序调试情况

调试所遇到的问题:从程序设计开始,对于整体的框架不是很熟悉,虽然这些代码都之前分段实验做过的。但是还是有些不熟悉。单片机部分连线松动或异常导致仿真失败;出现闹铃不响或者是不显示的情况。

4.2本人在程序设计中感想

由于我班人数多,实训的机器不够,我就想到使用Proteus软件进行仿真,虽然老师课堂上没有教过这样的软件,但是通过自学也较为熟悉了这款软件,提升了自己的自学能力。

刚开始在调试程序的时候,有很多功能没有做到位。在不断的修改程序之后,系统逐渐变得完善。从中发现许多知识点学的并不牢固,只有去请教其他同学,最终完成了本次实训。也加强了对数码管,按键,蜂鸣器等知识点的掌握,为以后深入学习打下了基础。

四、参考文献

[1] 谭浩强,C程序设计(第二版),北京:清华大学出版社,2001.1

[2] archeng504,Proteus入门教程,日期:2006-1-2

五、答辩问题记录

上一篇
下一篇