蓝桥杯单片机(CT107D)需要准备的一些文件的写法(First Prepare for Lanqiao Cup MCU Competition)...

实物图

电路原理图

所有文件(all files)

common.h main.c timer.c hc138.c led.c drivers.c digital_tube.c key.c ds18b20.c ds1302.c i2c.c sonic_infra.c

  • TIPS:

x^1=~x; X^0=X;
Px^x不可直接赋值,Pxx可直接赋值;
P4^2,不可直接赋值,P42=0,可直接赋值;
Can't shift a single PIN, but can shift the entire I/O port;
(不可移位单个PIN,可移位整个I/O口);
Declare variable first, then operate;  //uchar i;  TR0=0;
(先声明变量,后操作);
(数码管先段码再位码);
(数据总线在读写之前要释放);
(协议传输中拉低拉高需要一定的时间,因查看相应的说明书);// PCF8591的速度比I2C慢SCL需要延迟5us
复制代码
  • common.h

common.h

#ifndef COMMON_H
#define COMMON_H

#include "stc15f2k60s2.h"
#include "intrins.h"

#define seg_tab_none 19
#define bit_tab_none 8

typedef unsigned char uchar;
typedef unsigned int uint;

extern uchar trg,cont,key_val;
extern uchar disp_val[8];
extern uchar ds1302_time[7];

extern void Timer0Init(void);
extern void Timer1Init(void);
extern void UartInit(void);
extern void Timer2Init(void);
extern void hc138Init(void);
extern void hc138_none(void);
extern void hc138_led(void);
extern void hc138_drivers(void);
extern void hc138_seg(void);
extern void hc138_bit(void);
extern void ledInit(void);
extern void led_on_N(uchar led);
extern void led_on_all(void);
extern void led_off(void);
extern void relayInit(void);
extern void relay_off(void);
extern void buzzInit(void);
extern void buzz_on(void);
extern void buzz_off(void);
extern void disp_scan(void);
extern void disp_val_none(void);
extern void key_scan(void);
extern uchar ds18b20_get(void);
extern void ds1302Init(void);
extern void ds1302_burst_read(uchar *val);
//extern void e2_reset(void);
extern void e2_read(uchar word,uchar *dat,uchar len);
extern void e2_write(uchar word,uchar *dat,uchar len);
extern void get_dac(uchar *dat,uchar len);
extern void set_dac(uchar dat);
extern uint sonic_distance(void);
extern void pwm(uchar dat);

#endif
复制代码
  • main.c

main.c

#include "common.h"

void SysInit(void)
{
	disp_val_none();
	Timer0Init();
	Timer1Init();
	UartInit();
	//Timer2Init();
	hc138Init();
	ledInit();
	buzzInit();
	relayInit();
	ds1302Init();
	//e2_reset();
	EA=1;
	ET0=1;
	ET1=1;
	ES=1;
	//IE2|=0x04;
}

void main(void)
{
	SysInit();
	while(1)
	{
		;		
	}
}
复制代码
  • timer.c

timer.c

#include "common.h"

static uchar page=1;
static uchar cont_clock,buzz,trg_times,trg_clock;
static uchar e2_write_data[8]={0,1,2,3,4,5,6,7},e2_read_data[8];
static uchar temperature=0;
static idata uchar rxd_data[3];
static uchar dac_val[4],adc_val=128;
static uint ultra_distance=0;
static uchar pwm_val=128;

void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}


void Timer1Init(void)		//50毫秒@11.0592MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初值
	TH1 = 0x4C;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
}

void UartInit(void)		//2400bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器2时钟为Fosc/12,即12T
	T2L = 0xA0;		//设定定时初值
	T2H = 0xFF;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}

void trg_run(void)
{
	if(trg)
	{
		if(++trg_times==1)
		{
			trg_clock=0;
		}
		//buzz=1;
		switch(key_val)
		{
			case 1:disp_val[7]=4;break;
			case 2:disp_val[7]=5;break;
			case 3:disp_val[7]=6;break;
			case 4:disp_val[7]=7;break;
			case 5:disp_val[7]=8;break;
			case 6:disp_val[7]=9;break;
			case 7:disp_val[7]=10;break;
			case 8:disp_val[7]=11;break;
			case 9:disp_val[7]=12;break;
			case 10:disp_val[7]=13;break;
			case 11:disp_val[7]=14;break;
			case 12:disp_val[7]=15;break;
			case 13:disp_val[7]=16;break;
			case 14:disp_val[7]=17;break;
			case 15:disp_val[7]=18;break;
			case 16:disp_val[7]=19;break;
			default:break;
		}
	}
}

void trg_double_run(void)
{
	if(++trg_clock>=15)
	{
			trg_times=0;
	}
	if(trg_clock<15&&trg_times==2)
	{
		trg_clock=0;
		trg_times=0;
		switch(key_val)
		{
			case 1:page=16;break;
			case 2:page=15;break;
			case 3:page=14;break;
			case 4:page=13;break;
			case 5:page=12;break;
			case 6:page=11;break;
			case 7:page=10;break;
			case 8:page=9;break;
			case 9:page=8;break;
			case 10:page=7;break;
			case 11:page=6;break;
			case 12:page=5;break;
			case 13:page=4;break;
			case 14:page=3;break;
			case 15:page=2;break;
			case 16:page=1;break;
			default:break;
		}
	}
}

void cont_run(void)
{
	if(cont)
	{
		if(++cont_clock>=20)
		{
			switch(key_val)
			{
				case 1:led_on_N(~4);break;
				case 2:led_on_N(~5);break;
				case 3:led_on_N(~6);break;
				case 4:led_on_N(~7);break;
				case 5:led_on_N(~8);break;
				case 6:led_on_N(~9);break;
				case 7:led_on_N(~10);break;
				case 8:led_on_N(~11);break;
				case 9:led_on_N(~12);break;
				case 10:led_on_N(~13);break;
				case 11:led_on_N(~14);break;
				case 12:led_on_N(~15);break;
				case 13:led_on_N(~16);break;
				case 14:led_on_N(~17);break;
				case 15:led_on_all();break;
				case 16:led_off();break;
				default:break;
			}
		}
	}
	else
	{
		cont_clock=0;
		led_off();
	}
}
void buzz_run(void)
{
	if(buzz==1)
	{
		buzz=2;
		relay_off();
		buzz_on();
	}
	else if(buzz==2)
	{
		buzz=0;
		relay_off();
		buzz_off();
	}
}

void e2_run(void)
{
	static uchar i;
	disp_val_none();
	e2_read(0x00,e2_read_data,sizeof(e2_read_data));
	disp_val[0]=e2_read_data[0]%10;
	disp_val[1]=e2_read_data[0]%100/10;
	disp_val[2]=e2_read_data[0]/100;
	disp_val[3]=e2_read_data[1]%10;
	disp_val[4]=e2_read_data[1]%100/10;
	disp_val[5]=e2_read_data[1]/100;
	disp_val[6]=e2_read_data[2]%10;
	disp_val[7]=e2_read_data[2]%100/10;
	e2_write(0,e2_write_data,sizeof(e2_write_data));
	for(i=0;i<sizeof(e2_write_data);i++)
	{
		e2_write_data[i]+=1;
	}
}

void ds18b20_run(void)
{
	disp_val_none();
	temperature=ds18b20_get();
	disp_val[0]=0x0c;
	disp_val[1]=0x12;
	disp_val[2]=temperature%10;
	disp_val[3]=temperature/10;
}

void ds1302_run(void)
{
	disp_val_none();
	ds1302_burst_read(ds1302_time);
	disp_val[0]=ds1302_time[0]&0x0f;
	disp_val[1]=ds1302_time[0]>>4&0x0f;
	disp_val[2]=0x11;
	disp_val[3]=ds1302_time[1]&0x0f;
	disp_val[4]=ds1302_time[1]>>4&0x0f;
	disp_val[5]=0x11;
	disp_val[6]=ds1302_time[2]&0x0f;
	disp_val[7]=ds1302_time[2]>>4&0x0f;
}

void uart_run(void)
{
	disp_val_none();
	disp_val[0]=rxd_data[0]%10;
	disp_val[1]=rxd_data[0]%100/10;
	disp_val[2]=rxd_data[0]/100;
	disp_val[3]=rxd_data[1]%10;
	disp_val[4]=rxd_data[1]%100/10;
	disp_val[5]=rxd_data[1]/100;
	disp_val[6]=rxd_data[2]%10;
	disp_val[7]=rxd_data[2]%100/10;
}

void dac_run(void)
{
	disp_val_none();
	get_dac(dac_val,sizeof(dac_val));
	disp_val[0]=dac_val[page-5]%10;
	disp_val[1]=dac_val[page-5]%100/10;
	disp_val[2]=dac_val[page-5]/100;
	disp_val[3]=17;
	disp_val[4]=page-5;
	disp_val[5]=0x0d;
	disp_val[6]=0x0a;
	disp_val[7]=17;
}

void adc_run(void)
{
	disp_val_none();
	set_dac(adc_val);
	disp_val[0]=adc_val%10;
	disp_val[1]=adc_val%100/10;
	disp_val[2]=adc_val/100;
	disp_val[3]=17;
	disp_val[4]=0x0c;
	disp_val[5]=0x0a;
	disp_val[6]=0x0d;
	disp_val[7]=17;
}

void sonic_run(void)
{
	disp_val_none();
	ultra_distance=sonic_distance();
	disp_val[0]=ultra_distance%10;
	disp_val[1]=ultra_distance%100/10;
	disp_val[2]=ultra_distance%1000/100;
	disp_val[3]=ultra_distance%10000/1000;
	disp_val[4]=ultra_distance/10000;
}

void pwm_run(void)
{
	disp_val_none();
	pwm(pwm_val);
	get_dac(dac_val,sizeof(dac_val));
	disp_val[0]=pwm_val%10;
	disp_val[1]=pwm_val%100/10;
	disp_val[2]=pwm_val/100;
	disp_val[3]=17;
	disp_val[4]=dac_val[5]%10;
	disp_val[5]=dac_val[5]%100/10;
	disp_val[6]=dac_val[5]/100;
	disp_val[7]=17;
}

void Timer0_Routine(void) interrupt 1
{
	//1ms
	TR0=0;
	disp_scan();
	TR0=1;
}

void Timer1_Routine(void) interrupt 3
{
	//50ms
	static uchar clock;
	TR1=0;
	key_scan();
	trg_run();
	trg_double_run();
	cont_run();
	if(++clock==20)
	{
		clock=0;
		switch(page)
		{
			case 1:uart_run();break;
			case 2:ds18b20_run();break;
			case 3:ds1302_run();break;
			case 4:e2_run();break;
			case 5:dac_run();break;
			case 6:dac_run();break;
			case 7:dac_run();break;
			case 8:dac_run();break;
			case 9:adc_run();break;
			case 10:sonic_run();break;
			case 11:pwm_run();break;
			default:break;
		}
	}
	buzz_run();
	TR1=1;
}

void Uart(void) interrupt 4
{
	static uchar pointer=0;
	REN=0;
	if(RI)
	{
		RI=0;
		rxd_data[pointer]=SBUF;
		SBUF=rxd_data[pointer];
		if(++pointer==sizeof(rxd_data))
		{
			pointer=0;
		}
		buzz_run();
	}
	if(TI)
	{
		TI=0;
	}
	REN=1;
}

//void Timer2_Routine(void) interrupt 12
//{
//	//50ms
//	AUXR&=0xef;
//	
//	AUXR|=0x10;
//}
复制代码
  • hc138.c

hc138.c

#include "common.h"

#define HC138 P2

void hc138Init(void)
{
	HC138&=0x1f;
}

void hc138_none(void)
{
	HC138&=0x1f;
}

void hc138_led(void)
{
	HC138&=0x1f;
	HC138|=0x80;
}

void hc138_drivers(void)
{
	HC138&=0x1f;
	HC138|=0xa0;
}

void hc138_bit(void)
{
	HC138&=0x1f;
	HC138|=0xc0;
}

void hc138_seg(void)
{
	HC138&=0x1f;
	HC138|=0xe0;
}
复制代码
  • led.c

led.c

#include "common.h"

#define LED P0

void ledInit(void)
{
	LED=0xff;
	hc138_led();
	hc138_none();
}

void led_on_N(uchar led)
{
	LED=led;
	hc138_led();
	hc138_none();
}

void led_on_all(void)
{
	LED=0x00;
	hc138_led();
	hc138_none();
}

void led_off(void)
{
	LED=0xff;
	hc138_led();
	hc138_none();
}
复制代码
  • drivers.c

drivers.c

#include "common.h"

sbit RELAY_PIN=P0^4;
sbit BUZZ_PIN=P0^6;

void relayInit(void)
{
	RELAY_PIN=0;
	hc138_drivers();
	hc138_none();
}

void relay_off(void)
{
	RELAY_PIN=0;
	hc138_drivers();
	hc138_none();
}

void buzzInit(void)
{
	BUZZ_PIN=0;
	hc138_drivers();
	hc138_none();
}

void buzz_on(void)
{	
	BUZZ_PIN=1;
	hc138_drivers();
	hc138_none();
}

void buzz_off(void)
{
	BUZZ_PIN=0;
	hc138_drivers();
	hc138_none();
}
复制代码
  • digital_tube.c

digital_tube.c

#include "common.h"

#define SEG P0
#define BIT P0

uchar seg_tab[20]={0xc0,0xf9,0xa4,0xb0,0x99,
												0x92,0x82,0xf8,0x80,0x90,
												0x88,0x83,0xc6,0xa1,0x86,0x8e,
												0x7f,0xbf,0x9c,0xff};//0~9,a~f,.,-,o,none
uchar bit_tab[9]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00};
uchar disp_val[8]={seg_tab_none,seg_tab_none,seg_tab_none,seg_tab_none,
										seg_tab_none,seg_tab_none,seg_tab_none,seg_tab_none,};

void disp_scan(void)
{
	static uchar pointer=0;
	SEG=seg_tab[seg_tab_none];
	hc138_seg();
	SEG=seg_tab[disp_val[pointer]];
	hc138_none();
	BIT=bit_tab[bit_tab_none];
	hc138_bit();
	BIT=bit_tab[pointer];
	hc138_none();
	if(++pointer==8)
	{
		pointer=0;
	}
}

void disp_val_none(void)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		disp_val[i]=seg_tab_none;
	}
}
复制代码
  • key.c

key.c

#include "common.h"

#define KEY P3

uchar trg,cont,trg_row,trg_column,cont_row,cont_column,key_val;

void key_scan(void)
{
	uchar readdata=0x00,P42_val,P44_val;
	KEY=0x0f;
	P42=0;
	P44=0;
	P42_val=P42;
	P44_val=P44;
	P42_val=P42_val<<6&0x40;
	P44_val=P44_val<<7&0x80;
	readdata=KEY&0x3f|P42_val|P44_val;
	readdata^=0x0f;
	trg_row=readdata&(readdata^cont_row);
	cont_row=readdata;
	KEY=0xf0;
	P42=1;
	P44=1;
	P42_val=P42;
	P44_val=P44;
	P42_val=P42_val<<6&0x40;
	P44_val=P44_val<<7&0x80;
	readdata=KEY&0x3f|P42_val|P44_val;
	readdata^=0xf0;
	trg_column=readdata&(readdata^cont_column);
	cont_column=readdata;
	trg=trg_row|trg_column;
	cont=cont_row|cont_column;
	switch(trg)
	{
		case 0x81:key_val=1;break;
		case 0x41:key_val=2;break;
		case 0x21:key_val=3;break;
		case 0x11:key_val=4;break;
		case 0x82:key_val=5;break;
		case 0x42:key_val=6;break;
		case 0x22:key_val=7;break;
		case 0x12:key_val=8;break;
		case 0x84:key_val=9;break;
		case 0x44:key_val=10;break;
		case 0x24:key_val=11;break;
		case 0x14:key_val=12;break;
		case 0x88:key_val=13;break;
		case 0x48:key_val=14;break;
		case 0x28:key_val=15;break;
		case 0x18:key_val=16;break;
		default:break;
	}
	KEY=0xff;
}
复制代码
  • ds18b20.c

ds18b20.c

#include "common.h"

sbit DQ=P1^4;

void Delay50us()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 1;
	j = 134;
	do
	{
		while (--j);
	} while (--i);
}

void Delay500us()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 6;
	j = 93;
	do
	{
		while (--j);
	} while (--i);
}

void ds18b20Init(void)
{
	DQ=0;
	Delay500us();
	DQ=1;
	Delay50us();
	while(~DQ)
	{
		;
	}
}

void ds18b20_write(uchar dat)
{
	uchar mask=0x00;
	DQ=1;
	for(mask=0x01;mask;mask<<=1)
	{
		DQ=0;
		DQ=dat&mask;
		Delay50us();
		Delay50us();
		DQ=1;
	}
}

uchar ds18b20_read(void)
{
	uchar mask=0x00,val=0;
	DQ=1;
	for(mask=0x01;mask;mask<<=1)
	{
		DQ=0;
		DQ=1;
		if(DQ)
		{
			val=val|mask;
		}
		else
		{
			val=val&~mask;
		}
		Delay50us();
		Delay50us();
	}
	return val;
}

uchar ds18b20_get(void)
{
	uchar temp[2],val=0;
	ds18b20Init();
	ds18b20_write(0xcc);
	ds18b20_write(0x44);
	ds18b20Init();
	ds18b20_write(0xcc);
	ds18b20_write(0xbe);
	temp[0]=ds18b20_read();
	temp[1]=ds18b20_read();
	val=temp[0]>>4&0x0f|temp[1]<<4&0xf0;
	return val;
}
复制代码
  • ds1302.c (burst_mode)

ds1302.c

#include "common.h"

sbit CE=P1^3;
sbit SCLK=P1^7;
sbit I_O=P2^3;

uchar ds1302_time[7];
code uchar Init_time[7]={0x50,0x44,0x13,0x14,0x03,0x04,0x19};

void ds1302_write_byte(uchar dat)
{
	uchar mask=0x00;
	I_O=1;
	for(mask=0x01;mask;mask<<=1)
	{
		if(dat&mask)
		{
			I_O=1;
		}
		else
		{
			I_O=0;
		}
		SCLK=1;
		SCLK=0;
	}
	I_O=1;
}

uchar ds1302_read_byte(void)
{
	uchar mask=0x00,val=0;
	I_O=1;
	for(mask=0x01;mask;mask<<=1)
	{
		if(I_O)
		{
			val|=mask;
		}
		else
		{
			val&=~mask;
		}
		SCLK=1;
		SCLK=0;
	}
	return val;
}

void ds1302_single_write(uchar reg,uchar dat)
{
	SCLK=0;
	I_O=0;
	CE=1;
	ds1302_write_byte(reg<<1|0x80);
	ds1302_write_byte(dat);
	CE=0;
}

uchar ds1302_single_read(uchar reg)
{
	static uchar val;
	SCLK=0;
	I_O=0;
	CE=1;
	ds1302_write_byte(reg<<1|0x81);
	val=ds1302_read_byte();
	CE=0;
	return val;
}

void ds1302_burst_write(uchar *dat)
{
	static uchar i;
	SCLK=0;
	I_O=0;
	CE=1;
	ds1302_write_byte(0xbe);
	for(i=0;i<8;i++)
	{
		ds1302_write_byte(dat[i]);
	}
	CE=0;
}

void ds1302_burst_read(uchar *dat)
{
	static uchar i;
	SCLK=0;
	I_O=0;
	CE=1;
	ds1302_write_byte(0xbf);
	for(i=0;i<8;i++)
	{
		dat[i]=ds1302_read_byte();
	}
	CE=0;
}

void ds1302Init(void)
{
	if(ds1302_single_read(0)&0x80)
	{
		ds1302_single_write(7,0x00);
		ds1302_burst_write(Init_time);
	}
}
复制代码
  • i2c.c (Page_Write, Random_Sequential_Read)

i2c.c

//数据总线要释放
#include "common.h"

sbit SCL = P2^0; 
sbit SDA = P2^1;

void Delay5us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 11;
	while (--i);
}


void i2c_start()
{
	SDA = 1;
	Delay5us();
	SCL = 1;
	Delay5us();
	SDA = 0;
	Delay5us();
	SCL = 0;
	Delay5us();
}

void i2c_stop()
{
	SCL = 0;
	Delay5us();
	SDA = 0;
	Delay5us();
	SCL = 1;
	Delay5us();
	SDA = 1;
	Delay5us();
}

bit i2c_write_byte(uchar dat)
{
	bit ack=1;
	uchar mask;
	SDA=1;
	Delay5us();
	for(mask=0x80;mask;mask>>=1)
	{
		SDA=mask&dat;
		Delay5us();
		SCL=1;
		Delay5us();
		SCL=0;
		Delay5us();
	}
	SDA=1;
	Delay5us();
	SCL=1;
	Delay5us();
	ack=SDA;
	SCL=0;
	Delay5us();
	return ack;
}

uchar i2c_read_byte_ack()
{
	uchar mask,val;
	SDA=1;
	Delay5us();
	for(mask=0x80;mask;mask>>=1)
	{
		if(SDA)
		{
			val|=mask;
		}	
		else
		{
			val&=~mask;
		}
		Delay5us();
		SCL=1;
		Delay5us();
		SCL=0;
		Delay5us();
	}
	SDA=0;
	Delay5us();
	SCL=1;
	Delay5us();
	SCL=0;
	Delay5us();
	return val;
}

uchar i2c_read_byte_nack()
{
	uchar mask,val;
	SDA=1;
	Delay5us();
	for(mask=0x80;mask;mask>>=1)
	{
		if(SDA)
		{
			val|=mask;
		}
		else
		{
			val&=~mask;
		}
		Delay5us();
		SCL=1;
		Delay5us();
		SCL=0;
		Delay5us();
	}
	SDA=1;
	Delay5us();
	SCL=1;
	Delay5us();
	SCL=0;
	Delay5us();
	return val;
}

bit i2c_device(uchar dev,bit read)
{
	// read:1 write:0
	static bit ack=1;
	dev<<=1;
	if(read)
	{
		dev|=0x01;
	}
	else
	{
		dev&=0xfe;
	}
	ack=i2c_write_byte(dev);
	return ack;
}

void e2_write(uchar word,uchar *dat,uchar len)
{
	do{
		i2c_start();
		if(~i2c_device(0x50,0))
		{
			break;
		}
		i2c_stop();
	}while(1);
	i2c_write_byte(word);
	while(len)
	{
		i2c_write_byte(*dat++);
		len--;
	}
	i2c_stop();
}

void e2_read(uchar word,uchar *dat,uchar len)
{
	do{
		i2c_start();
		if(~i2c_device(0x50,0))
		{
			break;
		}
		i2c_stop();
	}while(1);
	i2c_write_byte(word);
	i2c_start();
	i2c_device(0x50,1);
	while(len>1)
	{
		*dat++=i2c_read_byte_ack();
		len--;
	}
	*dat=i2c_read_byte_nack();
	len--;
	i2c_stop();
}

//void e2_reset(void)
//{
//	static uchar i=0;
//	for(i=0;i<255;i++)
//	{
//		e2_write(i,0);
//	}
//}

void get_dac(uchar *dat,uchar len)
{
	do{
		i2c_start();
		if(~i2c_device(0x48,0))
		{
			break;
		}	
		i2c_stop();
	}while(1);
	i2c_write_byte(0x44);
	i2c_start();
	i2c_device(0x48,1);
	i2c_read_byte_ack();
	while(len-1)
	{
		*dat++=i2c_read_byte_ack();
		len--;
	}
	*dat=i2c_read_byte_nack();
	len--;
	i2c_stop();
}

void set_dac(uchar dat)
{
	do{
		i2c_start();
		if(~i2c_device(0x48,0))
		{
			break;
		}	
		i2c_stop();
	}while(1);
	i2c_write_byte(0x44);
	i2c_write_byte(dat);
	i2c_stop();
}
复制代码
  • sonic_infra.c

sonic_infra.c

#include "common.h"

sbit TX=P1^0;
sbit RX=P1^1;

void Delay10us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 25;
	while (--i);
}

void sonic_emit(void)
{
	uchar i=8;
	while(i--)
	{
		TX=1;
		Delay10us();
		TX=0;
		Delay10us();
	}
}

uint sonic_echo(void)
{
	static uint distance=0;
	TL1 = 0x00;
	TH1 = 0x00;
	TF1=0;
	TR1 = 1;
	while(RX&&~TF1);
	TR1 = 0;
	if(TF1)
	{
		TF1=0;
		distance=9999;
		return distance;
	}
	else
	{
		distance=TH1;
		distance<<=8;
		distance|=TL1;
	}
	TL1 = 0x00;
	TH1 = 0x4C;
	distance=(uint)(distance*0.017);//distance=time*velocity/2
	return distance;
}
uint sonic_distance(void)
{
	static uint distance=0;
	sonic_emit();
	distance=sonic_echo();
	return distance;
}
复制代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值