串口看别人的没试过,不知道能不能用
# include "stc15f2k60s2.h"
# include "iic.h"
# include "intrins.h"
# define uchar unsigned char
# define uint unsigned int
# define key P3
uchar code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
bit LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8;
bit relay,buzzer;
uchar smg[8];
void module_basic()
{
P0=0xff;P2=0x80;
P00=~LED1;P01=~LED2;P02=~LED3;P03=~LED4;
P04=~LED5;P05=~LED6;P06=~LED7;P07=~LED8;
P2=0X00;
P0=0X00;P2=0X80;
P04=relay;P06=buzzer;
P2=0X00;
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x20; //设置定时初值
TH0 = 0xD1; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
void Timer2Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x20; //设置定时初值
T2H = 0xD1; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2|=0X04;
EA=1;
}
void display_voltage(uchar addr)
{
uint vol=0;
vol=(((float)adc(addr))/255)*500;
smg[0]=17;
smg[1]=17;
smg[2]=17;
smg[3]=17;
smg[4]=vol/1000%10;
smg[5]=(vol/100%10)+32;
smg[6]=vol/10%10;
smg[7]=vol%10;
}
void basic()
{
P2=0X08;P0=0XFF;P2=0X00;
P2=0XA0;P0=0X00;P2=0X00;
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void digital_display(uchar wei,uchar duan)
{
P0=0XFF;
P2=0XC0;P0=T_COM[wei];P2=0X00;
P2=0XE0;P0=~t_display[duan];P2=0X00;
}
uchar Key4_Read()
{
uchar key_temp;
uchar key_value;
key|=0x0f;
key_temp=key&0x0f;
switch(Key_temp)
{
case 0x0e:key_value=7;break;
case 0x0d:key_value=6;break;
case 0x0b:key_value=5;break;
case 0x07:key_value=4;break;
default:key_value=0;
}
return key_value;
}
void key_pro()
{
static uchar key_buff=0;
uchar key_down=0;
}
void main()
{
basic();
Timer0Init();
while(1)
{
display_voltage(0x01);
Delay500ms();
}
}
void sever1() interrupt 1
{
static char tick_8ms=0;
digital_display(tick_8ms,smg[tick_8ms]);
tick_8ms++;tick_8ms%=8;
module_basic();
}
//定时器2
void sever12() interrupt 12
{
}
//NE555定时器
# include "stc15f2k60s2.h"
# include "iic.h"
# include "intrins.h"
# define uchar unsigned char
# define uint unsigned int
# define key P3
uint fre;
uchar code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
bit LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8;
bit relay,buzzer;
uchar smg[8];
void Frequence(void)
{
static int tick_500ms;
tick_500ms++;
if(tick_500ms==500)
{
TR0=0;
tick_500ms=0;
fre=(TH0<<8)+TL0;
fre*=2;
TH0=0;TL0=0;TR0=1;
}
}
void display_frequence()
{
smg[0]=17;
smg[1]=16;
smg[2]=16;
if(fre>9999){smg[3]=fre/10000%10;}else{smg[3]=16;}
if(fre>999){smg[4]=fre/1000%10;}else{smg[4]=16;}
if(fre>99){smg[5]=fre/100%10;}else{smg[5]=16;}
if(fre>9){smg[6]=fre/10%10;}else{smg[6]=16;}
if(fre>0){smg[7]=fre%10;}else{smg[7]=16;}
}
void module_basic()
{
P0=0xff;P2=0x80;
P00=~LED1;P01=~LED2;P02=~LED3;P03=~LED4;
P04=~LED5;P05=~LED6;P06=~LED7;P07=~LED8;
P2=0X00;
P0=0X00;P2=0X80;
P04=relay;P06=buzzer;
P2=0X00;
}
void display_voltage(uchar addr)
{
uint vol=0;
vol=(((float)adc(addr))/255)*500;
smg[0]=17;
smg[1]=17;
smg[2]=17;
smg[3]=17;
smg[4]=vol/1000%10;
smg[5]=(vol/100%10)+32;
smg[6]=vol/10%10;
smg[7]=vol%10;
}
void Timer0Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD =0x04; //设置定时器模式
TL0 = 0x50; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void basic()
{
P2=0X08;P0=0XFF;P2=0X00;
P2=0XA0;P0=0X00;P2=0X00;
}
void digital_display(uchar wei,uchar duan)
{
P0=0XFF;
P2=0XC0;P0=T_COM[wei];P2=0X00;
P2=0XE0;P0=~t_display[duan];P2=0X00;
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初值
TH1 = 0xD1; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;
ET1=1;
}
void main()
{
basic();
Timer0Init();
Timer1Init();
while(1)
{
// display_voltage(0x03);
display_frequence();
Delay500ms();
}
}
void sever1() interrupt 3
{
static char tick_8ms=0;
digital_display(tick_8ms,smg[tick_8ms]);
tick_8ms++;tick_8ms%=8;
Frequence();
module_basic();
}
超声波
# include "stc15f2k60s2.h"
# include "iic.h"
# include "intrins.h"
# define uchar unsigned char
# define uint unsigned int
# define key P3
# define TX P10
# define RX P11
uint fre;
uchar code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
bit LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8;
bit relay,buzzer;
uchar smg[8];
void display_frequence()
{
smg[0]=17;
smg[1]=16;
smg[2]=16;
if(fre>9999){smg[3]=fre/10000%10;}else{smg[3]=16;}
if(fre>999){smg[4]=fre/1000%10;}else{smg[4]=16;}
if(fre>99){smg[5]=fre/100%10;}else{smg[5]=16;}
if(fre>9){smg[6]=fre/10%10;}else{smg[6]=16;}
if(fre>0){smg[7]=fre%10;}else{smg[7]=16;}
}
void module_basic()
{
P0=0xff;P2=0x80;
P00=~LED1;P01=~LED2;P02=~LED3;P03=~LED4;
P04=~LED5;P05=~LED6;P06=~LED7;P07=~LED8;
P2=0X00;
P0=0X00;P2=0X80;
P04=relay;P06=buzzer;
P2=0X00;
}
void basic()
{
P2=0X08;P0=0XFF;P2=0X00;
P2=0XA0;P0=0X00;P2=0X00;
}
void digital_display(uchar wei,uchar duan)
{
P0=0XFF;
P2=0XC0;P0=T_COM[wei];P2=0X00;
P2=0XE0;P0=~t_display[duan];P2=0X00;
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初值
TH1 = 0xD1; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;
ET1=1;
}
void Timer0Init(void) //12微秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xF4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
uint distance_count()
{
uchar times=10;
uint juli;
Timer0Init();
TX=0;
while(times--)
{
while(!TF0);
TX=1;
TF0=0;
}
TR0=0;TH0=0;TL0=0;TR0=1;
while(RX&&!TF0);
if(TF0==1)
{
juli=999;
}
else
{
juli=((TH0<<8)+TL0)*0.017;
}
TR0=0;
return juli;
}
void display_distance()
{
uint distance;
distance=distance_count();
smg[0]=17;
smg[1]=17;
smg[2]=17;
smg[3]=17;
smg[4]=17;
smg[5]=distance/100%10;
smg[6]=distance/10%10;
smg[7]=distance%10;
}
void main()
{
basic();
Timer0Init();
Timer1Init();
while(1)
{
// display_voltage(0x03);
display_distance();
Delay500ms();
}
}
void sever1() interrupt 3
{
static char tick_8ms=0;
digital_display(tick_8ms,smg[tick_8ms]);
tick_8ms++;tick_8ms%=8;
module_basic();
}
//掉电存储
# include "stc15f2k60s2.h"
# include "iic.h"
# include "intrins.h"
# define uchar unsigned char
# define uint unsigned int
# define key P3
# define TX P10
# define RX P11
uint fre;
static char tick_20ms=0;
uchar code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
bit LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8;
bit relay,buzzer;
uchar smg[8];
void module_basic()
{
P0=0xff;P2=0x80;
P00=~LED1;P01=~LED2;P02=~LED3;P03=~LED4;
P04=~LED5;P05=~LED6;P06=~LED7;P07=~LED8;
P2=0X00;
P0=0X00;P2=0X80;
P04=relay;P06=buzzer;
P2=0X00;
}
void basic()
{
P2=0X08;P0=0XFF;P2=0X00;
P2=0XA0;P0=0X00;P2=0X00;
}
void digital_display(uchar wei,uchar duan)
{
P0=0XFF;
P2=0XC0;P0=T_COM[wei];P2=0X00;
P2=0XE0;P0=~t_display[duan];P2=0X00;
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初值
TH1 = 0xD1; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;
ET1=1;
}
void display_24c02 (unsigned char addr)
{
static unsigned char memory;
memory=read_24c02 (addr);
smg[0]=17;
smg[1]=17;
smg[2]=17;
smg[3]=17;
smg[4]=17;
smg[5]=memory/100%10;
smg[6]=memory/10%10;
smg[7]=memory%10;
}
//写入24c02数据的4ms延时
void Delay4ms() //@12.000MHz
{
unsigned char i, j;
i = 47;
j = 174;
do
{
while (--j);
} while (--i);
}
void main()
{
basic();
write_24c02(0x01,0x05);
Delay4ms();
Timer1Init();
// write_24c02(0x01,0x05);
// Delay4ms();
while(1)
{
// display_voltage(0x03);
if(tick_20ms==20){tick_20ms=0; display_24c02(0x01);}
}
}
void sever1() interrupt 3
{
static char tick_8ms=0;
tick_20ms++;
digital_display(tick_8ms,smg[tick_8ms]);
tick_8ms++;tick_8ms%=8;
module_basic();
}
rtc设置
掉电存储
# include "stc15f2k60s2.h"
# include "iic.h"
# include "intrins.h"
#include <ds1302.h>
# define uchar unsigned char
# define uint unsigned int
# define key P3
# define TX P10
# define RX P11
uint fre;
static char tick_20ms=0;
uchar code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
bit LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8;
bit relay,buzzer;
uchar smg[8];
void module_basic()
{
P0=0xff;P2=0x80;
P00=~LED1;P01=~LED2;P02=~LED3;P03=~LED4;
P04=~LED5;P05=~LED6;P06=~LED7;P07=~LED8;
P2=0X00;
P0=0X00;P2=0X80;
P04=relay;P06=buzzer;
P2=0X00;
}
void basic()
{
P2=0X08;P0=0XFF;P2=0X00;
P2=0XA0;P0=0X00;P2=0X00;
}
void digital_display(uchar wei,uchar duan)
{
P0=0XFF;
P2=0XC0;P0=T_COM[wei];P2=0X00;
P2=0XE0;P0=~t_display[duan];P2=0X00;
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初值
TH1 = 0xD1; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;
ET1=1;
}
void config_ds1302(uchar shi,uchar fen,uchar miao)
{
Write_Ds1302_Byte(0x8e,0x00);//关闭写保护
Write_Ds1302_Byte(0x80,miao);//写入秒
Write_Ds1302_Byte(0x82,fen);//写入分
Write_Ds1302_Byte(0x84,shi);//写入时
Write_Ds1302_Byte(0x8e,0x80);//打开写入保护
}
void display_ds1302()
{
smg[0]=Read_Ds1302_Byte(0x85)/16;
smg[1]=Read_Ds1302_Byte(0x85)%16;
smg[2]=17;
smg[3]=Read_Ds1302_Byte(0x83)/16;
smg[4]=Read_Ds1302_Byte(0x83)%16;
smg[5]=17;
smg[6]=Read_Ds1302_Byte(0x81)/16;
smg[7]=Read_Ds1302_Byte(0x81)%16;
}
void main()
{
basic();
config_ds1302(0x08,0x00,0x00);
Timer1Init();
// write_24c02(0x01,0x05);
// Delay4ms();
while(1)
{
// display_voltage(0x03);
if(tick_20ms==20){tick_20ms=0; display_ds1302();}
}
}
void sever1() interrupt 3
{
static char tick_8ms=0;
tick_20ms++;
digital_display(tick_8ms,smg[tick_8ms]);
tick_8ms++;tick_8ms%=8;
module_basic();
}
获取温度
# include "stc15f2k60s2.h"
# include "iic.h"
# include "intrins.h"
#include "onewire.h"
#include <ds1302.h>
# define uchar unsigned char
# define uint unsigned int
# define key P3
# define TX P10
# define RX P11
uint fre;
static char tick_20ms=0;
uchar code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
bit LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8;
bit relay,buzzer;
uchar smg[8];
void module_basic()
{
P0=0xff;P2=0x80;
P00=~LED1;P01=~LED2;P02=~LED3;P03=~LED4;
P04=~LED5;P05=~LED6;P06=~LED7;P07=~LED8;
P2=0X00;
P0=0X00;P2=0X80;
P04=relay;P06=buzzer;
P2=0X00;
}
void basic()
{
P2=0X08;P0=0XFF;P2=0X00;
P2=0XA0;P0=0X00;P2=0X00;
}
void digital_display(uchar wei,uchar duan)
{
P0=0XFF;
P2=0XC0;P0=T_COM[wei];P2=0X00;
P2=0XE0;P0=~t_display[duan];P2=0X00;
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初值
TH1 = 0xD1; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;
ET1=1;
}
void config_ds1302(uchar shi,uchar fen,uchar miao)
{
Write_Ds1302_Byte(0x8e,0x00);//关闭写保护
Write_Ds1302_Byte(0x80,miao);//写入秒
Write_Ds1302_Byte(0x82,fen);//写入分
Write_Ds1302_Byte(0x84,shi);//写入时
Write_Ds1302_Byte(0x8e,0x80);//打开写入保护
}
void display_ds1302()
{
smg[0]=Read_Ds1302_Byte(0x85)/16;
smg[1]=Read_Ds1302_Byte(0x85)%16;
smg[2]=17;
smg[3]=Read_Ds1302_Byte(0x83)/16;
smg[4]=Read_Ds1302_Byte(0x83)%16;
smg[5]=17;
smg[6]=Read_Ds1302_Byte(0x81)/16;
smg[7]=Read_Ds1302_Byte(0x81)%16;
}
void display_temp(void)
{
int tempreture;
tempreture=(int)(read_temp()*100);
smg[0]=17;
smg[1]=17;
smg[2]=17;
smg[3]=17;
smg[4]=tempreture/1000%10;
smg[5]=tempreture/100%10+32;
smg[6]=tempreture/10%10;
smg[7]=tempreture%10;
}
void main()
{
basic();
config_ds1302(0x08,0x00,0x00);
Timer1Init();
// write_24c02(0x01,0x05);
// Delay4ms();
while(1)
{
// display_voltage(0x03);
if(tick_20ms==20){tick_20ms=0; display_temp();}
}
}
void sever1() interrupt 3
{
static char tick_8ms=0;
tick_20ms++;
digital_display(tick_8ms,smg[tick_8ms]);
tick_8ms++;tick_8ms%=8;
module_basic();
}
串口通信
# include "stc15f2k60s2.h"
# include "iic.h"
# include "intrins.h"
#include "onewire.h"
#include <ds1302.h>
# define uchar unsigned char
# define uint unsigned int
# define key P3
# define TX P10
# define RX P11
uint fre;
static char tick_20ms=0;
uchar code t_display[]={ //标准字库
0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
bit LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8;
bit relay,buzzer;
uchar smg[8];
void module_basic()
{
P0=0xff;P2=0x80;
P00=~LED1;P01=~LED2;P02=~LED3;P03=~LED4;
P04=~LED5;P05=~LED6;P06=~LED7;P07=~LED8;
P2=0X00;
P0=0X00;P2=0X80;
P04=relay;P06=buzzer;
P2=0X00;
}
void basic()
{
P2=0X08;P0=0XFF;P2=0X00;
P2=0XA0;P0=0X00;P2=0X00;
}
void digital_display(uchar wei,uchar duan)
{
P0=0XFF;
P2=0XC0;P0=T_COM[wei];P2=0X00;
P2=0XE0;P0=~t_display[duan];P2=0X00;
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初值
TH1 = 0xD1; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;
ET1=1;
}
void UartInit(void) //4800bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xC0; //设定定时初值
TH1 = 0xFD; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;
EA=1;
}
void sendstring(u8*p)
{
while(*p!=0)
{
SBUF=*P;
P++;
while(TI==0);
TI=0;
}
}
void main()
{
basic();
config_ds1302(0x08,0x00,0x00);
Timer1Init();
write_24c02(0x01,0x05);
Delay4ms();
while(1)
{
display_voltage(0x03);
if(tick_20ms==20){tick_20ms=0; display_temp();}
}
}
void uart_interrupt() interrupt 4
{
static uchar i=0;
if(RI)
{
RI=0;
datas[i++]=SUBF;
if(datas[i-1]='\n')
{
i=0;
datas[i-1]='0';
}
}
}
void sever1() interrupt 3
{
static char tick_8ms=0;
tick_20ms++;
digital_display(tick_8ms,smg[tick_8ms]);
tick_8ms++;tick_8ms%=8;
module_basic();
}
iic(延迟不确定,听说要增加3个_nop_()或者15个_nop_(),因为可以用,就没弄)
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.h"
#include "intrins.h"
#include "iic.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
void IIC_Delay(unsigned char i)
{
do{_nop_();_nop_();_nop_();}
while(i--);
}
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
void write_24c02(unsigned char addr,unsigned char dat)
{
IIC_Start();
IIC_SendAck(0xa0);
IIC_WaitAck();
IIC_SendAck(addr);
IIC_WaitAck();
IIC_SendAck(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read_24c02(unsigned char addr)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
return temp;
}
void dac(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x43);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char adc(unsigned char addr)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
return temp;
}
onewire.c(循环里面需要添加for(i<12))
/*
程序说明: 单总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
日 期: 2011-8-9
*/
#include "reg52.h"
#include "onewire.h"
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
unsigned char i;
while(t--)
for(i=0;i<12;i++);
}
//通过单总线向DS18B20写一个字节
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);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20设备初始化
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;
}
//读ds18b20
float read_temp(void)
{
unsigned char low,high;
unsigned int temp;
float tem;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
Delay_OneWire(200);
low=Read_DS18B20();
high=Read_DS18B20();
high&=0x0f;
temp=(high<<8)+low;
tem=temp*0.0625;
return tem;
}
ds1302.c
/*
程序说明: DS1302驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include <reg52.h>
#include <intrins.h>
#include <ds1302.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}