⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 car.txt

📁 一个基于holtex46系列的单片机程序,自动寻迹小车!
💻 TXT
字号:
#include <ht46r24.h>//使用28脚封装,4M晶振
#define csbout _pa6//一些重要I/O的定义
#define csbin _pa7
#define speaker _pa4
#define motctr1 _pa0
#define motctr2 _pa1
#define motdire1 _pa2
#define motdire2 _pa3
#define cs1 _pd0
#define cs2 _pd1

//中断服务入口定义-------------------------------------------------------------
#pragma vector external_isr @ 0x4
#pragma vector timer0_isr @ 0x8
#pragma vector timer1_isr @ 0xc
//0~9段码
const unsigned char convert[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};

//RAM bank 0 变量定义----------------------------------------------------------------------------------
#pragma rambank0
unsigned int i, j,k,m,n,wx1,wx2,dispdata[6];
unsigned char baiwei,shiwei,gewei;//显示的距离数
unsigned long t, sudu,s,temp1,temp2;
bit flag1,flag2,flag3,flag4;//标志位,表示电机的运行状态,flag3表示左右方向标志
                                               //flag4表示有无障碍物标志
//中断服务子程序----------------------------------------------------------------------------------------------------
void external_isr(){//红外遥控用
_pbc=0xfa;//
if(_pb1);
if(_pb3);
}
void timer0_isr(){//定时器1中断
_emi=1;
n++;
}
void timer1_isr(){//定时器1中断,2ms进入一次,并送显示
_emi=1;//允许其他中断进入
_pbc = 0x00;
if(j<6)
{_pc=wx1|wx2;
_pb=dispdata[j];
wx2+=0x04;
j++;}
else
{j=0;wx1=0x02;}
}
//子程序申明---------------------------------------------------------------------------------------------------------------
void initial(void);//初始化
void csbfs(void);//超声波发送
void transf(void);
void motor(void);//电机控制
void motgo(void);//电机正转
void motback(void);//电机停
void motstop(void);//电机反转
void motright(void);//左
void motleft(void);//右
void alarm(void);
//-------------------------------------------------------------------------------------------------------------------------------------
//initialize registers for safeguard
void safeguard_init(void){
_intc0 = 0;
_tmr0c=0;
_tmr1c = 0;
_tmr0l = 0;
_tmr0h=0;
_tmr1l=0;
_tmr1h=0;
_pac = 0xff; 
_pbc = 0xff;
_pcc = 0xff;

}
//--- --- --- ---- ---- --- ---- -- ---- -- ---- ---- ---- --- --- ----- --- ---- --- --- ----- --- --- ---- ---- ---- -----
//主程序-----------------------------------------------------------------------------------
void main(void){
safeguard_init();//安全初始化
initial();//硬件和一些变量初始化
while(1){
 csbfs();
//motor();//电机控制
}
}
//-- --- -- ---- --- ---- ----- ---- ---- ----- ---- --- --- ----- ---- --- ----- --- --- ---- ---- ---- -- ---- ----- --- ---- -- ---- --- -- --
//各个子程序--------------------------------------------------------------------------------------------
//初始化
void initial(void){
_pac = 0xa0; //10100000
_pbc = 0x00;//接LED段码,输出
_pcc = 0x00;//接138,输出
_intc0=0x0f;//定时器0,1中断et0i=1,et1i=1,emi=1,外部中断eei=1
_tmr0c=0x80;//定时器0用于超声波计时,计算时间;
_tmr0l= 0x9b;//100us中断一次
_tmr0h=0xff;//用_tmr0c_4=1启动,注意读取时,要先读高,再读低字节。
_tmr1c = 0x80;//定时方式,用于led显示,fosc/4,T=1us
_tmr1l=0xe0;//2ms的时间常数
_tmr1h=0xb1;//用_tmr1c_4=1启动
j=0;k=0x0a;n=0;m=0xff;
sudu=344;//声速344米/秒
wx1=0x02;wx2=0;
for(i=0;i<6;i++) dispdata[i]=0x03;
i=0;
flag1=0;flag2=0;flag3=0;flag4=0;
}
//-----------------------------------------------------------------------------------
//超声波模块
void csbfs(){

_t1on=1;//启动定时器1, _t1on=1
wait:
while(k--)
{csbout=~csbout;
 _delay(7);//时间还需要调整
}
_t0on=1;//启动定时器0, _t0on=1
_delay(1200);//盲区,时间还需要调整,也就是20cm以内无法测量,1.2msx340/2=20cm
k=0x0a;
while(!csbin)   //判断有无接收
{  if(n>150)           //150x100us=15ms,340x15msx2=10m左右;
      {flag4=1;          //如果前面无障碍物,则退出循环
        n=0;
        break;} //整个循环所需时间要小与12us,才能保证精确。
}
while(csbin){

_pc3=~_pc3;
_delay(1200);
break;
}
goto wait;
_t0on=0;//关定时器
k=0x0a;
if(flag4)
  {dispdata[2]=convert[9];//超过十米或无障碍物,显示999
   dispdata[1]=convert[9];
   dispdata[0]=convert[9];}
else
   {//根据时间求距离
   temp1=_tmr0h;
   temp2=_tmr0l;
  temp2-=0x9b;
  t=n*100+temp2;
  s=t*sudu/2;
  s=s/100;
  s=s/100;}//最后得到的距离s是以厘米为单位,需显示3位数
  transf();//数据转换,设置标志位
}
//------------------------------------------------------------------------
//数据转换,设置标志位
void transf(void){
baiwei=s/100;
shiwei=(s-100*baiwei)/10;
gewei=s-100*baiwei-10*shiwei;
dispdata[2]=convert[baiwei];
dispdata[1]=convert[shiwei];
dispdata[0]=convert[gewei];
if(baiwei<1&&shiwei >=5) flag1=1;//距离小于1米,flag1置位,停止加速
if(baiwei<1&&shiwei<5) flag2=1;//距离小于50厘米,flag2置位,倒车
if(baiwei>=1) {flag1=0;flag2=0;}
}
//------------------------------------------------------------------------------------
//电机控制
void motor(){
cs1=1;
cs2=1;
if(flag4) 
{motgo();flag4=0;}
else{
if(flag1) motstop();
if(flag2) {alarm();motback();}//
if(!flag1) motgo();
     }
}
//----------------------------------------------------------------------
void alarm(void)//提示警报
{m=5;
while(m--){
speaker=~speaker;
_delay(10);}
}
//----------------------------------------------------------------------
void motgo(){//电机正转
motctr1=1;
motctr2=0;}
void motback(){//电机停
motctr1=0;
motctr2=1;}
void motstop(){//电机反转
motctr1=0;
motctr2=0;}
void motright(){//左
motdire1=1;
motdire2=0;}
void motleft(){//右
motdire1=0;
motdire2=1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -