658///**********晶振为6M********/////
#include<reg51.h>
#include<intrins.h>
sbit p17=P1^7;
sbit p37=P3^7;
sbit p30=P3^0;
sbit p31=P3^1;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p33=P3^3;
sbit p32=P3^2;
sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit BEEP=P3^3;
bit TP_read_flag=1;
#define uchar unsigned char
#define uint unsigned int
uchar jishu1=0;
uchar jishu2=0;
uchar fen=59,shi=8,miao=30;
uchar ii,jj;
uint KEY1_count,KEY2_count;
bit k=0; //K=1,做减法运算
uchar nao1_shi=12,nao1_fen=53,nao2_shi=12,nao2_fen=41;
uchar disp; //显示切换控制
uchar xuanzhuan_count;
bit clock_co; //显示时间控制
bit aram_flag;
bit aram_stop;
bit flag; //闹钟开启和关闭的标志位 flag=1:闹钟开启 flag=0:闹钟关闭
bit wendu; //wendu=0,显示温度 wendu=1,显示时间
bit set_model;
bit xuanzhuan_flag;
bit aram_on;
uchar tt; //存储温度值
uint yanshi1,yanshi2;
uchar shuzi1[10]={0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,0x90};
uchar shuzi2[10]={0x0c0,0x0cf,0x0a4,0x86,0x8b,0x92,0x90,0x0c7,0x80,0x82};
void delay_18b20(uint);
uchar ReadOneChar(void);
uchar readtemperature(void);
void WriteOneChar(uchar);
void KEY_check(void);
void alarm(void);
void lingsheng();
void xuanzhuan(uchar miao);
void delay(uint t) //延时约100US
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<11;j++);
}
void xianshi(uchar temp)
{
if(p17)
{
P1=temp;}
else
{
P1=0x7f&temp;
delay(3);
}
}
void timer0() interrupt 1
{
TH0=-50000/256;
TL0=-50000%256; //6M晶振定时100MS
jishu1++;
if(jishu1>=10)
{
jishu1=0;
miao++;
p33=0;
delay(100);
p33=1;
xuanzhuan_flag=1;
}
if(miao>=60)
{
miao=0;
fen++;
p37=1;
p37=0;
}
if(fen>=60)
{
shi++;
p33=0;
fen=0;
if(shi>=24)
shi=0;
}
if(set_model==0) //未处于设置状态
if(miao%20==0&&TP_read_flag==1) //每20S显示一次温度
{
ET0=0;
tt=readtemperature(); //读取温度
ET0=1;
wendu=1; //
TP_read_flag=0;
}
else if(miao%20!=0)
{
TP_read_flag=1;
wendu=0;
}
}
void int0(void) interrupt 0 // 2号按键变量++按下
{
//delay(800);
if(!p32)
{
//while(!p32);
EX1=0; //执行外中断0的时候将外中断1关掉,避免产生干扰
switch(disp)
{
case 2:{
shi++;
if(shi==24)
{shi=0;}
}break;
case 3:{
fen++;
if(fen==60)
{fen=0;}
}break;
case 4:{
nao1_shi++;
if(nao1_shi==24)
{nao1_shi=0;}
}break;
case 5:{
nao1_fen++;
if(nao1_fen==60)
{nao1_fen=0;}
}break;
case 6:{
nao2_shi++;
if(nao2_shi==24)
{nao2_shi=0;}
}break;
case 7:{
nao2_fen++;
if(nao2_fen==60)
{nao2_fen=0;}
}break;
default:{;}
}
TR1=1; //开启定时器1,查询是否响应减法运算
IE1=0; //开外中断1之前使其中断标志位清零,避免了因干扰产生的中断的干扰
EX1=1;
}
}
void timer1(void) interrupt 3
{
TH1=-2000/256;
TL1=-2000%256;
xuanzhuan(miao);
}
//延时函数
void delay_18b20(uint i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
bit x;
p32 = 1; //DQ复位
delay_18b20(2); //稍做延时
p32 = 0; //单片机将DQ拉低
delay_18b20(50); //精确延时 大于 480us
p32 = 1; //拉高总线
delay_18b20(10);
x=p32; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18b20(10);
}
//读一个字节
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
p32 = 0; // 给脉冲信号
dat>>=1;
p32 = 1; // 给脉冲信号
if(p32)
dat|=0x80;
delay_18b20(5);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
p32 = 0;
p32 = dat&0x01;
delay_18b20(5);
p32 = 1;
dat>>=1;
}
delay_18b20(5);
}
//读取温度
uchar readtemperature(void)
{
uchar a=0;
uchar b=0;
uchar t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
a=a>>4; //低位右移4位,舍弃小数部分
t=b<<4; //高位左移4位,舍弃符号位
t=t|a;
return(t);
}
void main()
{
uchar temp1,temp2,temp3,temp4;
ii=0;jj=0;
BEEP=0;
delay(250);
BEEP=1;
delay(250);
BEEP=0;
delay(200);
BEEP=1;
clock_co=0;
flag=1;
disp=1; //初始化默认显示时间
wendu=0; //默认显示时间
p37=0;
PT0=1; //使定时器0中断优先
TMOD=0x11; //开定时器0,工作方式1
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
TH0=-50000/256;
TL0=-50000%256; //6M晶振定时100MS
TH1=-4000/256;
TL1=-4000%256;
while(1)
{
KEY_check();
alarm();
// xuanzhuan(miao);
if(!wendu) //wendu=0显示时间
{
//delay(100);
switch(disp)
{
case 1:{
temp1=shuzi1[fen%10]; //正常显示时间
temp2=shuzi2[fen/10];
temp3=shuzi1[shi%10];
temp4=shuzi1[shi/10];
yanshi1=20;
yanshi2=20;
}break;
case 2:{ //时设置显示状态
temp1=shuzi1[fen%10];
temp2=shuzi2[fen/10];
temp3=shuzi1[shi%10];
temp4=shuzi1[shi/10];
yanshi1=1;
yanshi2=20;
}break;
case 3:{ //分设置显示状态
temp1=shuzi1[fen%10];
temp2=shuzi2[fen/10];
temp3=shuzi1[shi%10];
temp4=shuzi1[shi/10];
yanshi1=20;
yanshi2=1;
}break;
case 4:{
temp1=shuzi1[nao1_fen%10]; //闹1时设置显示状态
temp2=shuzi2[nao1_fen/10];
temp3=shuzi1[nao1_shi%10];
temp4=shuzi1[nao1_shi/10];
yanshi1=1;yanshi2=20;
}break;
case 5:{
temp1=shuzi1[nao1_fen%10]; //闹1分设置显示状态
temp2=shuzi2[nao1_fen/10];
temp3=shuzi1[nao1_shi%10];
temp4=shuzi1[nao1_shi/10];
yanshi1=20;yanshi2=1;
}break;
case 6:{
temp1=shuzi1[nao2_fen%10]; //闹2时设置显示状态
temp2=shuzi2[nao2_fen/10];
temp3=shuzi1[nao2_shi%10];
temp4=shuzi1[nao2_shi/10];
yanshi1=1;yanshi2=20;
}break;
case 7:{
temp1=shuzi1[nao2_fen%10];
temp2=shuzi2[nao2_fen/10];
temp3=shuzi1[nao2_shi%10];
temp4=shuzi1[nao2_shi/10];
yanshi1=20;
yanshi2=1;
}break;
}
}
else //wendu=0显示温度
{
yanshi1=10;yanshi2=10;
temp1=0x0c6;
temp2=0x0c0;
temp3=shuzi1[tt%10];
temp4=shuzi1[tt/10];
}
xianshi(temp1); //动态显示
p35=0;
delay(yanshi1);
p35=1;
xianshi(temp2);
p34=0;
delay(yanshi1);
p34=1;
xianshi(temp3);
p31=0;
delay(yanshi
szz.rar_电子钟 温度
版权申诉
62 浏览量
2022-09-19
19:26:12
上传
评论
收藏 3KB RAR 举报
Kinonoyomeo
- 粉丝: 77
- 资源: 1万+
评论0