单片机课程设计简易数字钟的设计.docx
- 文档编号:9822978
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:18
- 大小:232.28KB
单片机课程设计简易数字钟的设计.docx
《单片机课程设计简易数字钟的设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计简易数字钟的设计.docx(18页珍藏版)》请在冰点文库上搜索。
单片机课程设计简易数字钟的设计
单片机课程设计报告
课程设计题目:
简易数字时钟
学生姓名:
**
学号:
**********
学院:
******
专业班级:
**********
指导老师:
**
2014年5月13日
摘要:
本设计采用了STC公司生产的STC89C52RC型单片机(80C51内核)设计了一个单片机最小系统,加上maxim232和usb转RS232线组成的下载电路,以及共阴极4位一体数码管和按键等外围电路构成了一个简易的数字钟,具有显示年、月、日、时、分、秒的功能,且年、月、日、时、分、秒每一个参数都可以自行设置,以实现时间的校正,总体来说实现了一个数字时钟的应有功能。
关键词:
80C51系列单片机、单片机最小系统、时钟定时、下载电路、4位一体数码管显示
1、设计任务
简易数字时钟:
自制一个单片机最小系统,包括串口下载、复位电路,采用内部定时器计时,或者采用外部时钟芯片DS1302,设计一个具有秒、分、日、月、年的数字时钟,采用四位一体数码管显示相关信息,秒、分显示一页,日、月显示一页,年显示一页。
2、方案选择
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塑料封装。
ULN2003内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。
它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTLCOMS,由达林顿管组成驱动电路。
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、电路原理图
简易数字钟原理图
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个位。
4、程序代码
如下:
#include
sbitanjian1=P1^0;
sbitanjian2=P1^1;
sbitanjian3=P1^2;
sbitanjian4=P1^3;
intanjian11;
intanjian22;
intanjian33;
intanjian44;
intsec=55;//秒,分,时,日,月,年定义全局变量并装载初始值
intmin=37;
inthour=8;
intday=30;
intmon=12;
intyear=2014;
intj=0;//j为秒计时变量,T0每计时50ms时j自增1,当j=20时立刻置0,且sec自增1
intplay=1;//play为显示变量,当为“1”时显示“时,分”,为“2”时显示“月,日”,为“3”时显示“年”,为“0”时显示“秒”
intled[4]={0,0,0,0};
unsignedcharcodetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76};
voiddelay(void)//延时10ms
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
voidmain()//定时器T0用于20分之一秒的定时,定时器T1用于数码管的动态显示,外部中断0为调整时间,外部中断1为设置显示页
{
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;
TH1=0xD8;
TL1=0xF0;
TR0=1;
TR1=1;
for(;;)
{
switch(play)
{
case1:
{
if(anjian1==0)
{
delay();
if(anjian1==0)
anjian11=anjian1;
if(anjian1&!
anjian11)
hour++;
}
elseif(anjian2==0)
{
delay();
if(anjian2==0)
anjian22=anjian2;
if(anjian2&!
anjian22)
hour--;
}
elseif(anjian3==0)
{
delay();
if(anjian3==0)
anjian33=anjian3;
if(anjian3&!
anjian33)
min++;
}
elseif(anjian4==0)
{
delay();
if(anjian4==0)
anjian44=anjian4;
if(anjian4&!
anjian44)
min--;
}
}
break;
case2:
{
if(anjian1==0)
{
delay();
if(anjian1==0)
anjian11=anjian1;
if(anjian1&!
anjian11)
mon++;
}
elseif(anjian2==0)
{
delay();
if(anjian2==0)
anjian22=anjian2;
if(anjian2&!
anjian22)
mon--;
}
elseif(anjian3==0)
{
delay();
if(anjian3==0)
anjian33=anjian3;
if(anjian3&!
anjian33)
day++;
}
elseif(anjian4==0)
{
delay();
if(anjian4==0)
anjian44=anjian4;
if(anjian4&!
anjian44)
day--;
}
}
break;
case3:
{
if(anjian1==0)
{
delay();
if(anjian1==0)
anjian11=anjian1;
if(anjian1&!
anjian11)
year++;
}
elseif(anjian2==0)
{
delay();
if(anjian2==0)
anjian22=anjian2;
if(anjian2&!
anjian22)
year--;
}
elseif(anjian3==0)
{
delay();
if(anjian3==0)
anjian33=anjian3;
if(anjian3&!
anjian33)
year++;
}
elseif(anjian4==0)
{
delay();
if(anjian4==0)
anjian44=anjian4;
if(anjian4&!
anjian44)
year--;
}
}
break;
case0:
{
if(anjian1==0)
{
delay();
if(anjian1==0)
anjian11=anjian1;
if(anjian1&!
anjian11)
sec++;
}
elseif(anjian2==0)
{
delay();
if(anjian2==0)
anjian22=anjian2;
if(anjian2&!
anjian22)
sec--;
}
elseif(anjian3==0)
{
delay();
if(anjian3==0)
anjian33=anjian3;
if(anjian3&!
anjian33)
sec++;
}
elseif(anjian4==0)
{
delay();
if(anjian4==0)
anjian44=anjian4;
if(anjian4&!
anjian44)
sec--;
}
}
break;
}
switch(play)
{
case1:
{led[0]=hour/10;
led[1]=hour%10;
led[2]=min/10;
led[3]=min%10;
}
break;
case2:
{led[0]=mon/10;
led[1]=mon%10;
led[2]=day/10;
led[3]=day%10;
}
break;
case3:
{
led[0]=year/1000;
led[1]=((year%1000)/100);
led[2]=((year%100)/10);
led[3]=(year%10);
}
break;
case0:
{led[0]=16;
led[1]=16;
led[2]=sec/10;
led[3]=sec%10;
}
break;
}
;
}}
voidservice_int1()interrupt2using1
{
if(play==3)
play=0;
elseplay++;
}
voidservice_t0()interrupt1using1//实现1s的延时以及sec到min,min到hour,hour到day,day到month,month到year,year到next_year的转换
{
TH0=0x3C;
TL0=0xB0;
if(j==20)
{
j=0;
sec++;
if(sec>=60)
{
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++;}
}
}
}
}
}
else
{
j++;
}
}
voidservice_t1()interrupt3using1//定时器1实现了数码管的动态显示
{
TH1=0xFC;
TL1=0x18;
if(P2==0xfd)
{P2=0xfb;
P0=table[led[2]];
}
elseif(P2==0xfb)
{
P2=0xf7;
P0=table[led[3]];
}
elseif(P2==0xf7)
{P2=0xfe;
P0=table[led[0]];
}
elseif(P2==0xfe)
{P2=0xfd;
P0=table[led[1]];
}
}
5、制作实物图
6、心得收获
经过本次课程设计,我将课本上的知识转化为了实际的实物,更加深入的理解了单片机这,加强了自己的编程能力,与软硬件调试能力,总体来说,还是收获很大的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 简易 数字 设计