细节问题:
1.读取温度,MSB<<8,不是MSB<<4
2.HC138(4)打开控制LED的端口,不要写成HC138(0)
3.count最好是int型,不然可能不够计数
4.赋值是赋给P0,不是P2啊啊啊啊救命,竟然半小时才检查出来太丢人了
#include"reg52.h"
#include"onewire.h"
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
unsigned char code SMG_duanma[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char stat=0;
unsigned char mode=1;
unsigned char time=0;
unsigned char temp=0;
unsigned int count=0;
unsigned char pwm_f=0;
unsigned char pwm_c=0;
unsigned char pwm_t=0;
unsigned char k6=1;
void HC138(unsigned char channel)
{
switch(channel)
{
case 4:P2=(P2&0x1f)|0x80;break;
case 5:P2=(P2&0x1f)|0xa0;break;
case 6:P2=(P2&0x1f)|0xc0;break;
case 7:P2=(P2&0x1f)|0xe0;break;
case 0:P2=(P2&0x1f)|0x00;break;
}
P2=(P2&0x1f)|0x00;
}
void SMG_bit(unsigned char pos,unsigned char dat)
{
P0=(0x01<<pos);
HC138(6);
P0=dat;
HC138(7);
}
void SMG_all(unsigned char dat)
{
P0=0xff;
HC138(6);
P0=dat;
HC138(7);
}
void SMG_delay(unsigned char q)
{
while(q--);
}
void SMG_display()
{
if(stat==0)
{
SMG_bit(0,0xbf);
SMG_delay(200);
SMG_bit(0,0xff);
SMG_delay(200);
SMG_bit(1,SMG_duanma[mode]);
SMG_delay(200);
SMG_bit(1,0xff);
SMG_delay(200);
SMG_bit(2,0xbf);
SMG_delay(200);
SMG_bit(2,0xff);
SMG_delay(200);
SMG_bit(4,SMG_duanma[time/1000]);
SMG_delay(200);
SMG_bit(4,0xff);
SMG_delay(200);
SMG_bit(5,SMG_duanma[(time/100)%10]);
SMG_delay(200);
SMG_bit(5,0xff);
SMG_delay(200);
SMG_bit(6,SMG_duanma[(time/10)%10]);
SMG_delay(200);
SMG_bit(6,0xff);
SMG_delay(200);
SMG_bit(7,SMG_duanma[time%10]);
SMG_delay(200);
SMG_bit(7,0xff);
SMG_delay(200);
SMG_all(0xff);
SMG_delay(200);
}
if(stat==1)
{
SMG_bit(0,0xbf);
SMG_delay(200);
SMG_bit(0,0xff);
SMG_delay(200);
SMG_bit(1,SMG_duanma[4]);
SMG_delay(200);
SMG_bit(1,0xff);
SMG_delay(200);
SMG_bit(2,0xbf);
SMG_delay(200);
SMG_bit(2,0xff);
SMG_delay(200);
SMG_bit(5,SMG_duanma[temp/10]);
SMG_delay(200);
SMG_bit(5,0xff);
SMG_delay(200);
SMG_bit(6,SMG_duanma[temp%10]);
SMG_delay(200);
SMG_bit(6,0xff);
SMG_delay(200);
SMG_bit(7,0xc6);
SMG_delay(200);
SMG_bit(7,0xff);
SMG_delay(200);
SMG_all(0xff);
SMG_delay(200);
}
}
void temp_delay(unsigned char f)
{
while(f--);
}
void read_temp()
{
unsigned char LSB;
unsigned char MSB;
unsigned int tem;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
temp_delay(1000);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
temp=(MSB<<8)|LSB;
if((tem&0xf8000)==0x0000)
{
temp=temp >>4;
}
}
void InitTimer0()
{
TMOD=0x01;
TH0=(65535-100)/256;
TL0=(65534-100)%256;
EA=1;
ET0=1;
TR0=1;
}
void serviceTimer0() interrupt 1
{
TH0=(65535-100)/256;
TL0=(65534-100)%256;
if(time>0)
{
count++;
if(count>=10000)
{
time=time-1;
count=0;
}
}
pwm_c=pwm_c+1;
if(pwm_c>=pwm_t)
{
pwm_f=0;
}
if(pwm_c>=10)
{
pwm_f=1;
pwm_c=0;
}
}
void delay(unsigned char s)
{
while(s--);
}
void keyboard()
{
if(S4==0)
{
delay(200);
if(S4==0)
{
while(S4==0)
{
SMG_display();
}
if(mode==1)
{
mode=2;
pwm_t=3;
}
else if(mode==2)
{
mode=3;
pwm_t=7;
}
else if(mode==3)
{
mode=1;
pwm_t=2;
}
}
}
if(S5==0)
{
delay(200);
if(S5==0)
{
while(S5==0)
{
SMG_display();
}
if(k6==1)
{
k6=2;
time=60;
}
else if(k6==2)
{
k6=0;
time=120;
}
else if(k6==0)
{
k6=1;
time=0;
}
}
}
if(S6==0)
{
delay(200);
if(S6==0)
{
while(S6==0)
{
SMG_display();
}
time=0;
}
}
if(S7==0)
{
delay(200);
if(S7==0)
{
while(S7==0)
{
SMG_display();
}
if(stat==0)
{
stat=1;
}
else if(stat==1)
{
stat=0;
}
}
}
}
void LEDRunning ()
{
HC138(0);
if (time > 0)
{
if (mode == 1)
{
P0 = 0xfe;
}
else if (mode == 2)
{
P0 = 0xfd;
}
else if (mode == 3)
{
P0 = 0xfb;
}
}
else P0 = 0xff;
HC138(4);
}
void InitSystem()
{
P0=0xff;
HC138(4);
P0=0x00;
HC138(5);
SMG_all(0xff);
}
void main()
{
InitSystem();
InitTimer0();
while(1)
{
SMG_display();
if(stat==1)
{
read_temp();
}
LEDRunning ();
keyboard();
}
}