找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己敲的程序 出问题了 急需大神帮助!!!!

[复制链接]
跳转到指定楼层
楼主
ID:65824 发表于 2014-9-8 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超声波可以正常测距  但是按键无法设定报警距离    (报警模块现在还没有加)

//--------------------------------------
#include<reg52.h>
#include<intrins.h>

#define uint  unsigned int
#define uchar unsigned char

#define yh 0x80                              


#define NOP() {_nop_();_nop_();_nop_();_nop_();}

//------LCD引脚-----
sbit LCD_RS=P1^0;
sbit LCD_RW=P1^1;
sbit LCD_EN=P2^5;

sbit key1=P3^5;                             //设置键
sbit key2=P3^6;                             //加键
sbit key3=P3^7;                             //减键
sbit buzzer=P2^3;                            //蜂鸣器,通过三极管9012驱动,端口低电平响

//------超声波引脚-------
sbit Tx=P3^3;                //触发控制信号输入
sbit Rx=P3^2;                //回响信号输出
uchar code table[]={"L=000cm  H=000cm"};                //LCD第一行显示
uchar code table1[]={"0123456789"};
uchar temp_dis[]= {"Distance=000.0cm"};                                //LCD第二行

long int t,distance,key1n,b1,b2,b3,b4,b5,b6;
uchar cache[4]={0,0,0,0};

//--------延时-------
void delay(uint ms)
{
        uint t;
        while(ms--)
        for(t=0;t<120;t++);
}



//-------读LCD状态-------
uchar read_lcd_state()
{
        uchar state;
        LCD_RS=0;
        LCD_RW=1;
        LCD_EN=1;
        _nop_();
        state=P0;
        LCD_EN=0;
        _nop_();
        return state;
}
//-------忙等待------
void lcd_busy_wait()
{
        while((read_lcd_state() & 0x80)==0x80);
        NOP();
}
//----------LCD写指令----------
void lcd_write_com(uchar com)
{
        lcd_busy_wait();
        LCD_RS=0;                //RS为0时,写指令,RS为1时,写数据
        LCD_RW=0;
        P0=com;
        NOP();
        LCD_EN=1;
        NOP();
        LCD_EN=0;
}
//----------LCD写数据----------
void lcd_write_data(uchar dat)
{
        lcd_busy_wait();
        LCD_RS=1;
        LCD_RW=0;
        P0=dat;
        NOP();                                       
        LCD_EN=1;
        NOP();
        LCD_EN=0;
}
//-------LCD初始化-------
void lcd_init()
{
        LCD_EN=0;
        lcd_write_com(0x38);                        //LCD显示模式设置
        lcd_write_com(0x0c);                        //LCD显示开/关及光标设置
        lcd_write_com(0x06);                        //当写一个字符后地址指针加1,且光标加1
        lcd_write_com(0x01);                        //显示清屏
}
//---------设置液晶显示位置-----------
void set_lcd_pos(uchar p)
{
        lcd_write_com(p|0x80);
}
//---------液晶显示程序----------
void lcd_print(uchar p,uchar *s,uint low)
{
        uint num;
        set_lcd_pos(p);
        for(num=0;num<low;num++)               
        {
                lcd_write_data(s[num]);
                delay(1);       
        }
}
void HC05_Init()
{
        Tx=1;                                                //触发脉冲
        NOP();NOP();NOP();NOP();
        Tx=0;
        distance=0.188*t;                        //距离计算
}
void distance_convert(long int dat)
{
        cache[0]=dat/1000;
        cache[1]=dat/100%10;
        cache[2]=dat/10%10;
        cache[3]=dat%10;
        temp_dis[9]=cache[0]+'0';
        temp_dis[10]=cache[1]+'0';
        temp_dis[11]=cache[2]+'0';
        temp_dis[13]=cache[3]+'0';
}
//-------keybord_scan----------------------------
//****************键盘扫描有关函数**********************
void keyscan()
{
        if(key1==0)                          //key1为功能键(设置键)
        {
        delay(9);                            //延时,用于消抖动
        if(key1==0)                          //延时后再次确认按键按下
        {
    buzzer=0;                           //蜂鸣器短响一次
    delay(20);
    buzzer=1;
        while(!key1);
        key1n++;
        if(key1n==8)
                key1n=1;                      //设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环
        switch(key1n)
        {
       
        case 1:
                        lcd_write_com(yh+0x02);         //设置按键按动一次,秒位置显示光标
                           lcd_write_com(0x0f);            //设置光标为闪烁
                   //        temp=(miao)/10*16+(miao)%10;    //秒数据写入DS1302
                           //write_1302(0x8e,0x00);
                           //write_1302(0x80,0x80|temp);//miao
                    //write_1302(0x8e,0x80);
                           break;
        case 2:  lcd_write_com(yh+4);             //按2次fen位置显示光标
                       
                     lcd_write_com(0x0f);
                        break;
        case 3: lcd_write_com(yh+5);               //按动3次,shi
                     lcd_write_com(0x0f);
                        break;
        case 4: lcd_write_com(yh+12);           //按动4次,week
                     lcd_write_com(0x0f);
                        break;
        case 5: lcd_write_com(yh+13);           //按动5次,ri
                     lcd_write_com(0x0f);
                        break;
        case 6: lcd_write_com(yh+14);           //按动6次,yue
                     lcd_write_com(0x0f);
                        break;
       
               
        case 7:
                        lcd_write_com(0x0c);             //按动到第8次,设置光标不闪烁
                                                                                       
                       
            }

          }

        }
//------------------------------加键key2----------------------------               
        if(key1n!=0)                     //当key1按下以下。再按以下键才有效(按键次数不等于零)
        {

        if(key2==0)                     //上调键
        {
        delay(10);
        if(key2==0)
        {
    buzzer=0;                      //蜂鸣器短响一次
    delay(20);
    buzzer=1;
        while(!key2);
        switch(key1n)
        {
        case 1:b1++;                  //设置键按动1次,调秒
                if(b1==10)
                        b1=0;           
                        lcd_write_data(table1[b1]);   
                       
                        //write_1602com(0x0b);
                        break;
       
        case 2:b2++;                  //设置键按动1次,调秒
                if(b2==10)
                        b2=0;           
                        lcd_write_data(table1[b2]);   
                       
                        //write_1602com(0x0b);
                        break;
        case 3:b3++;                  //设置键按动1次,调秒
                if(b3==10)
                        b3=0;           
                        lcd_write_data(table1[b3]);   
                               
                                //write_1602com(0x0b);
                        break;
                       
        case 4:b4++;                  //设置键按动1次,调秒
                        if(b4==10)
                                b4=0;           
                                lcd_write_data(table1[b4]);   
                               
                                //write_1602com(0x0b);
                                break;
        case 5:b5++;                  //设置键按动1次,调秒
                        if(b5==10)
                                b5=0;           
                                lcd_write_data(table1[b5]);   
                               
                                //write_1602com(0x0b);
                                break;
        case 6:b6++;                  //设置键按动1次,调秒
                        if(b6==10)
                                b6=0;           
                                lcd_write_data(table1[b6]);   
                               
                                //write_1602com(0x0b);
                                break;
              }

          }

        }
        //------------------减键key3,各句功能参照'加键'注释---------------
        if(key3==0)
        {
        delay(10);                        //调延时,消抖动
        if(key3==0)
        {
    buzzer=0;                        //蜂鸣器短响一次
    delay(20);
    buzzer=1;
        while(!key3);
        switch(key1n)
        {
                case 1:b1--;                  //设置键按动1次,调秒
                if(b1==-1)
                        b1=9;           
                        lcd_write_data(b1);   
                       
                        //write_1602com(0x0b);
                        break;
       
        case 2:b2--;                  //设置键按动1次,调秒
                if(b2==-1)
                        b2=9;           
                        lcd_write_data(b2);   
                       
                        //write_1602com(0x0b);
                        break;
        case 3:b3--;                  //设置键按动1次,调秒
                if(b3==-1)
                        b3=9;           
                        lcd_write_data(b3);   
                               
                                //write_1602com(0x0b);
                        break;
                       
        case 4:b4--;                  //设置键按动1次,调秒
                        if(b4==-1)
                                b4=9;           
                                lcd_write_data(b4);   
                               
                                //write_1602com(0x0b);
                                break;
        case 5:b5--;                  //设置键按动1次,调秒
                        if(b5==-1)
                                b5=9;           
                                lcd_write_data(b5);   
                               
                                //write_1602com(0x0b);
                                break;
        case 6:b6--;                  //设置键按动1次,调秒
                        if(b6==-1)
                                b6=9;           
                                lcd_write_data(b6);   
                               
                                //write_1602com(0x0b);
                                break;
                               
           }

         }
   }

        }

}
//------------------------------------------------
//------------主程序-----------
void main()
{
        lcd_init();
        delay(5);
        TMOD=0x19;
        EA=1;                        //开总中断
        TR0=1;                        //启动定时器
        EX0=1;                        //开外部中断
        IT0=1;                        //设置为下降沿中断方式
        while(1)
        {
                HC05_Init();
                distance_convert(distance);
                lcd_print(0x00,table,16);
                lcd_print(0x40,temp_dis,16);
        }
}
//外部中断0
void int0() interrupt 0
{
        t=(TH0*256+TL0);        //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
        TH0=0;
        TL0=0;
}


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

使用道具 举报

沙发
ID:65341 发表于 2014-9-8 11:30 | 只看该作者
按键的原理图?
回复

使用道具 举报

板凳
ID:65824 发表于 2014-9-8 12:03 | 只看该作者
独立按键   连接在3.5 3.6 3.7
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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