專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

航模大賽小車程序(不容易。

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間: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      /*定義數(shù)碼管段碼的控制腳*/
#define sled_wm_port P2    /*定義數(shù)碼管位碼的控制腳*/
/*定義數(shù)碼管顯示字符跟數(shù)字的對(duì)應(yīng)數(shù)組關(guān)系*/
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 */
/*定義需要點(diǎn)亮的數(shù)碼管*/
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號(hào)SLED緩沖值*/
uchar data led_lighten_bit=0 ;  /*LED燈點(diǎn)亮標(biāo)志位0-7*/
 

//延時(shí)函數(shù)
void delay(unsigned int i)
{
 while(i--);
}
//初始化函數(shù)
Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1; //DQ復(fù)位
 delay(8); //稍做延時(shí)
 DQ = 0; //單片機(jī)將DQ拉低
 delay(80); //精確延時(shí) 大于 480us
 DQ = 1; //拉高總線
 delay(14);
 x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
 delay(20);
}
//讀一個(gè)字節(jié)
ReadOneChar(void)
{
 unsigned char i=0;
 unsigned char dat = 0;
 for (i=8;i>0;i--){
  DQ = 0; // 給脈沖信號(hào)
  dat>>=1;
  DQ = 1; // 給脈沖信號(hào)
  if(DQ)  dat|=0x80;
  delay(4);
  }
 return(dat);
}
//寫(xiě)一個(gè)字節(jié)
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); // 跳過(guò)讀序號(hào)列號(hào)的操作
 WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
 Init_DS18B20();
 WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
 a=ReadOneChar();
 b=ReadOneChar();
 t=b;
 t<<=8;
 t=t|a;
 tt=t*0.0625; //將溫度的高位與低位合并
 t= tt*10+0.5; //對(duì)結(jié)果進(jìn)行4舍5入
 return(t);
}

/*1MS為單位的延時(shí)程序*/
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;
      }
                           //確認(rèn)IR信號(hào)出現(xiàn)
   while (!IRIN)            //等IR變?yōu)楦唠娖,跳過(guò)9ms的前導(dǎo)低電平信號(hào)。
     {IRdelay(1);}
  for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
  {
    for (k=0;k<8;k++)        //每組數(shù)據(jù)有8位
    {
     while (IRIN)            //等 IR 變?yōu)榈碗娖,跳過(guò)4.5ms的前導(dǎo)高電平信號(hào)。
       {IRdelay(1);}
while (!IRIN)          //等 IR 變?yōu)楦唠娖?        {IRdelay(1);}
       while (IRIN)           //計(jì)算IR高電平時(shí)長(zhǎng)
         {
       IRdelay(1);
       N++;          
       if (N>=30)
      { return;}                  //0.14ms計(jì)數(shù)過(guò)長(zhǎng)自動(dòng)離開(kāi)。
         }                        //高電平計(jì)數(shù)完畢               
       IRCOM[j]=IRCOM[j] >> 1;                  //數(shù)據(jù)最高位補(bǔ)“0”
       if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數(shù)據(jù)最高位補(bǔ)“1”
       N=0;
     }//end for k
   }//end for j

 keys=IRCOM[2];
}
//==0.14ms延時(shí)===============================
void IRdelay(unsigned char x)    //x*0.14MS
{
 unsigned char i;
  while(x--)
 {
  for (i = 0; i<13; i++) {}
 }
}
void delayms(unsigned char ms) 
// 延時(shí)子程序
{      
 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;
}
//==左轉(zhuǎn)======================================
void turn_lef()
{
 // z=0;
  m1zheng=0;
  m1fu=0;
  m2zheng=1;
  m2fu=0;
  keys=0;
}
//==右轉(zhuǎn)======================================
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(); /*讀取當(dāng)前溫度*/
  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; /*關(guān)閉顯示*/
     _Nop();
     _Nop();
     _Nop();
     sled_dm_port = sled_data[g]; /*輸出段碼數(shù)據(jù)到數(shù)碼管*/
     if(g==6) sled_dm_port = sled_dm_port&0x7f; /*顯示小數(shù)點(diǎn)*/
     sled_wm_port = sled_bit_table[g]; /*輸出位碼數(shù)據(jù)到數(shù)碼管*/
     delay_1ms(1);
     }
                    ///////wendu
     
 }
} 
關(guān)閉窗口

相關(guān)文章