求51单片机高手给我看看这个程序错在哪里
程序输入后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);
}
}
}
}
}