|
本帖最后由 ll13536121668 于 2019-5-21 11:00 編輯
各位師博幫忙看看這個(gè)源碼,修改成單獨(dú)顯示溫度計(jì)可以嗎?上傳看看謝謝
1.jpg (7.94 KB, 下載次數(shù): 21)
下載附件
2019-5-13 16:36 上傳
2.jpg (212.45 KB, 下載次數(shù): 28)
下載附件
2019-5-13 16:36 上傳
能否可以修改成不帶時(shí)鐘 開機(jī)就是顯示溫度
#include <reg51.h>
#include <math.h>
#include "ADC.H"
#include "ds1302.h"
bit flag, Bell_Swh=1,Hourb,Minb,Kgb,flag_read,dot_Bell=1,Bell_Swh1=1;//鬧鐘調(diào)時(shí)閃爍標(biāo)志位
bit sec=0,min=0,hour=0,year=0,mon=0,day=0,weekk=0,hour_Bell=0,min_Bell=0,hour_time=0,min_time=0;flag_bell=0,bell_bug = 0; //閃爍標(biāo)志位
unsigned char id,id2,d,e,S_1302,S1_1302,H_1302,H_Bell,S_Bell,H_time,S_time; //
unsigned char disbuff[4] ={0};
unsigned char time=0;
unsigned int temp[1];
unsigned int temp_num = 0;
unsigned char code LEDData1 [ ] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff }; //正0-9LED數(shù)值
unsigned char code LEDData2 [ ] = { 0xc0,0xcf,0xA4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED數(shù)值
void Delayms(unsigned int di) //延時(shí)
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<10;db++);
}
void Display(void) //掃描方式led1~led4循環(huán)點(diǎn)亮
{
time++;
if(time==1)
{
if(dot_Bell)
{
P2=LEDData1[disbuff[0]]&0x7f;// 0x7F點(diǎn)亮DP小數(shù)點(diǎn)
LED1=0; LED4=1;
}
else
{
P2=LEDData1[disbuff[0]];
LED1=0; LED4=1;
}
}
if(time==2)
{
if(id>=3)
{
P2=(LEDData2[disbuff[1]])&0x7F;
LED1=1; LED2=0;
}
else
if(flag)
{
P2=(LEDData2[disbuff[1]])&0x7F;
LED1=1; LED2=0;
}
else
{
P2=LEDData2[disbuff[1]];
LED1=1; LED2=0;
}
}
if(time==3)
{
if(id>=3)
{
P2=LEDData1[disbuff[2]]&0x7f;
LED2=1; LED3=0;
}
else
if(flag)
{
P2=LEDData1[disbuff[2]]&0x7f;
LED2=1; LED3=0;
}
else
{
P2=LEDData1[disbuff[2]];
LED2=1; LED3=0;
}
}
if(time==4)
{
time=0;
if(disbuff[3]==0)
{
P2=LEDData1[10];
LED3=1; LED4=0;
}
else
{
P2=LEDData1[disbuff[3]];
LED3=1; LED4=0;
}
}
}
/******************************************************************************/
void Disp(void)//顯示和閃爍函數(shù)
{
unsigned int i=0;
unsigned char a=0,b=0,c=0,f=0;
if(hour==1) //小時(shí)閃爍標(biāo)志位
{
if(flag==1)
{
b=read_clock(0x85);//讀小時(shí)
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
else
{
disbuff[2]=10;
disbuff[3]=10;
}
}
else
{
if(flag_read==1)//250MS 讀一次
{
H_1302=read_clock(0x85);//讀小時(shí)
b=read_clock(0x85);//讀小時(shí)
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
}
if(min==1) //分鐘閃爍標(biāo)志位
{
if(flag==1)
{
d=read_clock(0x83);//讀分鐘
e=d;
d=d>>4;
e=e&0x0f;
disbuff[1]=d;
disbuff[0]=e;
}
else
{
disbuff[1]=10;
disbuff[0]=10;
}
}
else
{
if(flag_read==1) //250MS讀寫一次
{
S1_1302=read_clock(0x81);//讀秒
S_1302=read_clock(0x83);//讀分鐘
d=read_clock(0x83);//讀分鐘
e=d;
d=d>>4;
e=e&0x0f;
disbuff[1]=d;
disbuff[0]=e;
}
}
}
/******************************************************************************/
void Disp2(void)//顯示和閃爍函數(shù)
{
unsigned int i=0;
unsigned char a=0,b=0,c=0,f=0;
if(hour_Bell==1) //小時(shí)閃爍標(biāo)志位
{
if(flag==1)
{
b=read_clock(0xc3);//讀小時(shí)
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
else
{
disbuff[2]=10;
disbuff[3]=10;
}
}
else
{
if(flag_read==1)
{
H_Bell=read_clock(0xc3);//讀取鬧鐘的時(shí)
S_Bell=read_clock(0xc5);//讀取鬧鐘的分
b=read_clock(0xc3);//讀小時(shí)
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
}
if(min_Bell==1) //分鐘閃爍標(biāo)志位
{
if(flag==1)
{
d=read_clock(0xc5);//讀分鐘
e=d;
d=d>>4;
e=e&0x0f;
disbuff[1]=d;
disbuff[0]=e;
}
else
{
disbuff[1]=10;
disbuff[0]=10;
}
}
else
{
if(flag_read==1) //250MS讀寫一次
{
d=read_clock(0xc5);//讀分鐘
e=d;
d=d>>4;
e=e&0x0f;
disbuff[1]=d;
disbuff[0]=e;
}
}
}
/******************************************************************************/
void Disp3(void)//顯示和閃爍函數(shù)
{
unsigned int i=0;
unsigned char a=0,b=0,c=0,f=0;
if(hour_time==1) //小時(shí)閃爍標(biāo)志位
{
if(flag==1)
{
b=read_clock(0xc7);//讀小時(shí)
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
else
{
disbuff[2]=10;
disbuff[3]=10;
}
}
else
{
if(flag_read==1)
{
H_time=read_clock(0xc7);//讀取鬧鐘的時(shí)
S_time=read_clock(0xc9);//讀取鬧鐘的分
if(H_time>S_time)
{
unsigned char i;
i=H_time;
H_time=S_time;
S_time=i;
}
b=read_clock(0xc7);//讀小時(shí)
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
}
if(min_time==1) //分鐘閃爍標(biāo)志位
{
if(flag==1)
{
d=read_clock(0xc9);//讀分鐘
e=d;
d=d>>4;
e=e&0x0f;
disbuff[1]=d;
disbuff[0]=e;
}
else
{
disbuff[1]=10;
disbuff[0]=10;
}
}
else
{
if(flag_read==1) //250MS讀寫一次
{
d=read_clock(0xc9);//讀分鐘
e=d;
d=d>>4;
e=e&0x0f;
disbuff[1]=d;
disbuff[0]=e;
}
}
}
/******************************************************************************/
void id_case1_key(void)//id為1時(shí)的下一級選擇
{
if(Add_Key == 0) //增加
{
Delay(4000);
if(Add_Key == 0) {while(Add_Key ==0); Set_time(id,0); }
//調(diào)用Set_time函數(shù)
}
}
/******************************************************************************/
void id_case2_key(void)//id為1時(shí)的下一級選擇
{
if(Add_Key == 0) //增加
{
Delay(4000);
if(Add_Key == 0) {while(Add_Key ==0); Set_Bell(id,0);}
// Set_Bell(id,0); //調(diào)用Set_Bell函數(shù)
//while(Add_Key ==0);
}
}
void id_AD_scan_key(void)
{
if(Add_Key == 0)
{
Delay(4000);
if(Add_Key == 0)
{
ET1 = 0;
id = 0;
ET0 = 1;
// return;
}
}
}
/******************************************************************************
void id_case3_key(void)//id為1時(shí)的下一級選擇
{
if(Add_Key == 0) //增加
{
Delay(300);
if(Add_Key == 0)
{
dot_Bell=~dot_Bell;
Bell_Swh=dot_Bell;
write_clock(0x8e,0x00);//允許寫操作
write_clock(0xc8,Bell_Swh);
write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
}
while(Add_Key ==0);
}
}
/******************************************************************************/
void Set_Bell(unsigned char sel, bit sel_1)//根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目
{
signed char address,item;
signed char max,mini;
//if(sel==4) {address=0xc6; max=59;mini=0;} //秒
if(sel==4) {address=0xc2; max=23; mini=0;} //時(shí)
if(sel==5) {address=0xc4; max=59;mini=0;} //分
if(sel==6) //標(biāo)志位
{
// address=0xc8;//for read
// if(Add_Key ==0 || Dec_Key ==0)
// Bell_Swh=~Bell_Swh;
// write_clock(address,Bell_Swh);
//address=0xc8;
dot_Bell=~dot_Bell;
Bell_Swh=dot_Bell;
write_clock(0x8e,0x00);//允許寫操作
write_clock(0xca,Bell_Swh);
write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
} //開關(guān)
if(sel==7) {address=0xc6; max=23;mini=0;} //分
if(sel==8) {address=0xc8; max=23; mini=0;} //時(shí)
if(sel==9) //標(biāo)志位
{
// address=0xc8;//for read
// if(Add_Key ==0 || Dec_Key ==0)
// Bell_Swh=~Bell_Swh;
// write_clock(address,Bell_Swh);
//address=0xc8;
dot_Bell=~dot_Bell;
Bell_Swh1=dot_Bell;
write_clock(0x8e,0x00);//允許寫操作
write_clock(0xcc,Bell_Swh1);
write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
} //開關(guān)
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(sel_1==0)
item++;
else
item--;
if(item>max) item=mini;
if(item<mini) item=max;
write_clock(0x8e,0x00);//允許寫操作
write_clock(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進(jìn)制寫入1302
write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
}
/******************************************************************************/
void Timer0_Init(void)//定時(shí)器0初始化
{
/*
AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0x18; //設(shè)置定時(shí)初值
TH0 = 0xFC; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0= 1;*/
/*
//2毫秒@6.000MHz
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0x20; //設(shè)置定時(shí)初值
TH0 = 0xD1; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0 = 1; //enable timer0 interrupt*/
//2毫秒@12.000MHz
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0x40; //設(shè)置定時(shí)初值
TH0 = 0xA2; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0 = 1; //enable timer0 interrupt
}
void Timer1Init(void) //20毫秒@12.000MHz
{
AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0x0F; //設(shè)置定時(shí)器模式
TL1 = 0xE0; //設(shè)置定時(shí)初值
TH1 = 0xB1; //設(shè)置定時(shí)初值
TF1 = 0; //清除TF1標(biāo)志
TR1 = 1; //定時(shí)器1開始計(jì)時(shí)
}
/******************************************************************************/
void Timer0(void) interrupt 1 using 1//中斷入口,冒號閃爍
{
static unsigned char timecount = 0;//
timecount++;
if(timecount > 125)
{
flag_read = ~flag_read;
}
if(timecount > 250)//500MS
{
timecount = 0;
flag = ~flag;
}
Display();
}
void Timer1(void) interrupt 3 using 1
{
temp_num++;
if(temp_num > 40)
{
temp_num = 0;
}
}
void ADC_convert(void)
{
//EA = 0;//關(guān)中斷
ET0 = 0;
if(temp_num == 0)
{
GetADCResult(6,&temp[0]);
//temp[0] = (unsigned int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)temp[0] / ( 1024.0 - (float)temp[0] ) ) ) - 273.15 ) * 100 );
temp[0]=(unsigned int) ((1/(log(((float)temp[0]*4700/(1024-(float)temp[0]))/10000)/3950+1/298.15)-273.15)*100);
temp_num = 1;
}
P2 = LEDData1[temp[0]/1000]; //千位
LED4 = 0;
Delayms(50);
LED4 = 1;
P2 = (LEDData1[temp[0]%1000/100])&0x7F;//百位
LED3 = 0;
Delayms(50);
LED3 = 1;
P2 = LEDData2[temp[0]%1000%100/10];//十位
LED2 = 0;
Delayms(50);
LED2 = 1;
P2 = 0xa7;//c
LED1 = 0;
Delayms(50);
LED1 = 1;
// id = 0;
ET1 = 1;//啟動定時(shí)器1
}
/******************************************************************************/
void main(void)//主函數(shù)
{
P3M1=0x00;
P3M0=0x08;
H_Bell=read_clock(0xc3);//讀取鬧鐘的時(shí)
S_Bell=read_clock(0xc5);//讀取鬧鐘的分
H_time=read_clock(0xc7);//讀取鬧鐘的時(shí)
S_time=read_clock(0xc9);//讀取鬧鐘的分
dot_Bell= Bell_Swh;
InitADC(); //初始化ADC
Timer0_Init();//定時(shí)器T0初始化
Timer1Init();
EA=1;
while(1)//主循環(huán)
{
//設(shè)置時(shí)鐘的初始值,顯示14年4月5號11:59:55
if(OK_Key == 0 && Add_Key == 0)
{
Delay(1000);
if(OK_Key == 0 && Add_Key == 0)
{
while(OK_Key == 0);//等待鍵松開
Init_1302();
H_Bell=read_clock(0xc3);//讀取鬧鐘的時(shí)
S_Bell=read_clock(0xc5);//讀取鬧鐘的分
H_time=read_clock(0xc7);//讀取鬧鐘的時(shí)
S_time=read_clock(0xc9);//讀取鬧鐘的分
dot_Bell= Bell_Swh;
}
}
/*****************************************/
// MF: //返回主界面
/*****************************************/
if (OK_Key == 0) // 設(shè)置和選擇項(xiàng)目鍵
{
Delay(1000);
if(OK_Key == 0)
{
id++;
if(id == 2)
{
ET1 = 0;
ET0 = 1;
}
if(id>9)id=0;
}
while(OK_Key == 0);//等待鍵松開
}
/***************************************/
switch( id )
{
case 0:hour=0;min=0;Disp( ); dot_Bell= Bell_Swh;break;//正常顯示
case 1:hour=0;min=0;ADC_convert();id_AD_scan_key(); dot_Bell= Bell_Swh;break;//顯示溫度
case 2:hour=1;id_case1_key();Disp(); dot_Bell=0;break; //小時(shí)
case 3:hour=0;min=1;id_case1_key();Disp(); dot_Bell=0;break; //分鐘
case 4:hour_Bell=1;id_case2_key();Disp2(); dot_Bell= Bell_Swh;break;
case 5:hour_Bell=0;min_Bell=1;id_case2_key();Disp2();dot_Bell= Bell_Swh;break;
case 6:hour_Bell=0;min_Bell=0;id_case2_key();Disp2();dot_Bell= Bell_Swh;break;
case 7:hour_time=1;id_case2_key();Disp3(); dot_Bell= Bell_Swh1;break;
case 8:hour_time=0;min_time=1;id_case2_key();Disp3();dot_Bell= Bell_Swh1;break;
case 9:hour_time=0;min_time=0;id_case2_key();Disp3();dot_Bell= Bell_Swh1;break;
default:break;
}
if(Bell_Swh == 1)//鬧鐘為開
{
if(H_Bell == H_1302)
{
if(S_Bell == S_1302) //分相等
{
if(S1_1302==0) //秒等于0才開鬧鐘
{
flag_bell=1;
}
if(Add_Key ==0 )//按加退出
{
flag_bell=0;
}
}
else
{
flag_bell=0;
}
}
}//if
/******************************************************************/
/* if(Bell_Swh1 == 1)//整點(diǎn)報(bào)
{
if((H_1302 >=H_time )&&(H_1302<=S_time))
{
if( S_1302 == 0 ) //分相等
{
if(id != 2)
{
if(S1_1302==0x00) //秒等于0才開鬧鐘
{
flag_bell=1;
bell_bug++; //
if(bell_bug == 2) //整點(diǎn)報(bào)時(shí)bug修正小函數(shù)
{ //
bell_bug = 0; //
flag_bell = 0; //
}
}
else
flag_bell=0;
}
}
}
}//if */
if(Bell_Swh1 == 1)//整點(diǎn)報(bào)
{
if((H_1302 >=H_time )&&(H_1302<=S_time))
{
if( (S_1302 == 0) && ((S1_1302==0x00)) ) //分相等 //秒等于0才開鬧鐘
{
if(id != 2)
{
if(id != 3)
{
flag_bell=1;
bell_bug++; //
if(bell_bug == 2) //整點(diǎn)報(bào)時(shí)bug修正小函數(shù)
{ //
bell_bug = 0; //
flag_bell = 0; //
}
}
else
{
flag_bell=0;
}
}
else
{
flag_bell=0;
}
}
else
{
flag_bell = 0;
}
}
else
{
flag_bell = 0;
}
}//if
if(flag_bell) //
{
Bell();
}
/******************************************************************/
}//while
}//main
|
|