基于单片机控制的多路定时闹钟 - 图文

发布时间 : 星期四 文章基于单片机控制的多路定时闹钟 - 图文更新完毕开始阅读

图5 显示模块 4.控制电路模块

控制电路包括发光二极管电路、蜂鸣器和继电器控制电路。

发光二极管通过一个K级限流电阻连接P2.6端口,当P2.6变为高电平时,发光二极管亮起。

蜂鸣器连接P2.5,由PNP三极管驱动,当三极管导通时蜂鸣器响起。

继电器连接P2.3,由PNP驱动,电平跳变时继电器吸合,开关拨到另一档,使继电器控制的发光二极管电路导通,发光二极管亮起。

图6 控制电路模块

5.总体电路

图7 总体电路 三、课程设计软件设计与流程图 软件如下:

#include sbit led=P2^7;//发光二极管控制端 #define uint unsigned int sbit beep=P2^5;//蜂鸣器控制端 #define uchar unsigned char uint sbit LED3=P2^6;//继电器控制端 i,miao,fen,fen1,fen2,fen3,fen4,shi, void delay(uint z)//延时函数 {uint x,y; shi1,shi2,shi3,shi4,flag1,flag2,flag3,flag4for(x=z;x>0;x--) ,flag5,flag6,aa,K1num, for(y=110;y>0;y--); } K2num,K3num,K4num,K5num,N,xqnum,nian,yue,rivoid write_com(uchar com)//液晶写命令函; 数

uchar code table[]=\ 2014-06-01 {rs=0; \定义初始上电时液晶默认 uchar code table1[]=\ lcden=0;

uchar code Alarm_0[]=\ P3=com; uchar code Alarm_1[]=\ delay(5); uchar code Alarm_2[]=\ lcden=1; uchar code Alarm_3[]=\ delay(5); uchar code Alarm_00[]=\ lcden=0; uchar code Alarm_11[]=\ } uchar code Alarm_22[]=\void write_date(uchar date)//液晶写数据 uchar code Alarm_33[]=\函数 uchar code deng[]=\{rs=1; sbit K1=P1^0;//五个按键 sbit K2=P1^1; lcden=0; sbit K3=P1^2; P3=date; sbit K4=P1^3; delay(5); sbit K5=P1^4; lcden=1; sbit rs=P2^0; delay(5); sbit rw=P2^1; lcden=0; sbit lcden=P2^2; } sbit LED2=P2^3;//灯光控制端 void write_nian(uchar add,uint date)//

年显示函数

{uchar qian,bai,shi,ge; qian=date/1000;

bai=(date-1000*qian)/100;

shi=(date-qian*1000-bai*100)/10; ge=date;

write_com(0x80+add); write_date(0x30+qian); write_date(0x30+bai); write_date(0x30+shi); write_date(0x30+ge); }

void write_yue(uchar add,uchar date)//月显示函数

{uchar shi,ge; shi=date/10; ge=date;

write_com(0x80+add); write_date(0x30+shi); write_date(0x30+ge); }

void write_ri(uchar add,uchar date)//日显示函数

{uchar shi,ge; shi=date/10; ge=date;

write_com(0x80+add); write_date(0x30+shi); write_date(0x30+ge); }

void write_sfm(uchar add,uchar date)//液晶写时分秒函数

{uchar shi,ge; shi=date/10; ge=date;

write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); }

void init()//初始化函数

{ uint num;//写液晶的循环控制变量 aa=0;//中断次数标志

K1num=0;//K1按键被按下的标记变量 K2num=0;//K2按键被按下的标记变量 K3num=0;//K3按键被按下的标记变量 K4num=0;//K4按键被按下的标记变量 K5num=0;

flag1=1;//控制lcd屏刷新的变量

flag2=1;//控制闹钟响闹开启关闭的标记

flag3=1;//控制闹钟响起时,按下K5停止闹钟响闹的标记

flag4=1;//进入闹钟设置时的标记变量 flag5=1;//进入时间设置时的标记变量 flag6=1;//控制闹钟亮起时,按下K5停止闹钟响闹的标记

nian=2014; yue=6; ri=1;

led=1;//发光二极管初始化 LED2=1;//广播初始化 LED3=0; rw=0;

N=100;//系统启动时,闹钟时间到发出的声音为连续三次发出“哗”的一声

miao=0;//系统初始化时间 fen=0; shi=8; fen1=1;//初始化闹钟的时间 shi1=8;

fen2=2;//初始化闹钟的时间 shi2=8;

fen3=3;//初始化闹钟的时间 shi3=8;

fen4=4;//初始化闹钟的时间 shi4=8;

beep=1;//蜂鸣器初始化

lcden=0;//液晶使能端初始化

write_com(0x38);//1602液晶初始化,设置16*2显示。5*7点阵,8位数据接口

write_com(0x0c);//设置开显示,不显示光

write_com(0x06);//写一个字符后地址指针自动加1

write_com(0x01);//显示清0数据指针清0

write_com(0x80);//将数据指针定位到第一行,第一个字处

for(num=0;num<15;num++)//显示闹钟标示 {write_date(table[num]); delay(10); }

write_com(0x80+0x40+11);//写出时间显示部分的两个冒号

write_date(':');

write_com(0x80+0x40+14); write_date(' ');

write_com(0x80+0x40+15); write_date(' ');

write_sfm(12,fen);//送去液晶显示秒分时

write_sfm(9,shi);

TMOD=0x01;//设置定时器0为工作方式1

TH0=(65536-50000)/256;//定时器装初值

TL0=(65536-50000)%6; EA=1;//开总中断

ET0=1;//开定时器0中断 TR0=1; }

void xianshi()//系统时间显示 { write_com(0x80+0x40); for(i=0;i<9;i++)

write_date(table1[i]);

write_com(0x80+0x40+11);//写出时间显示部分的两个冒号

write_date(':');

write_com(0x80+0x40+14); write_date(' ');

write_com(0x80+0x40+15); write_date(' ');

write_sfm(12,fen);//送去液晶显示秒分时

write_sfm(9,shi); }

void time()//更改系统时间 {if((K1num==0)&&(flag3==1)) { write_com(0x80+0x40); for(i=0;i<9;i++)

write_date(table1[i]); }

if(K1==0)//判断K1按下,则开始修改时间 { delay(5); flag5=1; if(K1==0)

{K1num++; while(!K1); if(K1num==1) {TR0=0;

write_com(0x80+0x40+12); write_com(0x0f);//光标闪烁 }

if(K1num==2)

{write_com(0x80+0x40+9);} if(K1num==3)

{write_com(0x80+3);} if(K1num==4)

{write_com(0x80+8);} if(K1num==5)

{write_com(0x80+11);} if(K1num==6) {K1num=0; flag5=0;

write_com(0x0c);//取消光标闪 TR0=1;//启动定时器使时钟开始走 flag1=1; //flag=1.则修改系统时间时液晶显示的系统时间值,flag=0,则为修改闹钟时间时,屏幕显示的是修改闹钟时间的值

write_com(0x80+0x40+11); write_date(':');

write_com(0x80+0x40+14); write_date(' ');

write_com(0x80+0x40+15); write_date(' '); } } }

if(K1num!=0) { if(K2==0) {delay(5); if(K2==0)

{while(!K2);//等待松手 if(K1num==1) {fen++;

if(fen==60) fen=0;

write_sfm(12,fen);

write_com(0x80+0x40+12); }

if(K1num==2) {shi++;

if(shi==24) shi=0;

write_sfm(9,shi);

write_com(0x80+0x40+9); }

if(K1num==3 ) {nian++;

write_nian(3,nian); write_com(0x80+3); } if(K1num==4) {yue++; if(yue==13) yue=1; write_yue(8,yue); write_com(0x80+8); } if(K1num==5) {ri++; if(ri==32) ri=1; write_ri(11,ri); write_com(0x80+11); }

if(K1num==6) {K1num=0; flag5=0;

write_com(0x0c);//取消光标闪

TR0=1;//启动定时器使时钟开始走 flag1=1; //flag=1.则修改系统时间时液晶显示的系统时间值,flag=0,则为修改闹钟时间时,屏幕显示的是修改闹钟时间的值

write_com(0x80+0x40+11); write_date(':');

write_com(0x80+0x40+14); write_date(' ');

write_com(0x80+0x40+15); write_date(' '); } } }

if(K3==0) {delay(5); if(K3==0) {while(!K3); if(K1num==1) {fen--; if(fen==-1) fen=59; write_sfm(12,fen);

write_com(0x80+0x40+12); } if(K1num==2) { shi--; if(shi==-1) shi=23; write_sfm(9,shi); write_com(0x80+0x40+9); } if(K1num==3) {nian--; write_nian(3,nian); write_com(0x80+3); } if(K1num==4) {yue--; if(yue==0) yue=12; write_yue(8,yue); write_com(0x80+8); } if(K1num==5) {ri--; if(ri==0) ri=31; write_ri(11,ri); write_com(0x80+11); } if(K1num==6) {K1num=0;

flag5=0;

write_com(0x0c);//取消光标闪

TR0=1;//启动定时器使时钟开始走 flag1=1; //flag=1.则修改系统时间时液晶显示的系统时间值,flag=0,则为修改闹钟时间时,屏幕显示的是修改闹钟时间的值

write_com(0x80+0x40+11); write_date(':');

write_com(0x80+0x40+14);

联系合同范文客服:xxxxx#qq.com(#替换为@)