单片机数字时钟课程设计报告.docx
《单片机数字时钟课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机数字时钟课程设计报告.docx(39页珍藏版)》请在冰豆网上搜索。
![单片机数字时钟课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-4/16/4c75a5c6-ba6b-4a97-9ec8-8673f9822977/4c75a5c6-ba6b-4a97-9ec8-8673f98229771.gif)
单片机数字时钟课程设计报告
XXXX大学课程设计报告
课程设计名称:
多功能数字时钟
学院:
信息科学与工程学院
姓名:
班级:
09通1班
学号:
指导老师:
时间:
2012.2.20—3.11
“多功能数字时钟”设计要求
一、基于DS1302
二、能调时间(日期、星期、时、分)
三、有三个以上闹铃点,并可以分别设置是否起作用;
四、有一个定时开关,在一个可以设定的时间段内能保持驱动继电器控制输出;
五、所有人工设置的数据应能断电保存,人机界面友好、按键可靠;
六、能通过串行口把当前的时间信息输出
七、可以结合天色的亮暗,决定定时继电器是否输出;
八、显示当前时间的同时显示当前温度;
九、可以使用红外遥控器设置各种参数;
十、可以使用串行口设置各种参数;
备注:
要求实现前面七项,后三点为扩展功能。
芯片STC89C51RC与STC12C5A32S2
芯片型号
RAM
(字节)
ROM
(字节)
工作频率
(Hz)
两者比较
STC89C52RC
512
8K
0—40M
最高可达48M
相同点:
都是低电平驱动;
不同点:
12C5A功能更强大,对驱动的要求更低。
(详细参考资料)
STC12C5A32S2
1280
32K
0—35M(相当于普通8051的0—420M)
各模块使用注意事项简介
基础操作模块
要求
花样灯
能够结合按键灵活控制灯的亮灭形式
液晶显示
包含头文件<16c02.c>;P2.6、P2.7与液晶模块连接;使用时须初始化、清屏;注意显示时的覆盖技巧。
定义与1602LCD的数据口的单片机口线P0口。
数码管
共阳接法;低电平点亮;掌握循环显示各种数值,通过多次扫描稳定显示。
串行通信
初始化,设置波特率。
注意换行puts函数的使用技巧。
多位数发送。
24C02
掌握read与write函数的使用格式。
根据需要进行相应异常处理。
包含头文件<24c02.c>.定义24C02的数据线与单片机的连接P2.2与
P2.3。
ADC采样
P1口8路采样。
第0路(P1.0)抽头可变电阻,第1路(P1.1)接光敏电阻。
PWM
P1.3、P1.4输出脉冲
DS1302
初始化合理的值。
主要芯片简介:
24C02与DS1302
24C02
DS1302
串行E2PROM是基于I2C-BUS的存储器件;
数据掉电不丢失;
擦写寿命:
100万次
数据保持时间:
100年
容量:
2K,256字节
高性能、低功耗、带RAM的实时时钟电路;
可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能;
DS1302存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。
设计思想:
模块化设计
设计思路:
NO.1显示模块
年月日星期的显示
时分秒的显示
闹铃点的显示
定时段的显示
→
NO.2调节模块
年月日星期的调整
时分的调整
闹铃点的调整
定时段的调整
→
NO.3定时模块
在时间段内启动继电器,进行ADC采样(根据天色亮暗决定继电器是否工作)
→
NO.4串行输出块
将时间通过串口发送,在串口助手显示当前的时间。
NO.5按键扫描模块(最重要的模块)
各种按键复用,状态变量的设置。
临界条件的控制。
24C02的及时保存数据。
→
NO.6主函数
各种初始化;
各种异常处理;
主要程序。
多功能数字时钟使用说明书
k5键:
功能选择键
——不按k5键时(调节时钟)
K1:
时加1;
K2:
分加1;
K3时减1;
K4:
分减1;
——按k5(调节闹钟1,2,3)
K1:
时加1;
K2:
分加1;
K3:
分减1;
K4:
控制闹钟的开关
——(调节定时设置)
K1,k2调定时1的时分(只可加)
K3,k4调定时2的时分
——调节是否启动定时
K1控制开关
附加说明:
关于定时
在定时时间段内,启动继电器,进行ADC采样,当天色足够亮。
部分功能展示:
串口发送时间
程序:
//多功能数字时钟
#include
#include<1602lcd.c>
#include<24C02.c>
#include
#include
#include
sbitbeep=P2^0;
sbitjdq=P2^1;//继电器
sbitk1=P1^3;
sbitk2=P1^4;
sbitk3=P1^5;
sbitk4=P1^6;
sbitk5=P1^7;
unsignedcharzt=0,zt1=1,zt2=1,zt3=1,channel,kg=1;
unsignedcharhour_nao1=10,hour_nao2=12,hour_nao3=12;
unsignedcharminute_nao1=58,minute_nao2=12,minute_nao3=12;
unsignedcharhour_ding1=11,hour_ding2=11,minute_ding1=11,minute_ding2=30;
unsignedcharh1,h2,m1,m2,s1,s2;
voiddelay_ms(unsignedintxms);
voiddi_di();
voiddi();
voiddisp();
voidnao_do();
voiddinshi_do();
voidchuanxing_out();
voidkey_do();
voidmain()
{
hour_nao1=read_add_24c02(4);minute_nao1=read_add_24c02(5);//24C02读取
hour_nao2=read_add_24c02(6);minute_nao2=read_add_24c02(7);
hour_nao3=read_add_24c02(8);minute_nao3=read_add_24c02(9);
hour_ding1=read_add_24c02(13);minute_ding1=read_add_24c02(14);
hour_ding2=read_add_24c02(15);minute_ding2=read_add_24c02(16);
if(hour_nao1>23)hour_nao1=0;if(hour_nao2>23)hour_nao2=0;if(hour_nao3>23)hour_nao3=0;//异常处理24C02
if(minute_nao1>59)minute_nao1=0;if(minute_nao2>59)minute_nao2=0;if(minute_nao3>59)minute_nao3=0;
if(hour_ding1>23)hour_ding1=0;if(hour_ding2>23)hour_ding2=0;
if(minute_ding1>59)minute_ding1=0;if(minute_ding2>59)minute_ding2=0;
//--------------------------------------------------
lcd_int();//16c02初始化
lcd_write_com(0x01);
//-----------------------------------------------------
InitADC();//初始化ADC采样
//-----------------------------------------------------
get_ds1302();//获取时间
if(year<11||year>15)//异常处理DS1302
{Init_DS1302(12,3,6,9,57,0,2);
}
//----------------------------------------------------
EX0=1;//打开外部中断0
IT0=1;//外部中断0,设置为下降沿触发
//-----------------------------------------------------
//串口输出初始化
TMOD=0x20;//设置定时器1工作方式为:
方式2、8位初始值自动重装
TH1=0xfd;TL1=0xfd;//设置初始值,以设波特率为9600
TR1=1;//启动定时器1
SM0=0;SM1=1;//SCON寄存器设置串行口工作方式1:
一帧10位、1起始位8数据位1停止位
EA=1;//允许总中断
ES=1;//串行中断允许
REN=1;//允许串口接收
//-----------------------------------------------------------------
while
(1)
{
get_ds1302();//获取时间
disp();//根据zt的值显示相应的信息
nao_do();//闹铃的判断处理
if(kg==0)
dinshi_do();//定时判断处理(包含天色判断),嘎嘎,,把采样放别处进行吧。
。
chuanxing_out();//串行输出信息
//key_do();按键判断处理---用外部中断完成
//保存数据---在数据改变后马上保存
}
}
voiddisp()
{
if(zt==0)//正常走时显示
{lcd_locate(1,2);//1602LCD显示定位在第1行第4个字符处
lcd_2_char(20);lcd_2_char(year);//显示年
lcd_write_data('.');
lcd_2_char(month);//显示月
lcd_write_data('.');
lcd_2_char(day);//显示日
lcd_locate(1,15);
lcd_2_char(week);
lcd_locate(2,1);
lcd_string("");//1602LCD显示定位在第2行第5个字符处
lcd_2_char(hour);//显示小时
lcd_write_data(':
');
lcd_2_char(minute);//显示分
lcd_write_data(':
');
lcd_2_char(second);//显示秒
lcd_string("");
}
//-----------闹铃点1显示-------------------------------
if(zt==1)
{
lcd_locate(1,2);//1602LCD显示定位在第1行第2个字符处
lcd_2_char(hour);//显示小时
lcd_write_data(':
');
lcd_2_char(minute);//显示分
lcd_write_data(':
');
lcd_2_char(second);//显示秒
lcd_string("");
lcd_locate(2,1);
lcd_string("nao1-");
if(zt1==0)
{
lcd_2_char(hour_nao1);//显示小时
lcd_write_data(':
');
lcd_2_char(minute_nao1);//显示分
lcd_string("ON");
}
if(zt1==1)
{
lcd_2_char(hour_nao1);//显示小时
lcd_write_data(':
');
lcd_2_char(minute_nao1);//显示分
lcd_string("OFF");
}
}
//------------闹铃点2显示---------------------------------
if(zt==2)
{lcd_locate(1,2);
lcd_2_char(hour);
lcd_write_data(':
');
lcd_2_char(minute);
lcd_write_data(':
');
lcd_2_char(second);
lcd_string("");
if(zt2==0)
{lcd_locate(2,1);
lcd_string("nao2-");
lcd_2_char(hour_nao2);
lcd_write_data(':
');
lcd_2_char(minute_nao2);
lcd_string("ON");
}
if(zt2==1)
{lcd_locate(2,1);
lcd_string("nao2-");
lcd_2_char(hour_nao2);
lcd_write_data(':
');
lcd_2_char(minute_nao2);
lcd_string("OFF");
}
}
//--------------闹铃点3显示---------------------------------------
if(zt==3)
{lcd_locate(1,2);
lcd_2_char(hour);
lcd_write_data(':
');
lcd_2_char(minute);
lcd_write_data(':
');
lcd_2_char(second);
lcd_string("");
if(zt3==0)
{lcd_locate(2,1);
lcd_string("nao3-");
lcd_2_char(hour_nao3);
lcd_write_data(':
');
lcd_2_char(minute_nao3);
lcd_string("ON");
}
if(zt3==1)
{lcd_locate(2,1);
lcd_string("nao3-");
lcd_2_char(hour_nao3);
lcd_write_data(':
');
lcd_2_char(minute_nao3);
lcd_string("OFF");
}
}
//------------定时显示------------------------------------------
if(zt==4)
{lcd_locate(1,2);
lcd_2_char(hour);
lcd_write_data(':
');
lcd_2_char(minute);
lcd_write_data(':
');
lcd_2_char(second);
lcd_string("");
lcd_locate(2,1);
lcd_string("ds-");
lcd_2_char(hour_ding1);
lcd_write_data(':
');
lcd_2_char(minute_ding1);
lcd_write_data('-');
lcd_2_char(hour_ding2);
lcd_write_data(':
');
lcd_2_char(minute_ding2);
}
if(zt==5)
{lcd_locate(1,2);
lcd_2_char(20);lcd_2_char(year);
lcd_write_data('.');
lcd_2_char(month);
lcd_write_data('.');
lcd_2_char(day);
lcd_string("");
lcd_locate(1,15);
lcd_2_char(week);
lcd_locate(2,1);
lcd_string("GB");
lcd_2_char(hour);
lcd_write_data(':
');
lcd_2_char(minute);
lcd_write_data(':
');
lcd_2_char(second);
lcd_string("");
}
if(zt==6)
{
if(kg==0)
{lcd_locate(1,2);
lcd_2_char(hour);
lcd_write_data(':
');
lcd_2_char(minute);
lcd_write_data(':
');
lcd_2_char(second);
lcd_string("");
lcd_locate(2,1);
lcd_string("dingshiON");
lcd_string("");
}
if(kg==1)
{lcd_locate(1,2);
lcd_2_char(hour);
lcd_write_data(':
');
lcd_2_char(minute);
lcd_write_data(':
');
lcd_2_char(second);
lcd_string("");
lcd_locate(2,1);
lcd_string("dingshiOFF");
lcd_string("");
}
}
}
//==============================================================
voidnao_do()
{
if(zt1==0)
{if(hour==hour_nao1&&minute==minute_nao1)//闹铃1工作
di_di();
}
if(zt2==0)
{if(hour==hour_nao2&&minute==minute_nao2)//闹铃2工作
di_di();
}
if(zt3==0)
{if(hour==hour_nao3&&minute==minute_nao3)//闹铃3工作
di_di();
}
}
//=========================================================
voiddinshi_do()
{/*channel=1;
GetADCResult(channel);//进行某个通道的ADC采样
if((ADC_RES*4+ADC_LOW2)>150)
jdq=0;
else
jdq=1;*/
doubles3,s4;
s3=hour_ding1*60+minute_ding1;
s4=hour_ding2*60+minute_ding2;
if(s3{if(((hour*60+minute)>s3)&&((hour*60+minute){jdq=0;
channel=1;
GetADCResult(channel);//进行某个通道的ADC采样
if((ADC_RES*4+ADC_LOW2)<150)//天色亮则继电器不工作
jdq=1;
}
elsejdq=1;
}
if(s3>s4)
{if(((hour*60+minute)>s3)||((hour*60+minute){jdq=0;
channel=1;
GetADCResult(channel);//进行某个通道的ADC采样
if((ADC_RES*4+ADC_LOW2)<150)
jdq=1;
}
elsejdq=1;
}
}
//=============================================================
voidchuanxing_out()
{h1=hour/10+0x30;
h2=hour%10+0x30;
m1=minute/10+0x30;
m2=minute%10+0x30;
s1=second/10+0x30;
s2=second%10+0x30;
ES=0;//关串口中断
TI=1;//串口发送完成标志
TI=0;//允许发送
SBUF=h1;
while(!
TI);
TI=0;
SBUF=h2;
while(!
TI);
TI=0;
SBUF=':
';
while(!
TI);
TI=0;
SBUF=m1;
while(!
TI);
TI=0;
SBUF=m2;
while(!
TI);
TI=0;
SBUF=':
';
while(!
TI);
TI=0;
SBUF=s1;
while(!
TI);
TI=0;
SBUF=s2;
while(!
TI);
//TI=0;
puts("");
while(!
TI);
TI=0;
delay_ms(500);//延时
}
//===============================================================================
//===========键盘扫描=====================================================