单片机课程设计简易数字钟的设计_单片机课程设计数字钟
单片机课程设计简易数字钟的设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“单片机课程设计数字钟”。
单片机课程设计报告
课程设计题目:简易数字时钟
学生姓名:** 学号:********** 学院:****** 专业班级:**********
指导老师:**
2014年5月13日
摘要:
本设计采用了STC公司生产的STC89C52RC型单片机(80C51内核)设计了一个单片机最小系统,加上maxim232和usb转RS232线组成的下载电路,以及共阴极4位一体数码管和按键等外围电路构成了一个简易的数字钟,具有显示年、月、日、时、分、秒的功能,且年、月、日、时、分、秒每一个参数都可以自行设置,以实现时间的校正,总体来说实现了一个数字时钟的应有功能。
关键词:80C51系列单片机、单片机最小系统、时钟定时、下载电路、4位一体数码管显示
一、设计任务 简易数字时钟:自制一个单片机最小系统,包括串口下载、复位电路,采用内部定时器计时,或者采用外部时钟芯片DS1302,设计一个具有秒、分、日、月、年的数字时钟,采用四位一体数码管显示相关信息,秒、分显示一页,日、月显示一页,年显示一页。
二、方案选择
2.1、采用uln2003驱动数码管
由于单片机的I/O口的拉电流只有大约1mA左右,不足以提供4-5mA的电流以驱动数码管上的led,故需要为数码管提供一个驱动电路,如果采用三极管的话由于数码管有7段(实际是8段,但本设计只需要使用7段),需要7个三极管来驱动,给焊接部分增加了工作量,故可考虑采用ULN2003以给数码管提供驱动电流。
Uln2003的内部原理图
ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。
该电路的特点如下:[3]
ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路
直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还
可以在高负载电流并行运行。
ULN2003 采用DIP—16 或SOP—16 塑料封装。
内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTL COMS,由达林顿管组成驱动电路。ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。
ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达350mA,9脚可以悬空。
比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。
输入5VTTL电平,输出可达500mA/5V。
ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。该电路的特点如下: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
2.2、直接用单片机加上拉电阻的P0口驱动数码管
对于51单片机的4个IO口来说有一个IO口与其他三个有点不同,那就是P0口,由于P0口(在作为输出IO口时)是OC门在最小系统中需要加一个上拉电阻,由此,可以用P0口作为数码管的驱动(可以通过合理配置上拉电阻的大小以提供足够的驱动电流)
51单片机的P0口内部电路图
由于相对来说接一个排阻便宜可靠,且方便,且也足以提供驱动数码管的电流,故采用方案2:直接用单片机加上拉电阻的I/O口驱动数码管
三、电路原理图
简易数字钟原理图
3.1最小系统
本设计最小系统与一般的51最小系统设计保持一致性,晶振电路为12M的晶体振荡器搭配两个30pF的电容组成,复位电路由5v接一个开关与电容并联再与电阻串联后接地构成,下载电路采用的是串口下载,为电脑上连一根usb转串口线,然后串口练到电路上,再通过max232芯片进行电平转换将RS232串口的电平转换为单片机的5v以进行电平匹配。3.2共阴极4位一体数码管
四位一体数码管
数码管的显示由段选和位选控制,段选为图片中的每一位“8”型上的a、b、c、d、e、f、g、h共8段构成。位选有4个引脚,分别对应于数码管的4个位。
四、程序代码 如下:
#include sbit anjian1 = P1^0;sbit anjian2 = P1^1;sbit anjian3 = P1^2;sbit anjian4 = P1^3;int anjian11;int anjian22;int anjian33;int anjian44;int sec=55;//秒,分,时,日,月,年定义全局变量并装载初始值 int min=37;int hour=8;int day=30;int mon=12;int year=2014;int j=0;//j为秒计时变量,T0每计时50ms时j自增1,当j=20时立刻置0,且sec自增1 int play=1;//play为显示变量,当为“1”时显示“时,分”,为“2”时显示“月,日”,为“3”时显示“年”,为“0”时显示“秒” int led[4]={0,0,0,0};unsigned char code table[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76};void delay(void)
//延时10ms {
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);} void main(){ IE=0x8F;//开总中断,开定时T0,开定时T1,开外部中断0,开外部中断1 IP=0x00;//设置中断优先级均为低优先级,默认优先级为:调整时间》定时》设置显示页 IT0=1;IT1=1;TMOD=0x11;//定时器0工作于工作方式1,定时工作方式,由运行控制位TR1启动定时器;定时器1工作于工作方式1,定时工作方式,由运行控制位TR1启动定时器 P2=0Xfd;
TH0 = 0x3C;
TL0 = 0xB0;
{ switch(play){ case 1 :
{
if(anjian1==0)
{
{ delay();delay();if(anjian1==0)anjian11=anjian1;if(anjian1 &!anjian11)hour++;
} TH1=0xD8;TL1=0xF0;TR0=1;TR1=1;
//定时器T0用于20分之一秒的定时,定时器T1用于数码管的动态显示,外部中断0为调整时间,外部中断1为设置显示页
for(;;)else if(anjian2==0)
if(anjian2==0)
anjian22=anjian2;
if(anjian2 &!anjian22)
hour--;
else if(anjian3==0)
{
delay();
if(anjian3==0)
anjian33=anjian3;
if(anjian3 &!anjian33)
min++;
else if(anjian4==0)
{
delay();
if(anjian4==0)
anjian44=anjian4;
if(anjian4 &!anjian44)
min--;
}
break;case 2 : {
if(anjian1==0)
{
delay();
if(anjian1==0)
anjian11=anjian1;
if(anjian1 &!anjian11)
mon++;
else if(anjian2==0)
{
delay();
if(anjian2==0)
anjian22=anjian2;
if(anjian2 &!anjian22)
mon--;
else if(anjian3==0)
{
delay();if(anjian3==0)}
}
}
}
}
anjian33=anjian3;
if(anjian3 &!anjian33)
day++;
else if(anjian4==0)
{
delay();
if(anjian4==0)
anjian44=anjian4;
if(anjian4 &!anjian44)
day--;
}
break;case 3 : {
if(anjian1==0)
{
delay();
if(anjian1==0)
anjian11=anjian1;
if(anjian1 &!anjian11)
year++;
else if(anjian2==0)
{
delay();
if(anjian2==0)
anjian22=anjian2;
if(anjian2 &!anjian22)
year--;
else if(anjian3==0)
{
delay();
if(anjian3==0)
anjian33=anjian3;
if(anjian3 &!anjian33)
year++;
else if(anjian4==0)
{
delay();
if(anjian4==0)anjian44=anjian4;}
}
}
}
}
if(anjian4 &!anjian44)
year--;
}
break;case 0 : {
if(anjian1==0)
{
delay();
if(anjian1==0)
anjian11=anjian1;
if(anjian1 &!anjian11)
sec++;
else if(anjian2==0)
{
delay();
if(anjian2==0)
anjian22=anjian2;
if(anjian2 &!anjian22)
sec--;
else if(anjian3==0)
{
delay();
if(anjian3==0)
anjian33=anjian3;
if(anjian3 &!anjian33)
sec++;
else if(anjian4==0)
{
delay();
if(anjian4==0)
anjian44=anjian4;
if(anjian4 &!anjian44)
sec--;
} break;}
switch(play){
}
}
}
}
} case 1 : { led[0]=hour/10;
};}}
void service_int1()interrupt 2 using 1 { if(play==3)play=0;else play++;} void service_t0()interrupt 1 using 1
//实现1s的延时以及sec到min,min到hour,hour到day,day到month,month到year,year到next_year的转换 {
TH0 = 0x3C;if(j==20){
j=0;sec++;if(sec>=60)
TL0 = 0xB0;
led[1]=hour%10;led[2]=min/10;led[3]=min%10;
} break;
led[1]=mon%10;led[2]=day/10;led[3]=day%10;
} case 2 : { led[0]=mon/10;break;
led[0]=year/1000;led[1]=((year%1000)/100);led[2]=((year%100)/10);led[3]=(year%10);
} case 3 : {
break;
led[1]=16;led[2]=sec/10;led[3]=sec%10;
} case 0 : { led[0]=16;break;
}
else { { sec=0;min++;if(min>=60){ min=0;hour++;if(hour>=24){hour=0;day++;if(day>=31){ day=1;mon++;if(mon>=13){ mon=1;year++;} } } } } } j++;} void service_t1()interrupt 3 using 1 //定时器1实现了数码管的动态显示 {
TH1=0xFC;TL1=0x18;if(P2==0xfd){P2=0xfb;P0=table[led[2]];} else if(P2==0xfb){ P2=0xf7;P0=table[led[3]];} else if(P2==0xf7){P2=0xfe;P0=table[led[0]];
} else if(P2==0xfe){P2=0xfd;P0=table[led[1]];} }
五、制作实物图
六、心得收获
经过本次课程设计,我将课本上的知识转化为了实际的实物,更加深入的理解了单片机这,加强了自己的编程能力,与软硬件调试能力,总体来说,还是收获很大的。
设计任务书................I第一章 绪论...............11.1课程设计的意义..........1第二章 电路设计方案................2.1数字电子中4的基本原理..........2.2第三章......
湖南工业大学课程设计资料袋电气与信息工程学院学年第学期课程名称单片机系统课程设计指导教师凌云职称教授学生姓名专业班级测控101学号题目数字钟(C51版)成绩起止日期 2012......
单片机数字钟设计心得体会 经过一周的课程设计,我收获颇多,有深刻的心得体会。 实训让我们受益匪浅。首先是关于单片机方面的。我们学到了许多关于单片机系统开发的知识,从最开......
单片机数字钟设计总结经过一周的课程设计,我收获颇多,有深刻的心得体会。 实训让我们受益匪浅。首先是关于单片机方面的。我们学到了许多关于单片机系统开发的知识,从最开始选......
#include#define uchar unsigned char #define uint unsigned intuchar code table[]="I LOVE YOU !"; uchar code table1[]="2014:06:14"; sbit lcden=P3^5;sbit lcdrs......
