微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 航模大赛小车程序

航模大赛小车程序

时间:11-29 来源:互联网 点击:
#include

#include

#define c(x)(x*110592/120000)

unsigned char Ir_Buf[4];

sbit IRIN = P3^2;

unsigned char IRCOM[7];

char k,z;

void IRdelay(unsigned char x);

unsigned char keys=0xff;

sbit m1zheng=P1^0;

sbit m1fu=P1^1 ;

sbit m2zheng=P1^2;

sbit m2fu=P1^3;

sbit SPK = P3^7;

unsigned char frq;

unsigned int flag; // ///////////// wendu

#define uint unsigned int

#define uchar unsigned char

uint Temp_buff;

uchar g;

#define nop() _nop_()

#define _Nop() _nop_()

sbit DQ =P3^6; //定义DS18B20通信端口

#define sled_dm_port P0 /*定义数码管段码的控制脚*/

#define sled_wm_port P2 /*定义数码管位码的控制脚*/

/*定义数码管显示字符跟数字的对应数组关系*/

uchar code sled_mun_to_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */

/*定义需要点亮的数码管*/

uchar code sled_bit_table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar data sled_data[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; /*0-7号SLED缓冲值*/

uchar data led_lighten_bit=0 ; /*LED灯点亮标志位0-7*/

//延时函数

void delay(unsigned int i)

{

while(i--);

}

//初始化函数

Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay(80); //精确延时 大于 480us

DQ = 1; //拉高总线

delay(14);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(20);

}

//读一个字节

ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--){

DQ = 0; // 给脉冲信号

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ) dat|=0x80;

delay(4);

}

return(dat);

}

//写一个字节

WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--){

DQ = 0;

DQ = dat&0x01;

delay(5);

DQ = 1;

dat>>=1;

}

}

//读取温度

ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned int t=0;

float tt=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar();

b=ReadOneChar();

t=b;

t<=8;

t=t|a;

tt=t*0.0625; //将温度的高位与低位合并

t= tt*10+0.5; //对结果进行4舍5入

return(t);

}

/*1MS为单位的延时程序*/

void delay_1ms(uchar x)

{

uchar j;

while(x--){

for(j=0;j<125;j++)

{;}

}

}

////////////////wendu

//==中断读取红外键值程序=========================

void int0(void) interrupt 0

{

unsigned char j,k,N=0;

IRdelay(15);

if (IRIN==1)

{

return;

}

//确认IR信号出现

while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。

{IRdelay(1);}

for (j=0;j<4;j++) //收集四组数据

{

for (k=0;k<8;k++) //每组数据有8位

{

while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。

{IRdelay(1);}

while (!IRIN) //等 IR 变为高电平

{IRdelay(1);}

while (IRIN) //计算IR高电平时长

{

IRdelay(1);

N++;

if (N>=30)

{ return;} //0.14ms计数过长自动离开。

} //高电平计数完毕

IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”

if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”

N=0;

}//end for k

}//end for j

keys=IRCOM[2];

}

//==0.14ms延时===============================

void IRdelay(unsigned char x) //x*0.14MS

{

unsigned char i;

while(x--)

{

for (i = 0; i<13; i++) {}

}

}

void delayms(unsigned char ms)

// 延时子程序

{

unsigned char i;

while(ms--)

{

for(i = 0; i < 120; i++);

}

}

//==延迟程序==================================

void delay1ms(int x)

{ int i,j;

for(i=0;ifor(j=0;j<120;j++) ;

}

//==方向向前==================================

void go()

{

//z=1;

m1zheng=1;

m1fu=0;

m2zheng=1;

m2fu=0;

keys=0;

}

//==方向向后==================================

void back()

{

// z=0;

m1zheng=0;

m1fu=1;

m2zheng=0;

m2fu=1;

keys=0;

}

//==左转======================================

v

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top