数字时钟设计报告
- 格式:doc
- 大小:170.00 KB
- 文档页数:14
单片机实验报告
题 目: 数字时钟的设计
指导老师:
班 级:
姓 名:
学 号: 数字钟设计报告
- 1 - 一、实验目的
通过实践设计出能准确显示时、分、秒的时钟,并可以调时、定时,包括蜂鸣器的整点报时与闹钟功能。
二、实验要求
基本功能:准确计时,以数字形式显示时间,24时制;具备时、分调整和整点报时功能。
扩展功能:定时与闹钟功能
三、设计方案及论证
Ⅰ、硬件部分:
1、时钟显示
用七段LED数码管来实现,采用共阳管和PNP驱动方式。PNP工作于开关状态,基极通过1K的电阻连到单片机的P2口。为节省P口,将六位数码管的8段段选端分别并接并加上470Ω的限流电阻,由P0口控制,给低电平的段会被点亮。因为六位管的段被并接只能通过动态扫描的方式来显示,即利用管子的余晖和人眼的视觉残留实现六位管子在“同一时间”显示不同的值,而扫描这是靠位选的轮流有效实现。如左图。 数字钟设计报告
- 2 - 2、整点报时和闹钟铃
此部分用一个5V有源蜂鸣器来做,同样用PNP作为开关来控制,此外为防止其可能的方向电压尖峰在蜂鸣器两端反接一个IN4148二极管来保护。如右图。
3、校时、定时
此部分由4个按键控制,如下图,key1和key3用来选定要调校的时、分的位,被选中的为将闪烁;key2用来是选中的为按相应的进制增1变化;key4是进入定时模式,定时的时数改变与调时方法相同。 数字钟设计报告
- 3 - 4、单片机最小系统
本实验采用STC89C52RC单片机,指令系统完全与51兼容。其最小系统包含电源电路、晶振电路、复位电路。
本实验才用STC单片机的典型系统,各模块参数配置如图:
其中晶振频率为12MHz,震荡部分电容为30pF的瓷片电容。
复位电路采用图示的兼有上电复位和按键复位功能的方式,其中的电容为10uF电解电容。
数字钟设计报告
- 4 - 5、硬件系统全电路图
数字钟设计报告
- 5 - Ⅱ、软件部分
软件部分主要有两大块:
一是上电后程序靠定时器T1产生的中断而实现的常规时钟显示,这里面就是要处理时、分、秒的六位数字的循环和进位问题。按照24时制的规则,其进位逻辑为:秒的个位为十进制(0~9)满10向秒的十位进1,而秒的十位为六进制(0~5)满6向分的个位进1,分与秒相似,时的个位在时的十位为0、1的时候也是10进制,而在时的十位为2的时候则只是0到4就进位了。但时的十位是3进制的(0~2)。
m0++;
if(m0==10)
{ m0=0;
m1++;
if(m1==6)
{
m1=0;
f0++;
if(f0==10)
{
f0=0;
f1++;
if(f1==6)
{
f1=0;
h0++;
if(h0==10)
{
h0=0;
h1++;
}
}
}
}
}
二是程序监控4个按键的状态并进行相应处理。本实验中我们并未利用外中断来监控键盘,只是在主函数中用一个函数key_scan()来不停地扫4个键的状态并进行相应处理,这一部分的程序中主要的问题是按键抖动的去除,试验中,我们用的是软件延时的办法。
数字钟设计报告
- 6 - 四、心得体会
通过本次课程设计,我学习到了很多,也收获了很多。总结如下:
一、我对单片机的理论知识有了进一步的掌握,对单片机的原理和实际应用有了更多地理解和掌握。
二、我对单片机的C语言编程有了更深刻的认识和更扎实的掌握,我们不断修改,不断尝试,对源代码各个模块的函数都有了一个非常深入的掌握。
三、理论与实践相结合才能更好的理解和掌握所学的知识。
五、附件(程序源代码)
#include
sbit k1=P1^4;
sbit k2=P1^5;
sbit k3=P1^6;
sbit k4=P1^7;
sbit voice=P3^6;//蜂鸣器使能端
unsigned char code
duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段的共阳编码:0、1、2、3、4、5、6、7、8、9、灭灯
unsigned char code wei[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//共阳位选编码:第0位、第1位、第2位、第3位、第4位、第5位、第6位、第7位
unsigned char m0=0,m1=0,f0=0,f1=0,h0=0,h1=0,num=0,con=0;//正常时钟模式
unsigned char d_f0=0,d_f1=0,d_h0=0,d_h1=0,d_con=0;//定时模式相关变量
unsigned shan=0;//闪烁函数中量、灭的次数的控制变量
unsigned sound=0;//蜂鸣器叫与不叫的次数的控制变量
bit xiang=0;//蜂鸣器使能变量
bit dingshi=0;//定时模式的使能变量
bit naozhong=0,only=0;//闹钟的止叫控制变量
void init();//初始化定时器1
void display();//正常时钟显示
void d_display();//定时模式的显示
void delay_ms(unsigned);//非准确延时
void key_scan();//按键扫描、处理函数
void shanshuo(unsigned char);//数码管闪烁显示
void fengming(unsigned);//蜂鸣器叫
//**********************************************************************main()
void main()
{ init();
while(1)
{ key_scan();
//整点报时 数字钟设计报告
- 7 - if(m0==0&&m1==0&&f0==0&&f1==0) xiang=1;
if(m0==2&&m1==0&&f0==0&&f1==0){voice=1;xiang=0;}// 蜂鸣器叫两声
//闹钟
if(h1==d_h1&&h0==d_h0&&f1==d_f1&&f0==d_f0&&naozhong==0&&only==1)naozhong=1;//预定时间到
if(naozhong==1&&(k1==0||k2==0||k3==0||k4==0)){naozhong=0;only=0;voice=1;while(!k1);while(!k2);while(!k3);while(!k4);}//禁止闹钟叫
if(only==0&&h1!=d_h1&&h0!=d_h0&&f1!=d_f1&&f0!=d_f0)only=1;//时刻唤醒闹钟、另外,在退出定时模式时也能唤醒闹钟
//正常显示
if(dingshi==0)display();
//闹钟定时模式
if(dingshi==1)d_display();
}
}
//*************************************************************************
//********************************************************************init()
/* 参数:无
返回值:无
功能:设置T1计数器相关的特殊功能寄存器,初始化计时器T1
细节:
备注:
*/
void init()
{
TMOD=0X10;
TH1=0X3C;TL1=0XB0;
EA=1;
ET1=1;
TR1=1;
}
//*************************************************************************
//*******************************************************TI_time() interrupt 3
/* 参数:
返回值:
功能:
细节:
备注:
*/
void TI_time() interrupt 3
{
TH1=0X3C;TL1=0XB0;
num++;
if(num==20)
{
num=0;
m0++;
if(m0==10)
{ m0=0; 数字钟设计报告
- 8 - m1++;
if(m1==6)
{ m1=0;
f0++;
if(f0==10)
{
f0=0;
f1++;
if(f1==6)
{
f1=0;
h0++;
if(h0==10)
{ h0=0;
h1++;
}
}
}
}
}
}
if(h1==2)
{ if(h0==4)
{
h0=0;h1=0;
}
}
}
//*********************************************************************
//**************************************************************display()
/* 参数:
返回值:
功能:
细节:
备注:
*/
void display()
{
int j;
for(j=0;j<8;j++)
{ P2=wei[j];
switch(j)
{
case 0:if(!naozhong&&xiang)fengming(400);if(naozhong==1)fengming(200);
P0=duan[m0];delay_ms(1);P0=0xff;break;
case 1:P0=duan[m1];delay_ms(1);P0=0xff;break;
case 3:if(con==1)shanshuo(f0);else
P0=duan[f0];delay_ms(1);P0=0xff;break;
case 4:if(con==2)shanshuo(f1);else
P0=duan[f1];delay_ms(1);P0=0xff;break;
case 6:if(con==3)shanshuo(h0);else