您好,欢迎来到华佗养生网。
搜索
您的当前位置:首页单片机定时闹钟课程设计

单片机定时闹钟课程设计

来源:华佗养生网


绪 论

摘要:

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。、

电子闹钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。数字钟已成为人们日常生活中:必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时自动报时及自动控制的领域。因此,研究数字钟及扩大其应用,有着非常现实的意义。

关键字:C52、单片机、定时闹钟、电子设计

1

一. 设计目的和要求

1.1设计任务:设计一个可控制的定时闹钟。

1.2设计目的:

1.了解定时闹钟的组成及工作原理。

2.进一步熟悉和掌握单片机的结构和工作原理。

1.3设计要求: A.基本要求:

1).由晶振电路产生1HZ标准秒信号。 2).秒、分为00-59六十进制计数器。 3).时为00-23二十四进制计数器。

4).可手动校正:能分别进行秒、分、时的校正。只要将开关置于手动位置,可分别对秒、分、时进行连续脉冲输入调整。 5).当时间到达闹钟设定时间时,蜂鸣器发出报警声。 B.提高要求:

a).通过按钮快速切换闹钟显示。

b).通过计算机串口在PC上快速设定时间闹钟 c).整点报时。

2

二. 系统设计

2.1硬件系统:

2.1.1电源电路:

电源是单片机系统的重要组成部分,它不仅为系统提供多路电压源,还直接影响到系统的技术指标和抗干扰性能。ATC51单片机和一般的数字芯片一样,都是5V电压供电,所以可以共用一个5V电源。另外,为了提高电源的稳定性,在离电源的最近处做好退耦处理,即用一个47UF和一个10UF电容,以滤去干扰,保证电源的稳定。

2.1.2 ATC51单片机

ATC51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。

使用时VCC接电源,GND接地。P0-P3可作为输入或者输出端口。RST接复位电路。

3

2.1.3时钟电路

单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。本系统中ATC51单片机采用内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHz~12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。

单片机的时钟产生

ATC51

2.1.4数码管显示电路

4

要同时使得6个数码管点亮,所需的IO口是很多的。为了节省单片机的IO口,通常采用动态扫描的显示方法,将每个数码管的同名段连在一起,分6次向数码管写数据,每次对6个数码管写相同的数据,每次选通一个数码管,完成扫描,通过调整、缩短扫描的时间,由于人眼的视觉暂留作用,使得人们看起来就像同时显示一样,以达到动态显示的目的.

2.2设计原理

2.2.1 系统总体方案

1)由于要显示数字时间,所以需要6位数码管。

2)时间的定时用时钟电路,修改时间和定时用手动按键控制,报警声通过喇叭发出。

3)ATS52单片机加上外围器件(6个共阴数码管,限流电阻和一个蜂鸣器)和应用程序(KEIL编译软件),构成相应的应用系统。

2.2.2 系统设计方框图

5

晶振 及复位 单片机 ATC51 限流 电阻 选位 6位共阴 数码管显 示 按钮 蜂鸣器 图1系统设计方框图

2.2.3 软件设计流程

6

三. 实验结果和讨论

在确立了编程设计的基本思路后,我们开始查找相关的编程资料,然后采用C语言对软件设计的要求进行编译。一开始进展很慢,并且编程过程中出现个各种错误,经过大量时间的编译与完善,我们终于逐步完成定时闹钟的软件设计过程。 最终程序如下: #include #define uint unsigned int #define uchar unsigned char

uchar code shu[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,

0x7f,0x6f}; //0~9

uchar code shu2[]={0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd,0x87,

0xff,0xef}; //带小数点0~9

uchar code wei[]={0xef,0xdf,0xbf,0x7f,0xf7,0xfb};//数码管位选码 uchar x[]={0,0,0,0}; uchar y[]={0,0,0,0,0,0}; uint hour=12,min,sec,h=22,m=0;

uint a,s1=1,s2=1,s3=0,i=0,status=0,num=0,class=0; bit flag=0;

7

sbit P3_7=P3^7; void delay(uint t);

void keyprint(unsigned char key); void display(); void timer0();

void sint()interrupt 4 { s3++; s3=s3%4; if(RI&&s3==1) { RI=0; hour=SBUF; }

if(RI&&s3==2) { RI=0; min=SBUF; }

if(RI&&s3==3) { RI=0;

//串口中断,实现PC上快速设定时间与闹钟8

h=SBUF; }

if(RI&&s3==0) { RI=0; m=SBUF; } if(!TI) TI=0; }

void delay(uint t) { uint i; while(t--)

for(i=0;i<125;i++); }

main() {

uchar n; uchar input;

9

n=0x0f;

TMOD=0x21; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TH1=0xfd; TL1=0xfd; SCON=0x50; PCON=0x00; TR1=1;

IP=0x10; TR0=1;

IE=0x92; //开定时器0,串口中断 while(1) //键扫描程序 { input=P2&0x0f;

if(input!=0x0f&&s1==1) {

delay(10);

s1=0;

if(input!=0x0f&&s2==1) {

10

s2=0; //按住不放

n = input; //n用来暂时存放键值 }

}

if(input==0x0f&&s1==0) {

s1=1;

s2=1; keyprint(n); n=0x0f;

}

if((hour==h&&min==m)||(h!=0&&min==0))

{ if(sec==0)

P3_7=0;

if(sec==1) P3_7=1; if(sec==2)

P3_7=0;

if(sec==3) P3_7=1; if(sec==4)

11

P3_7=0;

if(sec==5) P3_7=1; }

else P3_7=1; if(h>=24)

h=0;

display();

} }

void keyprint(unsigned char key) //各个按键功能 {

if(key==0x0e) {

num++; }

12

if(num==1) {class=1;} if(num==2) {class=2;num=0;}

if(key==0x0d) {

status++; if(status>=5) status=0;

}

if(key==0x0b) {

if(status==1) {

if(min<59) min++; else {min=0;hour++;}

}

if(status==2) {

if(hour<23) hour++; else hour=0;

}

if(status==3) {

if(m<59) m++;

else {m=0;h++;}

13

} }

}

if(status==4) {

if(h<23) h++; }

else h=0;

void display() //数码管数值显示函数 {

uchar d=0;

if(class==1||class==0)

{

x[0]=hour/10; // 显示时的十位 x[1]=hour%10; // 显示时的个位 x[2]=min/10; // 显示分的十位 x[3]=min%10; // 显示分的个位

while(d<4) {

P2=wei[d];

P0=shu[x[d]];

14

delay(1); d++;

}

}

else if(class==2) {

y[0]=h/10; // 显示时的十位

y[1]=h%10; // 显示时的个位 y[2]=m/10; // 显示分的十位 y[3]=m%10; // 显示分的个位

d=0; if(flag==0) {

while(d<4) {

P2=wei[d];

// 每过0.5s小数点闪烁一次

P0=shu2[y[d]]; delay(1); d++;

} }

else if(flag==1)

15

}

{

while(d<4) {

P2=wei[d];

P0=shu[y[d]]; delay(1); d++;

} }

}

void timer0() interrupt 1 //定时器0方式1中断函数 {

uint count;

TH0=(65536-5000)/256; // 定时器0设置初始值1ms中断初始值

TL0=(65536-5000)%256; TR0=1;

count++; //正常计时 if(count>=100) { flag=1;

16

if(count>=200) // 定时 1S 到,以下为时钟的正常走钟逻辑 { flag=0;

count=0;

sec++;

if(sec>= 60)

{

sec=0;

min++; //秒到60分加一,秒清零

}

if(min>= 60)

{

min=0;

} hour++;

//分到60时加一,分清零

if(hour>= 24)

{

hour=0; //时到24立即变为0 }

}

} }

17

四. 结论

4.1本次课程设计的特点:

本次课程设计对单片机这么课程的知识原理要求比较高,具有一定的编程要求。设计出的定时闹钟比较贴近生活产品,实用性计较强,因此达到了知识与实践相结合,学以致用的目的。 4.2主要贡献:

让我们再一次深入了解了单片机的基本知识和原理,给予我们一定的单片机设计经验,强化了教学目标。 4.3心得与体会:

课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。

回顾起此次单片机课程设计,我仍感慨颇多,学到了很多的东西。同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。

18

五.参考文献

【1】《C51单片机技术教程》 人民邮电出版社

——田希辉、薛亮儒

【2】《单片机应用技术选编》 北京航空航天大学出版社 ——何立民

六.附 录:

1.主要使用软件:Keil C语言编写软件 Protues 仿真软件 串口调试助手

虚拟串口软件

19

2.实验箱内部图:

20

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo7.cn 版权所有 湘ICP备2022005869号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务