蓝桥杯模块代码

串口看别人的没试过,不知道能不能用

# 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);
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值