① 基于单片机的数字时钟设计开题报告
//我这里有一个定时的闹钟,你把蜂鸣器的中断改为LED就行了,可以通过P2^0--P2^3实现秒表的显示和以及调时调分和调节闹钟以及闹钟的开关,有问题可以给我留言QQ834589429
#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
codeunsignedchartab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管0-9
sbitA1=P2^0;
sbitA2=P2^1;
sbitA3=P2^2;
sbitA4=P2^3;
sbitbeep=P1^4;
unsignedcharShiwan;
unsignedcharWanwei;
unsignedcharQianwei;
unsignedcharBaiwei;
unsignedcharShiwei;//定义十位
unsignedcharGewei,Naoling1,Naoling2,Naoling3,Naoling4;//定义个位
staticunsignedcharhour=12,minute=30,second=0,count=0;
staticunsignedcharalarmhour=12,alarmminute=29,i=0,j=0,k;
/******************************************************************/
/*延时函数*/
/******************************************************************/
voiddelay(unsignedintcnt)
{
while(--cnt);
}
voidxianshi(void)
{
Gewei=tab[second%10];//个位显示处理
Shiwei=tab[second/10];//十位显示值处理
if(second%2==0)
{
Baiwei=tab[minute%10];
Qianwei=tab[minute/10];//千位
}
else
{
Baiwei=(tab[minute%10]|0x80);//百位显示处理:加点的字码
Qianwei=(tab[minute/10]|0x80);
}
if(second%2!=0)
{
Wanwei=tab[hour%10];
Shiwan=tab[hour/10];
}
else
{
Wanwei=(tab[hour%10]|0x80);
Shiwan=(tab[hour/10]|0x80);
}
Naoling1=~tab[alarmhour%10];
Naoling2=~tab[alarmhour/10];
Naoling3=~tab[alarmminute%10];
Naoling4=~tab[alarmminute/10];
}
voidtimer0()interrupt3using1
{
TH1=0x3c;//中断设置初始化
TL1=0xb0;
if(alarmhour==hour&&alarmminute==minute&&j==1)
{
beep=0;
}
}
/******************************************************************/
/*定时器中断函数*/
/******************************************************************/
voidtimer1()interrupt1using0
{
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
xianshi();
if(count==99)//100x10ms=1S,大致延时时间
{
count=0;
second++;//秒加1
if(second==60)
minute++;
{
if(second==60)
second=0;
{
if(minute==60)
hour++;
{
if(minute==60)
minute=0;
{
if(hour==24)
hour=0;
}
}
}
}
}
}
/******************************************************************/
/*主函数*/
/******************************************************************/
voidmain()
{
TMOD|=0x01;//定时器设置10msin12Mcrystal,工作在模式1,16位定时
TH0=0xd8;
TL0=0xf0;
IE=0x82;//打开中断
TR0=1;//打开定时开关
xianshi();
EA=1;ET0=1;TMOD|=0x21;TR0=1;//开中断总开关,计数器0允许中断,设置中断模式,启动计数器0
ET1=1;TR1=1;
while(1)
{
{
if(!A3)
{
delay(10000);
if(!A3)
{
i++;if(i==7)i=0;
xianshi();
}
}
}
{
if(!A4)
{
delay(10000);
if(!A4)
{
i--;if(i==255)i=6;
xianshi();
}
}
}
switch(i)
{
case0://正常显示控制
{
P1=0x1e;//片选个位
P0=~Baiwei;//显示个位
delay(300);//短暂延时
P1=0x1d;//片选十位
P0=~Qianwei;//显示十位
delay(300);//短暂延时
P1=0x1b;//片选百位
P0=~Wanwei;//显示百位
delay(300);//短暂延时
P1=0x17;//片选千位
P0=~Shiwan;//显示千位
delay(300);//短暂延时
P1=0x1f;
P0=0xff;
delay(300);
};break;
case1://调分控制
{
if(second%2!=0)
{
P1=0x1e;//片选个位
P0=~Baiwei;//显示个位
delay(300);//短暂延时
P1=0x1d;//片选十位
P0=~Qianwei;//显示十位
delay(300);//短暂延时
P1=0x1f;
P0=0xff;
delay(300);
}
else
delay(300);
delay(300);
{
if(!A1)
{
delay(10000);//消抖
if(!A1)
{
minute++;if(minute==61)minute=0;
xianshi();
}
}//按键处理
}
{
if(!A2)
{
delay(10000);//消抖
if(!A2)
{
minute--;if(minute==255)minute=59;
xianshi();
}
}
}
};break;
case2://调时控制
{
if(second%2==0)
{
P1=0x1b;//片选百位
P0=~Wanwei;//显示百位
delay(300);//短暂延时
P1=0x17;//片选千位
P0=~Shiwan;//显示千位
delay(300);//短暂延时
P1=0x1f;
P0=0xff;
delay(300);
}
else
delay(300);
delay(300);
{
if(!A1)
{
delay(10000);//消抖
if(!A1)
{
hour++;if(hour==24)hour=0;
xianshi();
}
}//按键处理
}
{
if(!A2)
{
delay(10000);//消抖
if(!A2)
{
hour--;if(hour==255)hour=23;
xianshi();
}
}
}
};break;
case3://秒显示控制
{
P1=0x1e;//片选个位
P0=~Gewei;//显示个位
delay(300);//短暂延时
P1=0x1d;//片选十位
P0=~Shiwei;//显示十位
delay(300);//短暂延时
P1=0x1f;
P0=0xff;
delay(300);
delay(300);
delay(300);
};break;
case4://闹钟控制
{
if((!A1)||(!A2))
{
delay(10000);
if((!A1)||(!A2))j++;
if(j==2)
j=0;
}
switch(j)
{
case0:{
P1=0x1e;//片选个位
P0=~0x71;//显示个位
delay(300);//短暂延时
P1=0x1d;//片选十位
P0=~0x71;//显示十位
delay(300);//短暂延时
P1=0x1b;//片选百位
P0=~0x3f;//显示百位
delay(300);//短暂延时
P1=0x17;//片选千位
P0=~0x40;//显示千位
delay(300);//短暂延时
delay(300);
};break;
case1:{
P1=0x1e;//片选个位
P0=~0x37;//显示个位
delay(300);//短暂延时
P1=0x1d;//片选十位
P0=~0x3f;//显示十位
delay(300);//短暂延时
P1=0x1b;//片选百位
P0=0xff;//显示百位
delay(300);//短暂延时
P1=0x17;//片选千位
P0=~0x40;//显示千位
delay(300);//短暂延时
delay(300);
}
}
};break;
case5://闹铃分钟调整
{
{
P1=0x1e;
P0=Naoling3;
delay(300);
P1=0x1d;
P0=Naoling4;
delay(300);
P1=0x1f;
P0=0xff;
delay(300);
delay(300);
delay(300);
}
{
if(!A1)
{
delay(10000);//消抖
if(!A1)
{
alarmminute++;if(alarmminute==61)alarmminute=0;
}
}//按键处理
}
{
if(!A2)
{
delay(10000);//消抖
if(!A2)
{
alarmminute--;if(alarmminute==255)alarmminute=59;
}
}
}
};break;
case6://闹铃小时调整
{
{
P1=0x1b;
P0=Naoling1;
delay(300);
P1=0x17;
P0=Naoling2;
delay(300);
P1=0x1f;
P0=0xff;
delay(300);
delay(300);
delay(300);
}
{
if(!A1)
{
delay(10000);//消抖
if(!A1)
{
alarmhour++;if(alarmhour==24)alarmhour=0;
}
}//按键处理
}
{
if(!A2)
{
delay(10000);//消抖
if(!A2)
{
alarmhour--;if(alarmhour==255)alarmhour=23;
}
}
};break;
default:break;
}
}
}
}
② 求一个51单片机定时闹钟程序。要C语言。能够调时间
我来发一个C语言51单片机时钟程序,希望能帮到你
/*程序功能:带定时闹铃时钟*/
/*---------------------------------------------------------------*/
#include<AT89X51.H>/*包含器件配置文件*/
#defineucharunsignedchar
#defineuintunsignedint
charDATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/
ucharhour=0,min=0,sec=0;/*时、分、秒单元清零*/
uchardeda=0;/*5mS计数单元清零*/
bitd_05s=0;/*0.5秒标志*/
ucharset=0;/*模式设定标志*/
ucharm=0;
ucharflag=0;/*RAM掉电标志*/
voiddelay(uintk);/*延时?函数*/
voidconv();/*走时单元转换*/
voiddisp();/*走时时间显示?函数*/
/*------------------------走时?函数部分----------------------*/
/*定时器T05mS初始化*/
voidinit_timer()
{
TMOD=0x01;
TH0=-(4800/256);
TL0=-(4800%256);
IE=0x82;
TR0=1;
}
/*---------------------------------*/
/*5mS定时中断服务?函数*/
voidT0_srv(void)interrupt1
{
TH0=-(4800/256);
TL0=-(4800%256);
deda++;
}
/*----------------------------------*/
/*时、分、秒单元及走时单元转换*/
voidconv()
{
if(deda<=100)d_05s=0;
elsed_05s=1;
if(deda>=200){sec++;deda=0;}
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24){hour=0;}
}
/*------------------------显示?函数部分----------------------*/
/*走时时间显示?函数*/
voiddisp()
{
P0=DATA_7SEG[hour/10];P2=0xf7;delay(1);
P0=DATA_7SEG[hour%10];P2=0xfb;delay(1);
if(d_05s==1){if(P2_2==0)P0_7=0;elseP0_7=1;}
delay(1);
P0=DATA_7SEG[min/10];P2=0xfd;delay(1);
P0=DATA_7SEG[min%10];P2=0xfe;delay(1);
}
/*----------------------调整时间?函数部分-------------------*/
/*调整走时时间*/
voidset_time()
{ucharm;
if(P2_5==0)delay(1);
if(P2_5==0)hour++;
if(hour==24)hour=0;
for(m=0;m<30;m++)
{
disp();
if(P2_2==0)P0_7=0;
elseP0_7=1;
delay(1);
}
if(P2_6==0)delay(1);
if(P2_6==0)min++;
if(min==60)min=0;
for(m=0;m<30;m++)
{
disp();
if(P2_2==0)P0_7=0;
elseP0_7=1;
delay(1);
}
}
/*------------------按键扫描、延时等?函数部分-------------------*/
/*走时时间程序?函数*/
voidtime()
{
conv();/*走时单元转换?函数*/
disp();/*走时时间显示?函数*/
}
/*------------------------------------*/
/*扫描按键?函数*/
voidscan_key()
{
delay(1);
if(P2_4==0)set++;
if(set>=2)set=0;
if(set==1)flag=0x55;
F0:if(P2_4==0)gotoF0;/*按键未释放,在此等候*/
}
/*------------------------------*/
/*延时?函数*/
voiddelay(uintk)
{
uinti,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
/*-----------------------主函数-------------------------*/
/*主函数*/
voidmain()
{
init_timer();/*定时器T0初始化*/
while(1)/*无限循环*/
{
if(P2_4==0)scan_key();/*有按键,调用按键扫描?函数*/
switch(set)/*根据set键值散转*/
{
case0:time();break;/*走时时间程序*/
case1:set_time();break;/*走时时间调整*/
default:break;/*其它退出*/
}
if(flag!=0x55)/*判断掉电标志*/
{
P0=0xc0;P2=0xc0;delay(100);
P2=0xff;delay(400);
}
}
}
③ 基于51单片机简易时钟闹钟八位数码管显示Proteus仿真
设计目的
本设计旨在实现一个基于51单片机的多功能数字时钟闹钟,其主要功能包括显示时、分、秒,并能设置时间和闹钟。该设计采用单片机内部定时器实现计时功能,通过八位数码管显示当前时间。用户可以对时、分、秒进行独立设置,设置时数码管将闪烁。此外,闹钟功能可让用户设置特定时间,当时间到达,蜂鸣器将每秒鸣响一次,持续6秒。用户可以通过按键手动消除闹钟。
仿真过程
开始仿真后,数码管显示时间00:00:00,时间逐秒递增。按下设置键进入设置模式,时钟、分钟、秒钟分别闪烁以表示当前正在设置相应参数。设置完毕后,按下设置键退出设置模式,数码管恢复正常显示。用户可以通过功能切换按键显示闹钟时间,并通过类似步骤设置闹钟时间。闹钟时间到时,蜂鸣器将鸣响,每隔1秒响一次,持续6秒,可通过按键停止闹钟。
程序代码
使用KEIL4或KEIL5编译程序代码,代码配有注释,以便理解代码功能。
原理图与电路
原理图使用AD软件绘制,可供实物参考。Proteus仿真与实物有差异,包括运行环境、调试方式、电路连接方式和运行速度,以及功能实现等。
设计报告
设计报告包含设计框图、引言、硬件设计、软件设计、仿真调试、总结和参考文献,总计超过6600字。
设计资料清单
设计资料包括仿真、程序源码、开题报告、原理图、功能要求、元器件清单、设计报告、软硬件流程框图、讲解视频、设计相关软件资料、答辩技巧、设计报告常用描述等内容。
常见问题及解决方法
提供解决常见使用问题的指南,包括仿真图、程序源码、开题报告、原理图、功能要求、元器件清单、设计报告、软硬件流程框图、讲解视频等内容的说明和链接。
④ 单片机数字时钟设计
ORG 0X00
LJMP START
ORG 0X30
#30H ; 设置堆栈
MOV P1, #0XFE ; 设置在数码管的第0位显示
MOV A, #0X01 ; A置初值为0000 0001
LOOP: MOV P0, A ; 在数码管上显示寄存器A中的二进制数
MOV R3, #0X5C ; 延时1S
ACALL EXTDELAY ; 延时观察和记录对应的显示结果
RL A ; 将A寄存器的值循环左移一位
SJMP LOOP ; 循环显示
DELAY: MOV R1, #0XC8 ; 延时20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY:ACALL DELAY
DJNZ R3,EXTDELAY
RET
END
ORG 0X00
SJMP START
ORG 0X30
START: MOV SP, #30H ; 设置堆栈
MOV P1, #0XFE ; 位选信号,选中第0个数码管
MOV P0, #0X6F ; 在数码管上显示"9"
LOOP: SJMP LOOP ; 循环执行程序
END
ORG 0X00
LJMP START
ORG 0X30
START: MOV SP, #30H ; 设置堆栈
MOV P1, #0XFE ; 设置在数码管的第0位显示
MOV DPTR, #TABLE ; 送TABLE地址到DPTR指针
MOV R7, #0X00 ; 标志变量,限制指针在TABLE区
LOOP: CLR A
MOVC A, @A+DPTR ; 取TABLE区的字形码
MOV P0, A ; 在数码管上显示寄存器A中的二进制数
INC R7 ; 指针控制加一
MOV R3, #0X5C ; 延时
ACALL EXTDELAY ; 延时观察和记录对应的显示结果
CJNE R7, #0X10, NEXT ; 如果TABLE中数未取到最后一个,继续取下一个
MOV R7, #0X00 ; 如果已经取过所有数,则重新开始去第一个数
MOV DPTR, #TABLE
SJMP LOOP
NEXT: INC DPTR ; 指针寄存器加1
SJMP LOOP ; 循环显示
DELAY: MOV R1, #0XC8 ; 延时20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY: ACALL DELAY
DJNZ R3 ,EXTDELAY
RET
TABLE: ; 相对地址
DB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F ;十六进制字形数据
0 1 2 3 4 5 6 7 8 9 (十六进制数)
DB 0X77,0X7C,0X39,0X5E,0X79,0X71 ; 十六进制字形数据
A B C D E F (十六进制数)
END
ORG 0X00
LJMP START
ORG 0X30
START: MOV SP, #30H
MOV A, #0XFE ; 置A寄存器为0XFE
MOV DPTR, #TABLE
MOV R7, #0X00
LOOP: MOV P1, A ; 在数码管的第0位显示
MOV R4,A ; 保存A寄存器的制
CLR A
MOVC A, @A+DPTR
MOV P0, A
MOV A, R4 ; 还原A寄存器的值
CJNE A, #0XBF, SKIP ; 如果已在第五位显示,那么下一次
MOV A, #0XFE ; 从第0位开始显示
SJMP LOOP ; 跳回执行下一次显示
SKIP: RL A ; A左移一位,下一次在数码管的下一位显示数字
INC R7
MOV R3, #0X5C
ACALL EXTDELAY
CJNE R7, #0X10, NEXT ; 如果TABLE中数未取到最后一个,继续取下一个
MOV R7, #0X00 ; 如果已经取过所有数,则重新开始去第一个数
MOV DPTR, #TABLE
SJMP LOOP
NEXT: INC DPTR ; 指针寄存器加1
SJMP LOOP ; 循环显示
DELAY: MOV R1, #0XC8 ; 延时20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY: ACALL DELAY
DJNZ R3, EXTDELAY
RET
TABLE: ; 相对地址
DB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F ;十六进制字形数据
0 1 2 3 4 5 6 7 8 9 (十六进制数)
DB 0X77,0X7C,0X39,0X5E,0X79,0X71 ; 十六进制字形数据
A B C D E F (十六进制数)
END