老师一枚,服务于学生,制作了电子时钟融合温度检测的系统。
首先在焊接式前一定要仿真,更要注意仿真引脚和实际引脚的不同。
个人中心里面有常用元器件实物引脚图和解释。
参考代码:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sounder=P3^7;
sbit qiehuan=P1^5;
sbit jia=P1^6;
sbit jian=P3^0;
sbit DS=P3^6;
sbit LED1 = P3^4;
sbit LED2 = P3^5;
sbit LED3 = P1^2;
sbit LED4 = P1^4;
sbit anjian=P1^0;
uint temp;
uchar flag1;
uint a,b;
uchar d=0; // 切换标志位
uchar hour0,minu0,sec0,hour1,minu1,sec1,h1,h2,m1,m2,s1,s2,k,s;
unsigned char code select[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极数码管
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02, //带小数点数字
0x78,0x00,0x10};
void DDDD(void);
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void sounde();
void delay1(unsigned int count);
void dsreset(void);
void tmpwritebyte(unsigned char dat);
void tmpchange(void);
void dis(unsigned int temp);
void AAAA(void);
void main()
{
init();
while(1)
{
if(anjian==0)
{
delay(10);
while(anjian==0);
DDDD();
}
keyscan();
while(s==1)
{
keyscan();
display(hour1,minu1,sec1);
}
display(hour0,minu0,sec0);
}
}
void init()
{
a=0;
b=0;
s=0;
hour0=0;
minu0=0;
sec0=0;
hour1=0;
minu1=0;
sec1=0;
TMOD=0x11;
TH1=(65536-50000)/256; //50ms
TL1=(65536-50000)%256;
EA=1;
EX1=1;
ET1=1;
IT1=1;
PX1=1;
TR1=1;
}
void ex1_int() interrupt 2
{
s++;
if(s==3)
s=0;
}
void timer1_int() interrupt 3 //T1
{
TH1=(65536-50000)/256; //50ms
TL1=(65536-50000)%256;
if(s==2)
{
if(hour1==hour0 && minu0==minu1&&sec0==sec1)
sounde();//蜂鸣器
}
b++;
if(b==20) //1s
{
b=0;
sec0++;
if(sec0==60) //1m
{
sec0=0;
minu0++;
if(minu0==60) //1h
{
minu0=0;
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
void keyscan() //按键扫描
{
if(s==0)
{
if(qiehuan==0)
{
d++;
if(d>3)
{
d=0;
}
while(qiehuan==0);
}
if (jia==0)
{
switch (d)
{
case 1 : sec0++;
if(sec0==60)
{
sec0=0;
}
break;
case 2 : minu0++;
if( minu0==60)
{
minu0=0;
}
break;
case 3 : hour0++;
if( hour0==24)
{
hour0=0;
}
break;
}
while(jia==0);
}
if (jian==0)
{
switch (d)
{
case 1 : sec0--;
if(sec0==-1)
{
sec0=59;
}
break;
case 2 : minu0--;
if( minu0==-1)
{
minu0=59;
}
break;
case 3 : hour0--;
if( hour0==-1)
{
hour0=23;
}
break;
}
while(jian==0);
}
}
if(s==1)
{
if(qiehuan==0)
{
d++;
if(d>3)
{
d=0;
}
while(qiehuan==0);
}
if (jia==0)
{
switch (d)
{
case 1 : sec1++;
if(sec1==60)
{
sec1=0;
}
break;
case 2 : minu1++;
if( minu1==60)
{
minu1=0;
}
break;
case 3 : hour1++;
if( hour1==24)
{
hour1=0;
}
break;
}
while(jia==0);
}
if (jian==0)
{
switch (d)
{
case 1 : sec1--;
if(sec1==-1)
{
sec1=59;
}
break;
case 2 : minu1--;
if( minu1==-1)
{
minu1=59;
}
break;
case 3 : hour1--;
if( hour1==-1)
{
hour1=23;
}
break;
}
while(jian==0);
}
}
}
void display(uchar hour,uchar minu,uchar sec)
{
h1=hour/10;
h2=hour%10;
m1=minu/10;
m2=minu%10;
s1=sec/10;
s2=sec%10;
P0=0x00;
P2=table[h1];
P0=select[7];
delay(1);
P0=0x00;
P2=table[h2];
P0=select[6];
delay(1);
P0=0x00;
P2=0xbf;
P0=select[5];
delay(1);
P0=0x00;
P2=table[m1];
P0=select[4];
delay(1);
P0=0x00;
P2=table[m2];
P0=select[3];
delay(1);
P0=0x00;
P2=0xbf;
P0=select[2];
delay(1);
P0=0x00;
P2=table[s1];
P0=select[1];
delay(1);
P0=0x00;
P2=table[s2];
P0=select[0];
delay(1);
}
//蜂鸣器
void sounde()
{
LED1=~LED1;
sounder=~sounder;
}
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay1(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
void dsreset(void) //send reset and initialization command
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay1(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay1(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
void dis(uint temp) //显示程序
{
uchar A1,A2,A2t,A3,i;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
i=0;
while(i<20)
{
i++;
P0=0x00;
P2=table[A1];
P0=select[7];
delay1(1);
P0=0x00;
P2=table1[A2];
P0=select[6];
delay1(1);
P0=0x00;
P2=table[A3];
P0=select[5];
delay1(1);
}
}
void DDDD(void)
{
uchar a;
do
{
tmpchange();
for(a=10;a>0;a--)
{
dis(tmp());
}
//高于***值蜂鸣器慢响并led1闪烁
if(temp>=380) //当温度超过38度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。
{
LED1=0;
LED2=0;
sounder=0;
delay1(50);
sounder=1;
LED1=1;
LED2=1;
}
else
{ if(temp>=320)
{
LED1=0;
sounder=0;
delay1(100);
sounder=1;
LED1=1;
}
}
//低于***值蜂鸣器慢响并led1闪烁
if(temp<=230) //当温度低于23度 慢响单闪烁
{
LED3=0;
LED4=0;
sounder=0;
delay1(50);
sounder=1;
LED3=1;
LED4=1;
}
else
{ if(temp<=270)/低于27度 快响双闪烁
{
LED3=0;
sounder=0;
delay1(100);
sounder=1;
LED3=1;
}
}
if(anjian == 0)
{ delay(10);
while(anjian==0);
break;
}
}while(1);
}
参考原理图:
各位同学,你检索到我的文件了,请注意,这是共阳极数码管,请务必理解程序后再焊接。