|
本帖最后由 ll13536121668 于 2019-5-21 11:00 编辑
各位师博帮忙看看这个源码,修改成单独显示温度计可以吗?上传看看谢谢
能否可以修改成不带时钟 开机就是显示温度
#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;//闹钟调时闪烁标志位
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; //闪烁标志位
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数值
unsigned char code LEDData2 [ ] = { 0xc0,0xcf,0xA4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED数值
void Delayms(unsigned int di) //延时
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<10;db++);
}
void Display(void) //扫描方式led1~led4循环点亮
{
time++;
if(time==1)
{
if(dot_Bell)
{
P2=LEDData1[disbuff[0]]&0x7f;// 0x7F点亮DP小数点
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)//显示和闪烁函数
{
unsigned int i=0;
unsigned char a=0,b=0,c=0,f=0;
if(hour==1) //小时闪烁标志位
{
if(flag==1)
{
b=read_clock(0x85);//读小时
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);//读小时
b=read_clock(0x85);//读小时
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
}
if(min==1) //分钟闪烁标志位
{
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)//显示和闪烁函数
{
unsigned int i=0;
unsigned char a=0,b=0,c=0,f=0;
if(hour_Bell==1) //小时闪烁标志位
{
if(flag==1)
{
b=read_clock(0xc3);//读小时
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);//读取闹钟的时
S_Bell=read_clock(0xc5);//读取闹钟的分
b=read_clock(0xc3);//读小时
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
}
if(min_Bell==1) //分钟闪烁标志位
{
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)//显示和闪烁函数
{
unsigned int i=0;
unsigned char a=0,b=0,c=0,f=0;
if(hour_time==1) //小时闪烁标志位
{
if(flag==1)
{
b=read_clock(0xc7);//读小时
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);//读取闹钟的时
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);//读小时
a=b;
b=b>>4;
a=a&0x0f;
disbuff[3]=b;
disbuff[2]=a;
}
}
if(min_time==1) //分钟闪烁标志位
{
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时的下一级选择
{
if(Add_Key == 0) //增加
{
Delay(4000);
if(Add_Key == 0) {while(Add_Key ==0); Set_time(id,0); }
//调用Set_time函数
}
}
/******************************************************************************/
void id_case2_key(void)//id为1时的下一级选择
{
if(Add_Key == 0) //增加
{
Delay(4000);
if(Add_Key == 0) {while(Add_Key ==0); Set_Bell(id,0);}
// Set_Bell(id,0); //调用Set_Bell函数
//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时的下一级选择
{
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);//写保护,禁止写操作
}
while(Add_Key ==0);
}
}
/******************************************************************************/
void Set_Bell(unsigned char sel, bit sel_1)//根据选择调整相应项目
{
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;} //时
if(sel==5) {address=0xc4; max=59;mini=0;} //分
if(sel==6) //标志位
{
// 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);//写保护,禁止写操作
} //开关
if(sel==7) {address=0xc6; max=23;mini=0;} //分
if(sel==8) {address=0xc8; max=23; mini=0;} //时
if(sel==9) //标志位
{
// 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);//写保护,禁止写操作
} //开关
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);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
}
/******************************************************************************/
void Timer0_Init(void)//定时器0初始化
{
/*
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0= 1;*/
/*
//2毫秒@6.000MHz
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x20; //设置定时初值
TH0 = 0xD1; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //enable timer0 interrupt*/
//2毫秒@12.000MHz
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x40; //设置定时初值
TH0 = 0xA2; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //enable timer0 interrupt
}
void Timer1Init(void) //20毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xE0; //设置定时初值
TH1 = 0xB1; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
/******************************************************************************/
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;//关中断
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;//启动定时器1
}
/******************************************************************************/
void main(void)//主函数
{
P3M1=0x00;
P3M0=0x08;
H_Bell=read_clock(0xc3);//读取闹钟的时
S_Bell=read_clock(0xc5);//读取闹钟的分
H_time=read_clock(0xc7);//读取闹钟的时
S_time=read_clock(0xc9);//读取闹钟的分
dot_Bell= Bell_Swh;
InitADC(); //初始化ADC
Timer0_Init();//定时器T0初始化
Timer1Init();
EA=1;
while(1)//主循环
{
//设置时钟的初始值,显示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);//读取闹钟的时
S_Bell=read_clock(0xc5);//读取闹钟的分
H_time=read_clock(0xc7);//读取闹钟的时
S_time=read_clock(0xc9);//读取闹钟的分
dot_Bell= Bell_Swh;
}
}
/*****************************************/
// MF: //返回主界面
/*****************************************/
if (OK_Key == 0) // 设置和选择项目键
{
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; //小时
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)//整点报
{
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) //整点报时bug修正小函数
{ //
bell_bug = 0; //
flag_bell = 0; //
}
}
else
flag_bell=0;
}
}
}
}//if */
if(Bell_Swh1 == 1)//整点报
{
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) //整点报时bug修正小函数
{ //
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
|
|