全套资料包含:Proteus仿真源文件+keil C语言源程序+AD原理图+流程图+元器件清单+说明书等
资料下载:↓↓↓
通过网盘分享的文件:资料分享
链接: 百度网盘 请输入提取码 提取码: tgnu
目录
项目功能:
1、选 DS1307型号时钟芯片作为记录时钟/日历,可以读取DS1307芯片上当前的时间。
2、显示时间采用8位数码管。P0为 LED 数码管的段码输入端,P2为位码输入端。
3、设置时间并使用键盘输入时间。四个键的设计和定文如下:
(1) SET键(时间调整设置键):其功能是当该键按下时,进入时间调整功能。
(2) ALM键(定时时间设置键):其功能是当该键按下时,进入定时时间输入功能。
(3)+1键:其功能是当该键按下时,被调整位加一。
(4) RET键:其功能是当该键按下时,指向下一个要调整的位。
4、按键的接入方式:
(1)SET键:通过P3口INT0引角接入,中断工作方式。
(2) ALM键:通过P3口INT1引角接入,中断工作方式。
(3)+1键:通过P3口P3,0引角接入,查询工作方式。
(4)RET键:通过P3口 P3.1引角接入,查询工作方式。
5、蜂响器为声音信号,接在P1.6脚。
6、小功率电磁继电器打开和关闭外部JZC-23F电源来执行此功能,继电器触点通过端口P1.7打开和关闭。
项目文件:
一、Proteus仿真源文件

二、AD原理图文件

二、报告说明书
三、系统流程图
四、器件清单
| 元件 | 型号 | 数量 |
| 单片机 | AT89C51 | 1 |
| 电容 | 10uf | 1 |
| 电容 | 30pf | 2 |
| 晶振 | 12MHZ | 1 |
| 电阻 | 10k | 1 |
| 按钮 | 5 | |
| LED | 红色 | 1 |
| 电阻 | 100欧 | 1 |
| 电阻 | 1k | 2 |
| 三极管 | PNP | 2 |
| 蜂鸣器 | 有源 | 1 |
| 数码管 | 8位共阴 | 1 |
| 排阻 | 10k | 1 |
| 实时时钟 | DS1307 | 1 |
| 继电器 | 5V | 1 |
| 晶振 | 32.768KHz | 1 |
五、Keil c语言程序源代码(部分)
#include "reg51.h"
#include"DS1307.h"
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^6;//蜂鸣器
sbit relay=P1^7;//电磁阀
sbit k3=P3^0;//按钮
sbit k4=P3^1;
sbit test=P1^0;
//数码管编码
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar sec=0,mode=0;//系统变量
uchar shi=0,fen=0,miao=0;//定时
uchar start=0;//启停
uchar beep_time=0;
uchar flag=0;
//显示
void disp1()
{
if(mode==0)//正常走时
{
P0=0;
P2=0xfe;
P0=smgduan[TIME[2]>>4];
delay(100);
P0=0;
P2=0xfd;
P0=smgduan[TIME[2] & 0x0f];
delay(100);
P0=0;
P2=0xfb;
P0=0x40;
delay(100);
P0=0;
P2=0xf7;
P0=smgduan[TIME[1]>>4];
delay(100);
P0=0;
P2=0xef;
P0=smgduan[TIME[1] & 0x0f];
delay(100);
P0=0;
P2=0xdf;
P0=0x40;
delay(100);
P0=0;
P2=0xbf;
P0=smgduan[TIME[0]>>4];
delay(100);
P0=0;
P2=0x7f;
P0=smgduan[TIME[0] & 0x0f];
delay(100);
}
else if(mode<4)//设置闪烁
{
P0=0;
P2=0xfe;
if((mode!=1)||(flag==0))
P0=smgduan[TIME[2]>>4];
delay(100);
P0=0;
P2=0xfd;
if((mode!=1)||(flag==0))
P0=smgduan[TIME[2] & 0x0f];
delay(100);
P0=0;
P2=0xfb;
P0=0x40;
delay(100);
P0=0;
P2=0xf7;
if((mode!=2)||(flag==0))
P0=smgduan[TIME[1]>>4];
delay(100);
P0=0;
P2=0xef;
if((mode!=2)||(flag==0))
P0=smgduan[TIME[1] & 0x0f];
delay(100);
P0=0;
P2=0xdf;
P0=0x40;
delay(100);
P0=0;
P2=0xbf;
if((mode!=3)||(flag==0))
P0=smgduan[TIME[0]>>4];
delay(100);
P0=0;
P2=0x7f;
if((mode!=3)||(flag==0))
P0=smgduan[TIME[0] & 0x0f];
delay(100);
}
else //设置闪烁
{
P0=0;
P2=0xfe;
if((mode!=4)||(flag==0))
P0=smgduan[shi/10];
delay(100);
P0=0;
P2=0xfd;
if((mode!=4)||(flag==0))
P0=smgduan[shi%10];
delay(100);
P0=0;
P2=0xf7;
if((mode!=5)||(flag==0))
P0=smgduan[fen/10];
delay(100);
P0=0;
P2=0xef;
if((mode!=5)||(flag==0))
P0=smgduan[fen%10];
delay(100);
P0=0;
P2=0xbf;
if((mode!=6)||(flag==0))
P0=smgduan[miao/10];
delay(100);
P0=0;
P2=0x7f;
if((mode!=6)||(flag==0))
P0=smgduan[miao%10];
delay(100);
}
}
void main()//主函数
{
uchar k=0,j=0;
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
//设置INT1
IT1=1;//跳变沿出发方式(下降沿)
EX1=1;//打开INT1的中断允许。
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
//显示
disp1();
//设置
if(!k4 &&(k!=4))
{
k=4;
if(mode>0)
{
if(mode<4)//时间
{
if(mode<3)
mode++;
else
{
mode=0;
start=0;//停止
}
}
else //定时
{
if(mode<6)
mode++;
else
{
mode=0;
start=1;//启动
}
}
}
}
if(k3 && k4)
k=0;
//设置时间
if(mode==1)
{
if(!k3 &&(k!=3))//小时
{
k=3;
j=(TIME[2]>>4)*10+(TIME[2] & 0x0f);
if(j<23)
j++;
else
j=0;
TIME[2]=(j/10<<4)+j%10;
init1307();
}
}
if(mode==2)
{
if(!k3 &&(k!=3))//分钟
{
k=3;
j=(TIME[1]>>4)*10+(TIME[1] & 0x0f);
if(j<59)
j++;
else
j=0;
TIME[1]=(j/10<<4)+j%10;
init1307();
}
}
if(mode==3)
{
if(!k3 &&(k!=3))//秒
{
k=3;
j=(TIME[0]>>4)*10+(TIME[0] & 0x0f);
if(j<59)
j++;
else
j=0;
}
}
//设置定时
if(mode==4)
{
if(!k3 &&(k!=3))//小时
{
k=3;
if(shi<23)
shi++;
else
shi=0;
}
}
if(mode==5)
{
if(!k3 &&(k!=3))//分钟
{
k=3;
if(fen<59)
fen++;
else
fen=0;
}
}
if(mode==6)
{
if(!k3 &&(k!=3))//秒
{
k=3;
if(miao<59)
miao++;
else
miao=0;
}
}
}
}
//定时器中断
void Timer0() interrupt 1
{
uchar a1=0,a2=0,a3=0;
if(sec<10)//0.5s
sec++;
else
{
sec=0;
if(mode==0)
read_time();//读取时间
//电磁阀控制
if(start)
{
relay=0;
a1=(TIME[2]>>4)*10+(TIME[2] & 0x0f);//编码转换BCD-二进制
if((shi==a1)&&(fen==a2)&&(miao==a3)) //时间判断
{
start=0;
beep_time=40;
}
}
else
{
relay=1;
}
flag=!flag;
}
//蜂鸣器
TH0=0X3C;
TL0=0XB0;
}
void Int0() interrupt 0 //外部中断0的中断函数
{
if(mode==0)
mode=1;
}
void Int1() interrupt 2 //外部中断1的中断函数
{
if(mode<4)
mode=4;
}
六、全套资料包含
七:项目资源获取
需要完整的资料可以点击下面的名片关注,回复“资料”!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
5372

被折叠的 条评论
为什么被折叠?



