课程设计报告蓝牙校时电子钟.docx
《课程设计报告蓝牙校时电子钟.docx》由会员分享,可在线阅读,更多相关《课程设计报告蓝牙校时电子钟.docx(15页珍藏版)》请在冰豆网上搜索。
课程设计报告蓝牙校时电子钟
课程设计报告:
可校时数字钟设计
设计目的:
设计制作具有下列功能的数字钟:
1.自动计时,lcd显示器显示时、分和秒;
2.具备手机校准功能;
3.具备手机设置定时闹钟功能。
设计原理:
stc89c51单片机自带计时器计时,使用T0计时器,P1.0~P1.4为按键检测端口,P1.6为闹钟输出,P2.5~P2.7为LCD1602使能端控制,P0口接LCDD段选,通过串口通信与蓝牙模块连接,手机app发送数据。
设计流程:
先实现初始化与键盘监控;再通过中断完成数据的接收;最后通过按键检测实现数据更替。
流程图如图所示。
使用器材:
单片机STC52RC
LCD1602
蓝牙模块HC06
开关
LED灯泡
电阻
导线
11.0592晶振
电容
开发板USB接口
排阻
电位器
电路仿真图:
实验结果:
该电子钟具有5个按键,三个控制时分秒的增加,一个控制蓝牙校时,一个控制闹钟设计。
LCD第一排显示当前时间,第二排显示闹钟,蓝牙校时及闹钟设置由手机app完成数据发送。
数字钟源程序:
//*头文件*/
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineyh0x80//LCD第一行的初始位置
#defineer0x80+0x40//LCD第二行初始位置
sbita1=P1^0;//“秒加”键K1
sbita2=P1^1;//“分钟加”键K2
sbita3=P1^2;//“小时加”键K3
sbitb1=P1^3;//“校时”键K1
sbitb2=P1^4;
sbitc=P1^5;
sbitrs=P2^7;
sbitrw=P2^6;
sbiten=P2^5;
uchara;
uchari=0;
ucharseconde=0;
ucharminite=0;
ucharhour=12;
ucharmstcnt=0;
ucharcodetab1[]={"Time:
:
:
"};//显示的固定字符
ucharcodetab2[]={"Clock:
:
:
"};//显示的固定字符
uchartate[6];
ucharldat[6]="130000";
uchartime[6]="120000";
voiddelay_1ms(uintxms)//延时函数,有参函数
{
uintx,y;
for(x=xms;x>0;x--)
for(y=124;y>0;y--);
}
//****液晶写入指令函数****//
voidwrite_1602com(ucharcom)
{
rs=0;//数据/指令选择置为指令
rw=0;
delay_1ms
(1);
P0=com;//送入数据
delay_1ms
(1);
en=1;//拉高使能端,为制造有效的下降沿做准备
delay_1ms
(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}
//***液晶写入数据函数****//
voidwrite_1602dat(uchardat)
{
rs=1;//数据/指令选择置为数据
rw=0;
delay_1ms
(1);
P0=dat;//送入数据
delay_1ms
(1);
en=1;//en置高电平,为制造下降沿做准备
delay_1ms
(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}
//***液晶初始化函数****//
voidlcd_init()
{
write_1602com(0x38);//设置液晶工作模式,意思:
16*2行显示,5*7点阵,8位数据
delay_1ms(5);
write_1602com(0x0c);//开显示不显示光标
delay_1ms(5);
write_1602com(0x06);//整屏不移动,光标自动右移
delay_1ms(5);
write_1602com(0x01);//清显示
delay_1ms(5);
write_1602com(er+0);
for(a=0;a<14;a++)
{
write_1602dat(tab2[a]);
}
write_1602com(yh+0);
for(a=0;a<13;a++)
{
write_1602dat(tab1[a]);
}
}
voidpro_value()
{
tate[0]=hour/10;//将湿度的整数部分的十位和个位分开
tate[1]=hour%10;
tate[2]=minite/10;
tate[3]=minite%10;
tate[4]=seconde/10;
tate[5]=seconde%10;
write_1602com(yh+6);
for(a=0;a<2;a++)
{
write_1602dat(tate[a]+0x30);
}
write_1602com(yh+9);
for(a=2;a<4;a++)
{
write_1602dat(tate[a]+0x30);
}
write_1602com(yh+12);
for(a=4;a<6;a++)
{
write_1602dat(tate[a]+0x30);
}
}
voidpros_data()
{
write_1602com(er+7);
for(a=0;a<2;a++)
{
write_1602dat(time[a]);
}
write_1602com(er+10);
for(a=2;a<4;a++)
{
write_1602dat(time[a]);
}
write_1602com(er+13);
for(a=4;a<6;a++)
{
write_1602dat(time[a]);
}
}
voiddisplay1()//设置显示
{
pros_data();
}
voidtime_pro(void)
{
if(seconde==60)//秒钟设为60进制
{seconde=0;
minite++;
if(minite==60)//分钟设为60进制
{minite=0;
hour++;
if(hour==24)//时钟设为24进制
{hour=0;}
}
}
}
voidkeyscan(void)
{
if(a1==0)//按键1秒的调整
{
delay_1ms(30);
if(a1==0)
{
seconde++;
if(seconde==60)
{seconde=0;}
}
}
if(a2==0)//按键2分的调整
{
delay_1ms(30);
if(a2==0)
{
minite++;
if(minite==60)
{minite=0;}
}
}
if(a3==0)//按键3小时的调整
{
delay_1ms(30);
if(a3==0)
{
hour++;
if(hour==24)
{hour=0;}
}
}
}
voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次
{
TH0=0x3c;
TL0=0xb0;
TMOD=0x11;
mstcnt++;
if(mstcnt==20)
{
seconde++;
mstcnt=0;//注意点。
对计数单元的清零十分的重要,本次调试中就是
}//因为忽略了这一点,给我早成了很大的被动。
}
voidlanyaInit(void)
{
TMOD=0x21;
SCON=0x50;
EA=1;
ES=1;
TR1=1;
TH1=0xfd;
TL1=0xfd;
}
voidreceive()interrupt4
{
if(RI)
{
ldat[i]=SBUF;
RI=0;
}
SBUF=ldat[i];
while(!
TI);
TI=0;
i++;
if(i>=6){
i=0;
}
}
voidcheck()
{
if(b1==0)
{
delay_1ms(30);
if(b1==0)
{
hour=(ldat[0]-48)*10+(ldat[1]-48);
minite=(ldat[2]-48)*10+(ldat[3]-48);
seconde=(ldat[4]-48)*10+(ldat[5]-48);
}
}
if(b2==0)
{
delay_1ms(30);
if(b2==0)
{
for(a=0;a<6;a++)
{
time[a]=ldat[a];
}
}
}
}
voidclock()
{
if(minite==0)
{
if(seconde==0)
{
c=1;
delay_1ms(3000);
c=0;
}
}
if(hour==((time[0]-48)*10+(time[1]-48)))
{
if(minite==((time[2]-48)*10+(time[3]-48)))
{
if(seconde==((time[4]-48)*10+(time[5]-48)))
{
c=1;
delay_1ms(3000);
c=0;
}
}
}
}
/**********主函数******************/
voidmain()
{
lcd_init();
display1();
P1=0xff;
TMOD=0x21;//time0为定时器,方式1
TH0=0x3c;//预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
c=0;
while
(1)
{
keyscan();//按键扫描
time_pro();
pro_value();
pros_data();
lanyaInit();
check();
clock();
}
}