51单片机+ds1302+DS18b20温度时钟电路图+C语言程序.docx
《51单片机+ds1302+DS18b20温度时钟电路图+C语言程序.docx》由会员分享,可在线阅读,更多相关《51单片机+ds1302+DS18b20温度时钟电路图+C语言程序.docx(70页珍藏版)》请在冰豆网上搜索。
![51单片机+ds1302+DS18b20温度时钟电路图+C语言程序.docx](https://file1.bdocx.com/fileroot1/2022-10/9/700972ea-a1d9-478b-9230-addf2f1eb6d3/700972ea-a1d9-478b-9230-addf2f1eb6d31.gif)
51单片机+ds1302+DS18b20温度时钟电路图+C语言程序
时钟电路图:
*■11
PCB板:
酱时井務ft是用诵m-pdfMerisi口叵因
Fjr齐舱C:
s®工细理沖缶皿ndm-*TfS'4'包田Ui>'irftZS:
M
訂开始LJ-雲匕®务如1痒3月计ttVl.•呈T』d"吐拠席射■w耳pg文宇■[豹…
SS时軽件思冃说
单片机程序:
/*===================================================================
调试要求:
1.MCU:
AT89S52芯片或AT89C52
2.晶振:
12MHz
功能:
多功能时钟+温度计
/
#inelude
#ineludevintrins.h>
sbits1_bit=P1A0;//定义S1控制口
sbits2_bit=P01;//定义S2控制口
sbits3_bit=P02;//定义S3控制口
sbitdq_ds18b20=P3A3;//定义控制DS18B20
sbitspeak=P3A7;//定义蜂鸣器控制口
sbitclk_ds1302=P3A6;//定义控制DS1302勺时钟线sbitio_ds1302=P3A5;//定义控制DS1302勺串行数据
sbitrest_ds1302=P3A4;
#definesmg_dataP0//定义数码管数据口
voiddelay_3us();//3US的延时程序
延时50*T微妙函数的声明
//数码管1显示子程序
//数码管2显示子程序
//数码管3显示子程序
//数码管4显示子程序
//数码管5显示子程序
//数码管6显示子程序
voiddelay_8us(uintt);//8US延时基准程序
voiddelay_50us(uintt);//
voiddisplay1(uchardis_data);voiddisplay2(uchardis_data);voiddisplay3(uchardis_data);voiddisplay4(uchardis_data);voiddisplay5(uchardis_data);voiddisplay6(uchardis_data);
voidinit_t0();//定时器0初始化函数
voiddis_led();//LED处理函数
voidjudge_s1();//S1按键处理函数
voidjudge_s2();//S2按键处理函数
voidjudge_s3();//S3按键处理函数
//显
s2,uchar
voiddis(uchars6,uchars5,uchars4,uchars3,uchars2,uchars1);
示子程序
voiddis_san(uchars6,uchars5,uchars4,uchars3,uchar
s1,ucharsan);〃闪烁显示子程序
voidjudge_dis();//显示处理函数
voidjudge_clock();//显示处理函数
voidset_ds1302();//设置时间
voidget_ds1302();//读取当前时间
voidw_1byte_ds1302(uchart);//向DS130写一个字节的数据
ucharr_1byte_ds1302();//从DS130读一个字节的数据
//DS18B20测温函数定义
voidw_1byte_ds18b20(ucharvalue);//向DS18B2写一个字节ucharr_1byte_ds18b20(void);//从DS18B2读取一个字节的数据voidrest_ds18b20(void);//DS18B20复位程序
voidreadtemp_ds18b20(void);//读取温度
voiddis_temp();//温度显示函数
//共阳数码管断码表
constuchartabl1[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
//012345
0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
//6789ETB
0xc6,0xbf,0xff};
//C-
constuchar
tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uchart0_crycle;
ucharhour_count,minute_count,second_count,msecond_count;
ucharclock_hour,clock_minute;
ucharcountdown_second;
ucharcountdown_hour,countdown_minute;
ucharclock_en;//闹钟关闭和开启的标志,1开启,0关闭
ucharflag1,second_flag,zancun1,zancun2,zancun3;
ucharzancun4,zancun5,zancun6,zancun7;
ucharclock_flag,countdown_flag;
ucharmsecond_minute,msecond_second,msecond_msecond,msecond_flag;//秒表相关参数
uintspeak_count;
uchartempl,temph,temp_flag;
uchart_b,t_s,t_g,t_x,temp_flag2;//从左到右分别存储温度百位,十位,个
位,小数位
uchartab23[3];〃二{0x40,0x59,0x23,0x28,0x11,0x06,0x09};//上电时默认的
时间
//主程序
voidmain()
{
P3=0x00;
flag1=0;
zancun3=0;
msecond_minute=0;//置秒表相关参数为0
msecond_second=0;
msecond_msecond=0;
speak=1;//关闭蜂鸣器
speak_count=0;
clock_hour=0;
clock_minute=0;
clock_flag=0;
countdown_flag=0;//倒计时标志位为0
clock_en=0;//开机时默认关闭闹钟
init_t0();
TRO=1;//
//set_ds1302();〃设置DS1302勺初始时间
//接下来开始编写让数码管显示的程序
while
(1)
{
get_ds1302();
judge_dis();//显示处理
judge_s1();
judge_s2();
judge_s3();
judge_clock();//闹钟处理程序
}_
}
voidtimerO()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;t0_crycle++;
if(t0_crycle==2)//0.1秒
{
t0_crycle=0;
msecond_flag=1;
msecond_count++;
if(msecond_count==10)//1秒
{_
msecond_count=0;
second_flag=1;
}
}
}
//**************************************************
//显示处理函数
voidjudge_dis()
{
if(flag1==0)
{
if(second_flag==1)
{_
zancun7++;
second_flag=0;
}_
if(zancun7<1)
{
if(temp_flag2==1)
{一
readtemp_ds18b20();//读取温度temp_flag2=0;
厂
dis_temp();//温度显示函数
}
if(zancun7>=1)
{
temp_flag2
=1;
zancun4
=hour_count&0xf0;
zancun4
>>=4;
zancun5
=minute_count&0xf0;
zancun5
>>=4;
zancun6
=second_count&0xf0;
zancun6
>>=4;
dis(zancun4,hour_count&0x0f,zancun5,minute_count&0x0f,zancun6,second_count&0x0f);
dis_led();
if(zancun7==5)zancun7=0;
}
}
if(flag1!
=0)
{
switch(flag1)
{
case1:
dis(5,10,11,1,12,12);//显示SET1
led1_bit=1;
led2_bit=1;
break;
case2:
dis(5,10,11,2,12,12);//显示SET2
break;
case3:
dis(5,10,11,3,12,12);//显示SET3
break;
case4:
dis(5,10,11,4,12,12);//显示SET4
break;
case5:
dis(5,10,11,5,12,12);//显示SET5
break;
case6:
dis_san(zancun1/10,zancunl%10,zancun2/10,zancun2%0,12,12,1);break;
case7:
dis_san(zancun1/10,zancunl%10,zancun2/10,zancun2%0,12,12,2);break;
case8:
dis_san(zancun1/10,zancunl%10,zancun2/10,zancun2%0,12,12,3);break;
case9:
//进入修改时间,时间分位个位闪烁
dis_san(zancun1/10,zancunl%10,zancun2/10,zancun2%0,12,12,4);break;
case10:
//进入修改闹钟,闹钟小时十位闪烁
dis_san(zancunl/10,zancunl%10,zancun2/10,zancun2%0,12,zancun3,1);break;
case11:
//进入修改闹钟,闹钟小时个位闪烁
dis_san(zancun1/10,zancunl%10,zancun2/10,zancun2%0,12,zancun3,2);break;
case