先是题目
代码部分
#include <STC12C5A60S2.H>
#include <onewire.h>
#include <ds1302.h>
#include <iic.h>
sbit R3=P3^2;
sbit R4=P3^3;
sbit C3=P3^5;
sbit C4=P3^4;
sbit L3=P0^2;
sbit L2=P0^1;
sbit L1=P0^0;
unsigned char j=0;
unsigned char l=0;
unsigned char m=0;
unsigned int temp;
unsigned char k=0;
unsigned char time1=0;
unsigned char time2=0;
unsigned char time3=0;
unsigned char canshu=23;
unsigned char sec=20;
unsigned char min=53;
unsigned char hour=23;
unsigned char mode=0;
unsigned char count=0;
unsigned char flag=0;
unsigned char state=0x00;
unsigned char state_led=0x00;
void display(unsigned char m);
void Init_DS1302_Param();
void read();
void Read_DS1302_Time();
void way();
unsigned char SMGnodot[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90};
unsigned char SMGdot[10]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
unsigned char TIME[7] = {0x50, 0x59, 0x22, 0x23, 0x02, 0x24, 0x20};
void InitHC138(unsigned char n)
{
switch(n)
{
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;
}
}
void quiet()
{
InitHC138(5);
P0=0x00;
InitHC138(4);
P0=0xff;
Init_DS1302_Param();
}
void delay(unsigned char t)
{
while(t--);
}
void delaySMG(unsigned char t)
{
while(t--);
}
void SMGshow(unsigned char pos,unsigned char dat)
{
InitHC138(6);
P0=0xff;
InitHC138(6);
P0=0x01<<pos;
InitHC138(7);
P0=dat;
delaySMG(500);
}
//#=================================
void start()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
void service() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
Read_DS1302_Time();
read();
if(state==0x10)
{
l++;
if(l==2)
{
l=0;
InitHC138(4);
L3=~L3;
}
}
if(flag==1)
{
j++;
if(mode%2==0)
{
state=0x10;
}
InitHC138(5);
P0=state;
if(j==100)
{
flag=0;
j=0;
InitHC138(4);
L1=1;
L3=1;
}
InitHC138(5);
state=0x00;
P0=state;
}
}
void read()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delay(1000);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
temp=MSB;
temp=(temp<<8)|LSB;
if((temp&0xf800)==0x0000)
{
temp>>=4;
temp=temp*10;
temp=temp+(LSB&0x0f)*0.625;
}
if(mode%2==1)
{
if((10*canshu)<=temp)
{
InitHC138(5);
state=0x10;
P0=state;
}
else
{
InitHC138(5);
state=0x00;
P0=state;
InitHC138(4);
L3=1;
}
}
}
void Init_DS1302_Param()
{
unsigned char i;
Write_Ds1302_Byte(0x8E,0x00);
for(i = 0; i < 7; i++)
{
Write_Ds1302_Byte(WRITE_RTC_ADDR[i],TIME[i]);
}
Write_Ds1302_Byte(0x8E,0x80);
}
void Read_DS1302_Time()
{
sec = Read_Ds1302_Byte(0x81);
min = Read_Ds1302_Byte(0x83);
hour = Read_Ds1302_Byte(0x85);
if(min==0&&sec==0)
{
InitHC138(4);
L1=0;
flag=1;
}
}
void way()
{
if(m==1)
{
read();
display(1);
}
if(m==2)
{
Read_DS1302_Time();
display(21);
}
if(m==3)
{
display(3);
}
}
void display(unsigned char m)
{
switch(m)
{
case 1:
SMGshow(1,SMGnodot[1]);
SMGshow(5,SMGnodot[temp/100]);
SMGshow(6,SMGdot[(temp/10)%10]);
SMGshow(7,SMGnodot[temp%10]);
break;
case 21:
SMGshow(1,SMGnodot[2]);
SMGshow(3,SMGnodot[hour >> 4]);
SMGshow(4,SMGnodot[hour & 0x0f]);
SMGshow(5,SMGnodot[0]);
SMGshow(6,SMGnodot[min >> 4]);
SMGshow(7,SMGnodot[min & 0x0f]);
break;
case 22:
SMGshow(1,SMGnodot[2]);
SMGshow(3,SMGnodot[min >> 4]);
SMGshow(4,SMGnodot[min & 0x0f]);
SMGshow(5,SMGnodot[0]);
SMGshow(6,SMGnodot[(sec >> 4) & 0x07]);
SMGshow(7,SMGnodot[sec & 0x0f]);
break;
case 3:
SMGshow(1,SMGnodot[3]);
SMGshow(6,SMGnodot[canshu/10]);
SMGshow(7,SMGnodot[canshu%10]);
break;
}
}
void scankey()
{
C3=0;C4=1;
R3=1;R4=1;
if(R4==0)//S12
{
delay(100);
if(R4==0)
{
m++;
while(R4==0)
{
display(m);
}
if(m==4)
{
m=1;
}
}
}
if(R3==0)//s13
{
delay(100);
if(R3==0)
{
mode++;
if(mode%2==1){
InitHC138(4);
L2=0;
}
else
InitHC138(4);
L2=1;
}
}
C3=1;C4=0;
if(R4==0)//s16
{
delay(100);
if(R4==0)
{
canshu++;
while(R4==0)
{
display(3);
}
if(canshu>=99)
{
canshu=99;
}
}
}
if(R3==0)//s17
{
delay(100);
if(R3==0)
{
if(m==3){
canshu--;
if(canshu<=10)
{
canshu=10;
}
while(R3==0)
{
display(3);
}
}
else if(m==2)
{
while(R3==0)
{
Read_DS1302_Time();
display(22);
}
display(21);
}
}
}
}
void main()
{
quiet();
init_ds18b20();
start();
while(1)
{
scankey();
way();
}
}
这是onewire.c的代码,因为做了点调整,所以发出来,其他的比如iic.c没有做调整就不发出来占空间了
#include "onewire.h"
void Delay_OneWire(unsigned int t) //STC89C52RC
{
unsigned int n; //?????????
n = t * 10; //??10?????
//IAP15F2K61S2?1T?8051?????
while(n--);
}//这里记得乘以10或12
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
Delay_OneWire(1);//这块加了个延时函数
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}