久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3287|回復: 0
打印 上一主題 下一主題
收起左側

當距離變化過快這個程序就不執行電機的程序了,測量和顯示還是可以進行的

[復制鏈接]
跳轉到指定樓層
樓主
ID:194551 發表于 2017-5-28 18:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
附上程序
#include "reg52.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 12000000L          //系統頻率
#define BAUD 115200             //串口波特率
#define uint unsigned int
#define uchar unsigned char
#define Busy    0x80 //用于檢測LCM狀態字中的Busy標識
//////液晶屏數據口///////
sbit LCM_RS  =P2^0;//定義液晶屏信號引腳
sbit LCM_RW  =P2^1;
sbit LCM_E   =P2^2;
#define LCM_Data  P0//液晶數端口
unsigned char code uctech[] = {"0123456789ABCDEF:"};
sfr AUXR  = 0x8e;               //輔助寄存器
#define T1MS (65536-FOSC/8000)      //1000MS模式

sbit ONA                =P2^3;//電機1A
sbit ONB                =P2^4;//電機1B
sbit ONC                =P2^6;//電機2A
sbit OND                =P2^7;//電機2B

sbit Echo1              =P3^2;//超聲波數據
sbit Trig1              =P2^5;//超聲波啟動
void delay(unsigned int z)//延時
{
   unsigned int x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}


//1ms延時
void Delay5Ms(void)
{
   delay(5);
}

void WriteDataLCM(unsigned char WDLCM)
{
//ReadStatusLCM(); //檢測忙

LCM_RS = 1;
LCM_Data = WDLCM;
Delay5Ms();
LCM_RW = 0;
LCM_E = 1; //若晶振速度太高可以在這后加小的延時
Delay5Ms();
LCM_E = 0; //延時

}

//寫指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
{
//if (BuysC) ReadStatusLCM(); //根據需要檢測忙

LCM_RS = 0;
LCM_Data = WCLCM;
Delay5Ms();
LCM_RW = 0;
LCM_E = 1;
Delay5Ms();
LCM_E = 0;
}
#if 0
//讀數據
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}

//讀狀態
unsigned char ReadStatusLCM(void)
{
LCM_Data = ~0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //檢測忙信號
return(LCM_Data);
}
#endif
void LCMInit(uchar i) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();

WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
WriteCommandLCM(0x08,1); //關閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示光標移動設置
WriteCommandLCM(i,1); // 顯示開及光標設置
}

void LCMInitc(uchar i)
{
WriteCommandLCM(0x06,0); //光標歸位
WriteCommandLCM(i,0); //關光標,閃爍
}

//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData,uchar i)
{

Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
X |= 0x80; // 算出指令碼


WriteCommandLCM(X,0); //這里不檢測忙信號,發送地址碼
LCMInitc(i);
Delay5Ms();
LCMInitc(0x0c);
WriteDataLCM(DData);


}
//按指定位置顯示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;

  ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到達字串尾則退出
  {
   if (X <= 0xF) //X坐標應小于0xF
    {
     DisplayOneChar(X, Y,DData[ListLength],0x0c); //顯示單個字符
     ListLength++;
     X++;
    }
  }
}


void tim0init()
{

    //AUXR |= 0x80;                   //定時器0為1T模式
    TMOD = 0x00;                    //設置定時器為模式0(16位自動重裝載)
    TL0 = 0x66;                  //初始化計時值
    TH0 = 0xfc;
    TR0 = 1;                        //定時器0開始計時
    ET0 = 1;                        //使能定時器0中斷

     TMOD|=0x11;                   //設T1為方式1,GATE=1;
         EA=1;                           //開啟總中斷       
         TH1=0;
         TL1=0;         
         ET1=1;             //允許T1中斷
         TR1=0;
     EA = 1;
}


WORD U16FLAG;
unsigned int time_c,Dista1;
unsigned char timeH,timeL;
bit succeed_flag;
/********************************************************/
void  StartModule()                         
  {
//    unsigned int distance;
     #if 1
         Trig1=1;   //啟動模塊              
         delay(1);
         Trig1=0;
     U16FLAG=58477;
     while((!Echo1)&&U16FLAG++);
     TR1=1;                            //開啟計數
     U16FLAG=58477;
     while((Echo1)&&U16FLAG++);
     TR1=0;
         time_c=TH1*256+TL1;
         TH1=0;
         TL1=0;
         Dista1=(time_c*1.7)/100;//算出來是CM
         delay(50);
         #endif


  }
void timer1() interrupt 3 using 1
{       
  TH0=0;
  TL0=0;                                                         //中斷溢出標志
}

                                                  
uint tim0[20];

//定時器中斷
void tm0_isr() interrupt 1 using 1
{
        tim0[0]++;
       
   if(Dista1>110)//加速正轉
   {
   tim0[3]=(Dista1-80);

   tim0[2]=65536-FOSC/(tim0[3]*200);
        TL0=tim0[2];
        TH0=tim0[2]>>8;
        switch(tim0[0])
        {
          case 1: ONA=0;ONB=1;ONC=1;OND=1;break;
          case 2: ONA=1;ONB=0;ONC=1;OND=1;break;
          case 3: ONA=1;ONB=1;ONC=0;OND=1;break;
          case 4: ONA=1;ONB=1;ONC=1;OND=0;tim0[0]=0; break;
          
         
        }

  }
   if(Dista1>80&&Dista1<140)//勻速正轉
   {
     tim0[2]=65536-FOSC/3000;
        TL0=tim0[2];
        TH0=tim0[2]>>8;
        switch(tim0[0])
        {
          case 1: ONA=0;ONB=1;ONC=1;OND=1;break;
          case 2: ONA=1;ONB=0;ONC=1;OND=1;break;
          case 3: ONA=1;ONB=1;ONC=0;OND=1;break;
          case 4: ONA=1;ONB=1;ONC=1;OND=0;tim0[0]=0; break;
          
         
        }

  }
    else if(Dista1<=20)//加速反轉
  {
       tim0[3]=(50-Dista1) ;
          
   tim0[2]=65536-FOSC/(tim0[3]*200);
          TL0=tim0[2];
          TH0=tim0[2]>>8;
      switch(tim0[0])
          {
          case 1: ONA=1;ONB=1;ONC=0;OND=1;break;
          case 2: ONA=1;ONB=0;ONC=1;OND=1;break;
          case 3: ONA=0;ONB=1;ONC=1;OND=1;break;
          case 4: ONA=1;ONB=1;ONC=1;OND=0;tim0[0]=0;break;
          }
         
  }       
  else if(Dista1<=50)//勻速反轉
  {  
   tim0[2]=65536-FOSC/3000;
          TL0=tim0[2];
          TH0=tim0[2]>>8;
      switch(tim0[0])
          {
          case 1: ONA=1;ONB=1;ONC=0;OND=1;break;
          case 2: ONA=1;ONB=0;ONC=1;OND=1;break;
          case 3: ONA=0;ONB=1;ONC=1;OND=1;break;
          case 4: ONA=1;ONB=1;ONC=1;OND=0;tim0[0]=0;break;
          }
         
  }       



  else if(Dista1>50&&Dista1<80)//不轉
  {
             
    ONA=1;ONB=1;ONC=1;OND=1;

    tim0[0]=0;

  }
   else if(Dista1>140)//         勻速轉   
  {

         tim0[2]=65536-FOSC/6000;
        TL0=tim0[2];
        TH0=tim0[2]>>8;
        switch(tim0[0])
        {
          case 1: ONA=0;ONB=1;ONC=1;OND=1;break;
          case 2: ONA=1;ONB=0;ONC=1;OND=1;break;
          case 3: ONA=1;ONB=1;ONC=0;OND=1;break;
          case 4: ONA=1;ONB=1;ONC=1;OND=0;tim0[0]=0;break;
         
        }
        }


}

       

void main()
{

    tim0init();
        LCMInit(0x0c); //LCM初始化
    Delay5Ms(); //延時片刻(可不要
    DisplayListChar(8, 1,"C");//在指定,列顯示字符串
           DisplayListChar(9, 1,"M");//在指定,列顯示字符串
    while(1)
        {
          StartModule();
          DisplayOneChar(4,1,uctech[Dista1/1000%10],0x0c);//顯示個位
      DisplayOneChar(5,1,uctech[Dista1/100%10],0x0c);//顯示個位
      DisplayOneChar(6,1,uctech[Dista1/10%10],0x0c);//顯示個位
      DisplayOneChar(7,1,uctech[Dista1%10],0x0c);//顯示個位


        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色大片在线播放 | 色接久久 | 91国内视频在线 | 欧美成年人 | 91丨九色丨国产在线 | 国产毛片久久久 | 韩日一区二区 | 91麻豆精品国产91久久久更新资源速度超快 | 久久久91精品国产一区二区精品 | 免费av手机在线观看 | 国产免费观看一级国产 | 亚洲高清三级 | 免费欧美| 国产精品久久久久久久久久久久久 | 成人av免费在线观看 | 亚洲欧美中文日韩在线 | 91大神在线看 | 国产高清视频在线播放 | 午夜日韩| 国产日韩欧美二区 | 日韩在线观看视频一区 | 免费电影av | 91视频免费在观看 | 国产精品色婷婷久久58 | jav成人av免费播放 | 91精品久久久久久久久久小网站 | 国产精品成人在线观看 | 韩国av网站在线观看 | 亚洲成人999| 91精品一区二区三区久久久久久 | 久久最新| 免费黄色的网站 | 九九亚洲 | 激情婷婷 | 久久成人精品视频 | 免费 视频 1级 | 毛片一区二区三区 | 亚洲精品麻豆 | 国产欧美精品区一区二区三区 | 亚洲精品在线国产 | 亚洲精品久久久久久久不卡四虎 |