专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

航模大赛小车程序(不容易啊)

作者:佚名   来源:本站原创   点击数:  更新时间:2012年11月15日   【字体:
#include<reg52.h>
#include <intrins.h>
#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;i<x;i++)
 for(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;
}
//==左转======================================
void turn_lef()
{
 // z=0;
  m1zheng=0;
  m1fu=0;
  m2zheng=1;
  m2fu=0;
  keys=0;
}
//==右转======================================
void turn_rig()
{ 
 // z=0;
  m1zheng=1;
  m1fu=0;
  m2zheng=0;
  m2fu=0;
  keys=0;
}
//==停止程序==================================
void stop()
{
  z=0;
  m1zheng=0;
  m1fu=0;
  m2zheng=0;
  m2fu=0;
  keys=0;
}
 //
void timer0() interrupt 1 using 1
{
 TH0 = 0xfe;
 TL0 = frq;
 if(z==1)
 {
 SPK=~SPK;
 }
 else
 {
  SPK=1;
 }  
}
 //

//==主程序===================================
void main()
{
 EA=1;
 EX0=1;          //IE=0x81;
 TMOD=0x01;
 TR0=1;
 IT0=1;//TCON=0x11;
 ET0=1;// m1zheng=0;
 //
 frq = 0x00;
 TH0 = 0x00;
 TL0 = 0xff;  
 // 
                  //wendu
// uint Temp_buff;
// uchar g;
                 //wendu
 while(1)
 {
  //
  frq++;
  delayms(1);
  //
   switch(keys)
    {
     case ~0xBD: z=1; break;
     
     case ~0xB9: go();break;
     case ~0xEA: back();break;
     case ~0xBB: turn_lef();break;
     case ~0xBC: turn_rig();break;
     case ~0xE7: inc();break;
     case ~0xAD: dec();break;
     case ~0xBF: stop();break;
     
     case ~0xB5: z=0;break;
     default:break;  
    }                ///////wendu
  Temp_buff=ReadTemperature(); /*读取当前温度*/
  sled_data[5] = sled_mun_to_char[Temp_buff/100];
  sled_data[6] = sled_mun_to_char[Temp_buff%100/10];
  sled_data[7] = sled_mun_to_char[Temp_buff%10];
  for(g=0;g<8;g++)
  {
     sled_wm_port = 0xff; /*关闭显示*/
     _Nop();
     _Nop();
     _Nop();
     sled_dm_port = sled_data[g]; /*输出段码数据到数码管*/
     if(g==6) sled_dm_port = sled_dm_port&0x7f; /*显示小数点*/
     sled_wm_port = sled_bit_table[g]; /*输出位码数据到数码管*/
     delay_1ms(1);
     }
                    ///////wendu
     
 }
} 
关闭窗口

相关文章