微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求51单片机高手给我看看这个程序错在哪里

求51单片机高手给我看看这个程序错在哪里

时间:10-02 整理:3721RD 点击:

程序输入后1602啥显示也没有,位的定义是对的。本人是单片机初学者,希望各位高手能帮我解决问题,谢谢了。
程序实现功能1602显示时分秒年月日星期附带温度传感:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit shuzhi=P2^6;
sbit duxie=P2^5;                                   
sbit shineng=P2^7;
sbit ds=P3^7;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit beep=P1^5;
uint nian;
uchar yue,ri,shi,fen,miao,num,num1,num2,flag;
uchar code tab_yue[]={31,28,31,30,31,30,31,31,30,31,30,31};
uchar code xingqi[7][3]={"MON","TUE","WEN","THU","FRI","SAT","SUN"};        
uint wd;
float f_wd;
void delay(uint xms)             //延时
{
uint i,j;
for(i=xms;i>0;i--)
     for(j=100;j>0;j--);
}
void di()             //蜂鸣
{
beep=0;
delay(100);
beep=1;
}
void dshq()               //定时器初始化
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}

void fun_xiezhi(uchar a)
{
shineng=0;
shuzhi=0;
delay(1);
duxie=0;
delay(1);
P0=a;
delay(5);
shineng=1;
delay(5);
shineng=0;
delay(5);
}
void fun_xieshu(uchar b)
{  
shineng=0;
shuzhi=1;
delay(1);
duxie=0;
delay(1);
P0=b;
delay(5);
shineng=1;
delay(5);
shineng=0;
delay(5);
}
void fun_1602()              //1602初始化
{
fun_xiezhi(0x38);
fun_xiezhi(0x0c);
fun_xiezhi(0x06);
fun_xiezhi(0x01);
shineng=0;
}
void fun_displayxq(uchar d)          //1602显示星期
{
fun_xiezhi(0x80+12);
fun_xieshu(xingqi[d][0]);
fun_xieshu(xingqi[d][1]);
fun_xieshu(xingqi[d][2]);
}
void fun_displaysfm(uchar address1,uchar dat1)          //1602显示时分秒
{
uchar si,ge;
si=dat1/10;
ge=dat1%10;
fun_xiezhi(0x80+0x40+address1);
fun_xieshu(si);
fun_xieshu(ge);
}
void fun_displayn(uint g)
{
     uchar qian,bai,si,ge;
     qian=g/1000;
     bai=g%1000/100;
     si=g%1000%100/10;
     ge=g%1000%100%10;
     fun_xiezhi(0x80+1);
     fun_xieshu(qian);
     fun_xieshu(bai);
     fun_xieshu(si);
     fun_xieshu(ge);

}
void fun_displaynyr(uchar address2,uchar dat2)              //1602显示年月日
{

      uchar ge,shi;
     shi=dat2/10;
     ge=dat2%10;
     fun_xiezhi(0x80+address2);
     fun_xieshu(shi);
     fun_xieshu(ge);
   
}
uchar fun1()
{
if(yue=2&&((nian%4==0&&nian%100!=0)||nian%400==0))
     return 29;
else
     {
      return tab_yue[yue-1];
    }
}
void nyr()
{
if(flag==1)
     {
     flag=0;
     ri++;
     if(yue==2)
         {
          if((nian%4==0&&nian%100!=0)||nian%400==0)
              if(ri>29)
                {
                ri=1;
                yue++;
                fun_displaynyr(6,yue);
                }
          else
              if(ri>28)
                {
                ri=1;
                yue++;
                fun_displaynyr(6,yue);
                }
        }
     else
         {
         if(ri>tab_yue[yue-1])
             ri=1;
            yue++;
            if(yue>12)
                {
                 yue=1;
                 nian++;
                 fun_displayn(nian);
                }
            fun_displaynyr(6,yue);
        }
    fun_displaynyr(9,ri);
    }                                       
     
}
void keyscan()       //按键检测
{
  if(key1==0)
  {
   delay(5);
   if(key1==0)
       {
     num2++;
     while(key1==0);
     di();
     if(num2==1)
         {
         TR0=0;
         fun_xiezhi(0x80+0x40+9);
         fun_xiezhi(0x0f);
        }
     if(num2==2)
         {
         fun_xiezhi(0x80+0x40+6);
        }
     if(num2==3)
         {
         fun_xiezhi(0x80+0x40+3);
        }
     if(num2==4)
         {
         fun_xiezhi(0x80+4);
        }
     if(num2==5)
         {
         fun_xiezhi(0x80+7);
        }
     if(num2==6)
         {
         fun_xiezhi(0x80+10);
        }
     if(num2==7)
         {
         fun_xiezhi(0x80+14);
        }
     if(num2==8)
         {
         num2=0;
         fun_xiezhi(0x0c);
         TR0=1;
        }
    }
  }
if(num2!=0)
    {
     if(key2==0)
         {
         delay(5);
         if(key2==0)
             {
             while(key2==0);
             di();
             if(num2==1)
                 {
                 miao++;
                 if(miao==60)
                     miao=0;
                 fun_displaysfm(8,miao);
                 fun_xiezhi(0x80+0x40+9);
                }
             if(num2==2)
                 {
                 fen++;
                 if(fen==60)
                     fen=0;
                 fun_displaysfm(5,fen);
                 fun_xiezhi(0x80+0x40+6);
                }
             if(num2==3)
                 {
                 shi++;
                 if(shi==24)
                     shi=0;
                 fun_displaysfm(2,shi);
                 fun_xiezhi(0x80+0x40+3);
                }
             if(num2==4)
                 {
                 nian++;
                 fun_displayn(nian);
                 fun_xiezhi(0x80+4);
                }
             if(num2==5)
                 {
                 yue++;
                 if(yue==13)
                     yue=1;
                 fun_displaysfm(6,yue);
                 fun_xiezhi(0x80+7);
                }
            if(num2==6)
                 {
                 ri++;
                 if(ri>fun1())
                     ri=1;
                 fun_displaysfm(9,ri);
                 fun_xiezhi(0x80+10);
                }
            if(num2==7)
                 {
                 num1++;
                 if(num1==7)
                     num1=0;
                 fun_displayxq(num1);
                 fun_xiezhi(0x80+14);
                }
            }
        }
     if(key3==0)
         {
         delay(5);
         if(key3==0)
             {
             while(key3==0);
             di();
             if(num2==1)
                 {
                 if(miao==0)
                     miao=60;
                 miao--;
                 fun_displaysfm(8,miao);
                 fun_xiezhi(0x80+0x40+9);
                }
             if(num2==2)
                 {
                 if(fen==0)
                     fen=60;
                 fen--;
                 fun_displaysfm(5,fen);
                 fun_xiezhi(0x80+0x40+6);
                }
             if(num2==3)
                 {
                 if(shi==0)
                     shi=24;
                 shi--;
                 fun_displaysfm(2,shi);
                 fun_xiezhi(0x80+0x40+3);
                }
             if(num2==4)
                 {
                 nian--;
                 fun_displayn(nian);
                 fun_xiezhi(0x80+4);
                }
             if(num2==5)
                 {
                 if(yue==1)
                     yue=13;
                 yue--;
                 fun_displaysfm(6,yue);
                 fun_xiezhi(0x80+7);
                }
            if(num2==6)
                 {
                 if(ri==1)
                     ri=fun1()+1;
                 ri--;
                 fun_displaysfm(9,ri);
                 fun_xiezhi(0x80+10);
                }
            if(num2==7)
                 {
                 if(num1==0)
                     shi=7;
                 num1--;
                 fun_displayxq(num1);
                 fun_xiezhi(0x80+14);
                }
            }
        }
    }
}
void dsreset()   //DS18B20初始化
{
  uint i;
  ds=0;
  i=80;while(i>0)i--;
  ds=1;
  i=4;while(i>0)i--;
}
void writezj(uchar e)        //DS18B20写字节函数
{
  bit wei;
  uchar i;
  uint j;
  for(i=1;i<=8;i++)
      {
      wei=e&0x01;
      e=e>>1;
      if(wei)
          {
          ds=0;
          _nop_();_nop_();
          ds=1;
          j=8;while(j>0)j--;
        }
      else
          {
          ds=0;
          j=8;while(j>0)j--;
          ds=1;
          _nop_();_nop_();
        }
    }
}
uchar readzj()                 //DS18B20读字节函数
{
  uchar i,j,k,h,dat;
  bit wei;
  for(i=0;i<8;i++)
      {
      ds=0;
      h++;
      ds=1;h++;h++;
      wei=ds;
      j=8;while(j>=0)j--;
      k=wei;
      dat=(dat>>1)|(k<<7);
    }
  return dat;
}
void tempchange()     //温度转换
{
  dsreset();
  delay(1);
  writezj(0xcc);
  writezj(0x44);
}
uint gettemp()         //获取温度
{
  uchar a,b;
  tempchange();
  delay(1);
  writezj(0xcc);
  writezj(0xbe);
  a=readzj();
  b=readzj();
  wd=b;
  wd=wd<<8;
  wd=wd|a;
  f_wd=wd*0.0625;
  wd=f_wd+0.5;
  f_wd=f_wd+0.05;
  return wd;
}
void dealdis_wd(uint f)         //温度处理显示
{
  uchar shi,ge;
  shi=f/10;
  ge=f%10;
  fun_xiezhi(0x80+0x40+11);
  delay(5);
  fun_xieshu(shi);
  delay(5);
  fun_xieshu(ge);
  delay(5);
  fun_xieshu(0xdf);
  delay(5);
  fun_xieshu('C');
  delay(5);
}
void mian()
{
  uchar h;
  nian=2010;yue=1;ri=1;shi=0;fen=0;miao=0;num1=4;
  dshq();
  fun_1602();
  delay(20);
  fun_displayn(nian);
  delay(1);
  fun_displaynyr(6,yue);
  delay(1);
  fun_displaynyr(9,ri);
  delay(1);
  fun_displayxq(num1);
  delay(1);
  fun_displaysfm(2,shi);
  delay(1);
  fun_displaysfm(5,fen);
  delay(1);
  fun_displaysfm(8,miao);
  delay(1);
  fun_xiezhi(0x80+5);
  fun_xieshu('-');
  delay(1);
  fun_xiezhi(0x80+8);
  fun_xieshu('-');
  delay(1);
  fun_xiezhi(0x80+0x40+4);
  fun_xieshu(':');
  delay(1);
  fun_xiezhi(0x80+0x40+7);
  fun_xieshu(':');
  delay(1);
  
  while(1)
   {
     tempchange();
     for(h=10;h>0;h--)
         {
           dealdis_wd(gettemp());
        }
     keyscan();
     nyr();
     fun_displayxq(num1);
     for(h=10;h>0;h--)
         {
           dealdis_wd(gettemp());
        }
   
   }
}

void T0_time() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++;
if(num==20)
     {
     num=0;
     miao++;
     if(miao==60)
         {
         miao=0;
         fen++;
         if(fen==60)
             {
             fen=0;
             shi++;
             if(shi==24)
                    {
                     shi=0;
                     flag=1;
                     num1++;
                     if(num1==7)
                         num1=0;
                    }
             fun_displaysfm(2,shi);
            }
        fun_displaysfm(5,fen);
        }
     fun_displaysfm(8,miao);        
    }
}

看看软件的定义和硬件时不是匹配

你用的啥单片机?普通51的话P0口做数据线用有没有加上拉电阻

烧一个能用的1602程序测试一下液晶显示正常吗,如果不正常,看一下硬件接线正确吗?再有有时1602液晶的对比度接零还是接VCC,也会造成液晶无显示;如果硬件没问题,就看看程序中1602的读写时序对不对,1602是慢响应器件,初始化延时设长一些。

我用的是STC90C51,是用的单片机学习板,P0口加了上拉电阻,我用1602能正常显示我另外一个时钟程序

我查了硬件都是正常的,我用另外一个我写的时钟程序能正常显示,那个1602读写指令也是对的吧,但是就是不能正常显示,希望你能仔细读读我这程序帮我找到错误所在,如果你有实验板的话下到你板上试试看,逻辑上我确实找不出错误啊

是匹配的。

搞不懂


void mian()//void main这里错了,你改一下再试试!
{
  uchar h;
  nian=2010;yue=1;ri=1;shi=0;fen=0;miao=0;num1=4;
  dshq();
  fun_1602();
  delay(20);
  fun_displayn(nian);
  delay(1);
  fun_displaynyr(6,yue);
  delay(1);
  fun_displaynyr(9,ri);
  delay(1);
  fun_displayxq(num1);
  delay(1);
  fun_displaysfm(2,shi);
  delay(1);
  fun_displaysfm(5,fen);
  delay(1);
  fun_displaysfm(8,miao);
  delay(1);
  fun_xiezhi(0x80+5);
  fun_xieshu('-');
  delay(1);
  fun_xiezhi(0x80+8);
  fun_xieshu('-');
  delay(1);
  fun_xiezhi(0x80+0x40+4);
  fun_xieshu(':');
  delay(1);
  fun_xiezhi(0x80+0x40+7);
  fun_xieshu(':');
  delay(1);

具体怎么改,求指教。

你的程序中没有主程序,main拼错了

C语言必须有一个主函数main(),程序由主函数开始执行!

没想到自己把main给拼错了
非常感谢啊,这个错误我和我同学找了几天都没发现
另外下面这段程序中要把要显示的数字(qian,bai,shi,ge)前面加上0x30如:fun_xieshu(0x30+ge);才能正常显示。但是我把这些都改过来之后,程序还是有很大的问题,一是温度模块不能显示,二是按键检测模块没有反应(年月日时分秒星期显示正常)。然后我将程序中的温度模块全删掉后,在输入单片机后,这时1602显示中最后一位也就是秒位显示乱码,但这个时候按键检测有效只是按按键时光标显示的位置不对。不知道是程序哪里出现了问题啊。前几天也写了一个时钟程序,不带温度,也是最后一位显示乱码,其他都正常。我估计温度模块肯定有问题,由于又有乱码现象其他模块可能也有点小问题,希望你能仔细帮我分析分析,自己的能力太有限了。再就是非常感谢你帮我找出了那个低级而致命的错误啊,谢谢啦。
void fun_displaysfm(uchar address1,uchar dat1)          //1602显示时分秒
{
uchar si,ge;
si=dat1/10;
ge=dat1%10;
fun_xiezhi(0x80+0x40+address1);
fun_xieshu(si);
fun_xieshu(ge);
}
void fun_displayn(uint g)
{
     uchar qian,bai,si,ge;
     qian=g/1000;
     bai=g%1000/100;
     si=g%1000%100/10;
     ge=g%1000%100%10;
     fun_xiezhi(0x80+1);
     fun_xieshu(qian);
     fun_xieshu(bai);
     fun_xieshu(si);
     fun_xieshu(ge);

}
void fun_displaynyr(uchar address2,uchar dat2)              //1602显示年月日
{

      uchar ge,shi;
     shi=dat2/10;
     ge=dat2%10;
     fun_xiezhi(0x80+address2);
     fun_xieshu(shi);
     fun_xieshu(ge);
   
}

你的秒位的1602显示地址是不是超出显示地址为了?

我的秒位是在0x80+0x40+8没有超出显示地址啊

只为e币

只为e币

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。 ·秒位乱码,可能与定时中断有关,也可能与秒对应的字库代码超出了0x30-0x39了
void dsreset()   //DS18B20初始化
{
  uint i;
  ds=0;
  i=80;while(i>0)i--; //下拉时间太短 大约450us 左右延时不准
  ds=1;
  i=4;while(i>0)i--;//大约15us 左右
}
在有温度设变量时,尽量少用浮点变量;
希望以上对你有帮助

来学习了

调试时发现:

main中加P1=0xff
void keyscan()       //按键检测
{
  if(key1==0)
  {
   delay(2);
   if(key1==0)
       {
     num2++;
     while(key1==0);
     di();
     if(num2==1)
         {
         TR0=0;
         fun_xiezhi(0x80+0x40+9);
         fun_xiezhi(0x0f);
        }
     if(num2==2)
         {
         fun_xiezhi(0x80+0x40+6);
        }
     if(num2==3)
         {
         fun_xiezhi(0x80+0x40+3);
        }
     if(num2==4)
         {
         fun_xiezhi(0x80+4);
        }
     if(num2==5)
         {
         fun_xiezhi(0x80+7);
        }
     if(num2==6)
         {
         fun_xiezhi(0x80+10);
        }
     if(num2==7)
         {
         fun_xiezhi(0x80+14);
        }
     if(num2==8)
         {
         num2=0;
         fun_xiezhi(0x0c);
         TR0=1;
        }
    }
  }
if(num2!=0)
    {
     if(key2==0)
         {
         delay(5);
         if(key2==0)
             {
             while(key2==0);
             di();
             if(num2==1)
                 {
                 miao++;
                 if(miao==60)
                     miao=0;
                 fun_displaysfm(8,miao);
                 fun_xiezhi(0x80+0x40+9);
                }
             if(num2==2)
                 {
                 fen++;
                 if(fen==60)
                     fen=0;
                 fun_displaysfm(5,fen);
                 fun_xiezhi(0x80+0x40+6);
                }
             if(num2==3)
                 {
                 shi++;
                 if(shi==24)
                     shi=0;
                 fun_displaysfm(2,shi);
                 fun_xiezhi(0x80+0x40+3);
                }
             if(num2==4)
                 {
                 nian++;
                 fun_displayn(nian);
                 fun_xiezhi(0x80+4);
                }
             if(num2==5)
                 {
                 yue++;
                 if(yue==13)
                     yue=1;
                 fun_displaynyr(6,yue);
                 fun_xiezhi(0x80+7);
                }
            if(num2==6)
                 {
                 ri++;
                 if(ri>fun1())
                     ri=1;
                 fun_displaynyr(9,ri);
                 fun_xiezhi(0x80+10);
                }
            if(num2==7)
                 {
                 num1++;
                 if(num1==7)
                     num1=0;
                 fun_displayxq(num1);
                 fun_xiezhi(0x80+14);
                }
            }
        }
     if(key3==0)
         {
         delay(5);
         if(key3==0)
             {
             while(key3==0);
             di();
             if(num2==1)
                 {
                 if(miao==0)
                     miao=60;
                 miao--;
                 fun_displaysfm(8,miao);
                 fun_xiezhi(0x80+0x40+9);
                }
             if(num2==2)
                 {
                 if(fen==0)
                     fen=60;
                 fen--;
                 fun_displaysfm(5,fen);
                 fun_xiezhi(0x80+0x40+6);
                }
             if(num2==3)
                 {
                 if(shi==0)
                     shi=24;
                 shi--;
                 fun_displaysfm(2,shi);
                 fun_xiezhi(0x80+0x40+3);
                }
             if(num2==4)
                 {
                 nian--;
                 fun_displayn(nian);
                 fun_xiezhi(0x80+4);
                }
             if(num2==5)
                 {
                 if(yue==1)
                     yue=13;
                 yue--;
                 fun_displaynyr(6,yue);
                 fun_xiezhi(0x80+7);
                }
            if(num2==6)
                 {
                 if(ri==1)
                     ri=fun1()+1;
                 ri--;
                 fun_displaynyr(9,ri);
                 fun_xiezhi(0x80+10);
                }
            if(num2==7)
                 {
                 if(num1==0)
                     shi=7;
                 num1--;
                 fun_displayxq(num1);
                 fun_xiezhi(0x80+14);
                }
            }
        }
    }
}

上一篇:大学四年(转载)
下一篇:1302驱动代码

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top