时钟电路图:PCB板:推荐精选单片机程序:/*==================================================================== 调试要求: 1.MCU:AT89S52芯片或AT89C52 2.晶振:12MHz 功能:多功能时钟+温度计 ====================================================================*/#include #include #define uchar unsigned char#define uint unsigned intsbit dis_bit1=P2^7;//定义数码管控制口sbit dis_bit2=P2^6;//定义数码管控制口sbit dis_bit3=P2^4;//定义数码管控制口sbit dis_bit4=P2^3;//定义数码管控制口sbit dis_bit5=P2^1;//定义数码管控制口sbit dis_bit6=P2^0;//定义数码管控制口sbit led1_bit=P2^2;//定时LED的控制口推荐精选sbit led2_bit=P2^5;//定时LED的控制口sbit s1_bit=P1^0; //定义S1控制口sbit s2_bit=P1^1; //定义S2控制口sbit s3_bit=P1^2; //定义S3控制口sbit dq_ds18b20=P3^3;//定义控制DS18B20sbit speak=P3^7; //定义蜂鸣器控制口sbit clk_ds1302=P3^6;//定义控制DS1302的时钟线sbit io_ds1302=P3^5;//定义控制DS1302的串行数据sbit rest_ds1302=P3^4;#define smg_data P0//定义数码管数据口void delay_3us();//3US的延时程序void delay_8us(uint t);//8US延时基准程序void delay_50us(uint t);//延时50*T微妙函数的声明void display1(uchar dis_data);//数码管1显示子程序void display2(uchar dis_data);//数码管2显示子程序void display3(uchar dis_data);//数码管3显示子程序void display4(uchar dis_data);//数码管4显示子程序void display5(uchar dis_data);//数码管5显示子程序void display6(uchar dis_data);//数码管6显示子程序void init_t0();//定时器0初始化函数void dis_led();//LED处理函数void judge_s1();//S1按键处理函数void judge_s2();//S2按键处理函数void judge_s3();//S3按键处理函数void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//显示子程序void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);//闪烁显示子程序void judge_dis();//显示处理函数void judge_clock();//显示处理函数void set_ds1302();//设置时间void get_ds1302();//读取当前时间void w_1byte_ds1302(uchar t);//向DS1302写一个字节的数据uchar r_1byte_ds1302();//从DS1302读一个字节的数据//***********************************************************************//DS18B20测温函数定义void w_1byte_ds18b20(uchar value);//向DS18B20写一个字节 uchar r_1byte_ds18b20(void);//从DS18B20读取一个字节的数据void rest_ds18b20(void);//DS18B20复位程序void readtemp_ds18b20(void);//读取温度 void dis_temp();//温度显示函数推荐精选//共阳数码管断码表const uchar tabl1[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, // 0 1 2 3 4 5 0x82,0xf8,0x80,0x90,0x86,0x87,0xFF, //6 7 8 9 E T B 0xc6,0xbf,0xff}; // C -const uchar tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; uchar t0_crycle;uchar hour_count,minute_count,second_count,msecond_count;uchar clock_hour,clock_minute;uchar countdown_second;uchar countdown_hour,countdown_minute;uchar clock_en;//闹钟关闭和开启的标志,1开启,0关闭uchar flag1,second_flag,zancun1,zancun2,zancun3;uchar zancun4,zancun5,zancun6,zancun7;uchar clock_flag,countdown_flag;uchar msecond_minute,msecond_second,msecond_msecond,msecond_flag;//秒表相关参数uint speak_count;uchar templ,temph,temp_flag;uchar t_b,t_s,t_g,t_x,temp_flag2;//从左到右分别存储温度百位,十位,个位,小数位uchar tab23[3];//={0x40,0x59,0x23,0x28,0x11,0x06,0x09};//上电时默认的时间//主程序void main(){ 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(); TR0=1;// // set_ds1302();//设置DS1302的初始时间 //接下来开始编写让数码管显示的程序 while(1) { get_ds1302(); judge_dis();//显示处理 judge_s1(); judge_s2(); judge_s3(); judge_clock();//闹钟处理程序 }}void timer0() interrupt 1{ 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; } }}//**************************************************//显示处理函数void judge_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) { case 1: dis(5,10,11,1,12,12);//显示SET1 led1_bit=1; 。