找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1354|回复: 0
打印 上一主题 下一主题
收起左侧

倒车雷达

[复制链接]
跳转到指定楼层
楼主
ID:317831 发表于 2018-4-27 15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*-------------------------------------
超声波测距器单片机程序
MCU AT89C51  XAL 12MHz
2009.5.25
#include<at89x51.h>
#include<intrins.h>
#define uchar unsigned unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code tab[]={0x18,0x7b,0x2c,0x29,0x4b,0x89, 0x 88, 0x3b, 0x 08, 0x 09, 0x f f, 0x 8e};//段码
data uchar testok,num,keynum1,mao;
data uchar dispram[4]={0,0,0,0};//显示初值
data uine i;
data ulong time,baojing;
sbit  set=P2^0;//定义位寻址,设置键
sbit  add=P2^1;//
sbit  dec= P2^2;//
sbit  ok= P2^3;//确定键
dalay(uchar t)//延时子程序
{
   uchar I;
   for(i=0;i<t;i++)
     for(j=0;j<10;j++)
}
init()//定时器初始化、启动超声波发送
{
   uchar i=4;
   TH0=0;
   TL0=0;
   TR0=1;
   while(i--)
   {
      P1_0=~p1_0
      dalay(1);
}
}
display()//显示子程序
{
uchar i,temp=0xef;
  for{i=0;i<4;i++}
   {
       P2=temp;
      if(mao==1&&keynum-1==i)
        P0=0xff;//
       else
          p0=tab[dispram];//亮,送显示数据
      temp=_crol_(temp,1);
      delay(10);
       P2=0xff;
   }
}
viod shanshuo()//闪烁
{
  if(keynum1<1)
   {
      keynum1++;
mao=1;
}
else
{
   keynum1++;
   mao=0;
   if(keynum1==2)
   keynum1=0;
}
}
void keyscan()//键盘扫描
{
      if(set==0)//设置键
        delay(10);
        if(set==0)
         {
            while(!set);
            delay(10);
            while(!set);
            keynum++;//键值加1
EX0=0;   //管定时器0和外部中断1
ET0=0;
if(keynum==5)
    keynum=1;
}
if(keynum!=0)
{
    if(add==0)   //增加
        delay(10);
        if(add==0)
       {
            while(!add);
             delay(10);
             while(!add);
               dispram[keynum-1]++; //对应的缓冲区值加1
if(dispram[keynum-1]==10)
    dispram[keynum-1]=0;
}
          if(dec==0) //值减
              delay(10);
              if(dec=0)
{
while(!dec);
delay(10);
while(idec;
if(dispram[keynum-1]== 0)
dispram[keynum-1]=10;
dispram[keynum-1]--;//对应的缓冲区值减1
              }
}
if(ok==0)//确定键
    delay(10);
    if(ok==0)
    {
        while(!ok)
        delay(10);
        while(!ok);
        keynum=0;
baojing=dispram[3]*1000+dispram[2]*100+dispram[1]*10+disprm[0];//取出设置的报警值
        EX0=1;
        ET0=1;
}
}
/*主程序*/
void main(viod)
{
TMOD=0x01;//定时器0模式1
IE=0x80;//开总中断,相当于EA=1;
while(1)
{
   testok=0;
     if(keynum!=0)
         shanshuo();
     else{ inie();//启动定时器0和超声波发送
          EX0=1;//开外部中断0
          ET0=1;//开定时器0中断
          while(!testok)display();
}
          keyscan();
            if(1==teskok)
            {
                time=TH0;
time=(time<<8)/TL0;//取出定时器0值
time*=172;
time/=10000;//变为厘米
if(time<baojing)
P1_1=0;//报警
else  P1_1=1;
dispram[0]=(uchar)(time%10);//距离计算送显示缓冲
time/=10;
dispram[1]=(uchar)(time%10);
time/=10;
dispram[2]=(uchar)(time%10);
dispram[3]=(uchar)(time%10);
}
if(2==testok)//超时显示OFF
{
dispram[0]=11;
dispram[1]=11;
dispram[2]=0;
dispram[3]=10;
             }
             for(i=0;i<300;i++) display();
}
}
/*超声接收程序(外中断0)*/
void cs_r(void) interrupt 0
{
TR0=0;
ET0=0;
EX0=0;
testok=1;
}
/*超时清除程序(内中断T0)*/
void overtime(void)interrupt 1
{
EX0=0;
ET0=0;
TR0=0;
testok=2;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表