我做了一个电子钟出现了乱码在仿真中没有问题
本帖最后由 niaiwma003 于 2012-9-8 17:12 编辑我做了一个数码管电子钟出现了乱码,21个数码管统一跳乱码,乱码也看不清楚,下面是电路图,在仿真中没有问题请大哥帮我看一下程序,程序那里有问题了帮我修一下,我个大哥磕头了,我万辈感谢。
#include<reg52.h>
#include<intrins.h>
//#include<key.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P3^0;
sbit A=P0^0;
sbit b=P0^1;
sbit C=P0^2;
sbit D=P0^3;
sbit E=P0^4;
sbit H=P0^5;
sbit S=P0^6;
sbit X=P0^7;
sbit SCLK=P3^1; //DS1302通讯线定义
sbit DIO=P3^2;
sbit RST=P3^3;
sbit dq=P3^4;
sbit k1=P3^5;
sbit k2=P3^6;
sbit k3=P3^7;
sbit k4=P3^0;
sbit speak=P0^0;
uchar code smgw[]={0,1,2,3,4,5,6,7};
uchar code smgd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchartab1;
uchartab2;
uchar nian,yue,ri,zhou,shi,fen,miao,nnian,nyue,nri,wen,a,shan,tt,shan;
uchar knum,k_d_s;
uchar year,month,day;
uchar sw,gw;
uchar tplsb,tpmsb;
uchar codeyear_code[]=
{
0x4d,0x4A,0xB8,//2001
0x0d,0x4A,0x4C,//2002
0x0d,0xA5,0x41,//2003
0x25,0xAA,0xB6,//2004
0x05,0x6A,0x49,//2005
0x7A,0xAd,0xBd,//2006
0x02,0x5d,0x52,//2007
0x09,0x2d,0x47,//2008
0x5C,0x95,0xBA,//2009
0x0A,0x95,0x4e,//2010
0x0B,0x4A,0x43,//2011
0x4B,0x55,0x37,//2012
0x0A,0xd5,0x4A,//2013
0x95,0x5A,0xBf,//2014
0x04,0xBA,0x53,//2015
0x0A,0x5B,0x48,//2016
0x65,0x2B,0xBC,//2017
0x05,0x2B,0x50,//2018
0x0A,0x93,0x45,//2019
0x47,0x4A,0xB9,//2020
0x06,0xAA,0x4C,//2021
0x0A,0xd5,0x41,//2022
0x24,0xdA,0xB6,//2023
0x04,0xB6,0x4A,//2024
0x69,0x57,0x3d,//2025
0x0A,0x4e,0x51,//2026
0x0d,0x26,0x46,//2027
0x5e,0x93,0x3A,//2028
0x0d,0x53,0x4d,//2029
0x05,0xAA,0x43,//2030
0x36,0xB5,0x37,//2031
0x09,0x6d,0x4B,//2032
0xB4,0xAe,0xBf,//2033
0x04,0xAd,0x53,//2034
0x0A,0x4d,0x48,//2035
0x6d,0x25,0xBC,//2036
0x0d,0x25,0x4f,//2037
0x0d,0x52,0x44,//2038
0x5d,0xAA,0x38,//2039
0x0B,0x5A,0x4C,//2040
0x05,0x6d,0x41,//2041
0x24,0xAd,0xB6,//2042
0x04,0x9B,0x4A,//2043
0x7A,0x4B,0xBe,//2044
0x0A,0x4B,0x51,//2045
0x0A,0xA5,0x46,//2046
0x5B,0x52,0xBA,//2047
0x06,0xd2,0x4e,//2048
0x0A,0xdA,0x42,//2049
0x35,0x5B,0x37,//2050
0x09,0x37,0x4B,//2051
0x84,0x97,0xC1,//2052
0x04,0x97,0x53,//2053
0x06,0x4B,0x48,//2054
0x66,0xA5,0x3C,//2055
0x0e,0xA5,0x4f,//2056
0x06,0xB2,0x44,//2057
0x4A,0xB6,0x38,//2058
0x0A,0xAe,0x4C,//2059
0x09,0x2e,0x42,//2060
0x3C,0x97,0x35,//2061
0x0C,0x96,0x49,//2062
0x7d,0x4A,0xBd,//2063
0x0d,0x4A,0x51,//2064
0x0d,0xA5,0x45,//2065
0x55,0xAA,0xBA,//2066
0x05,0x6A,0x4e,//2067
0x0A,0x6d,0x43,//2068
0x45,0x2e,0xB7,//2069
0x05,0x2d,0x4B,//2070
0x8A,0x95,0xBf,//2071
0x0A,0x95,0x53,//2072
0x0B,0x4A,0x47,//2073
0x6B,0x55,0x3B,//2074
0x0A,0xd5,0x4f,//2075
0x05,0x5A,0x45,//2076
0x4A,0x5d,0x38,//2077
0x0A,0x5B,0x4C,//2078
0x05,0x2B,0x42,//2079
0x3A,0x93,0xB6,//2080
0x06,0x93,0x49,//2081
0x77,0x29,0xBd,//2082
0x06,0xAA,0x51,//2083
0x0A,0xd5,0x46,//2084
0x54,0xdA,0xBA,//2085
0x04,0xB6,0x4e,//2086
0x0A,0x57,0x43,//2087
0x45,0x27,0x38,//2088
0x0d,0x26,0x4A,//2089
0x8e,0x93,0x3e,//2090
0x0d,0x52,0x52,//2091
0x0d,0xAA,0x47,//2092
0x66,0xB5,0x3B,//2093
0x05,0x6d,0x4f,//2094
0x04,0xAe,0x45,//2095
0x4A,0x4e,0xB9,//2096
0x0A,0x4d,0x4C,//2097
0x0d,0x15,0x41,//2098
0x2d,0x92,0xB5,//2099
};
uchar codeday_code1={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
uint codeday_code2={0x111,0x130,0x14e};
ucharcodetable_week={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=60;y>0;y--);
}
void write(uchar date) //写入DS1302一个字节
{
uchar temp,i;
RST=1;
SCLK=0;
temp=date;
for(i=0;i<8;i++)
{
SCLK=0;
if(temp&0x01)
DIO=1;
else
DIO=0;
SCLK=1;
temp>>=1;
}
}
uchar read() //读出DS1302一个字节
{
uchar a,temp;
RST=1;
for(a=8;a>0;a--)
{
temp>>=1;
SCLK=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SCLK=0;
if(DIO)
{
temp=temp|0x80;
}
else
{
temp=temp|0x00;
}
}
return (temp);
}
void write_1302(uchar add,uchar dat)//写DS1302数据
{
RST=0;
SCLK=0;
RST=1;
write(add);
write(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add) //读DS1302数据
{
uchar dat1,dat2;
RST=0;
SCLK=0;
RST=1;
write(add);
dat1=read();
SCLK=1;
RST=0;
dat1=ACC; ///?????
dat2=dat1/16; //数据进制转换
dat1=dat1%16; //十六进制转十进制
dat1=dat1+dat2*10;
return(dat1);
}
void ds1302_init() //1302初始化
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00); //允许写入
/* write_1302(0x84,0x00); //24小时制
write_1302(0x80,0x00);//设置初始值SEC
write_1302(0x82,0x59);//设置初始值MIN
write_1302(0x84,0x23);//设置初始值HR
write_1302(0x86,0x26);//设置初始值DATE
write_1302(0x88,0x04);//设置初始值MONTH
write_1302(0x8A,0x03);//设置初始值DAY
write_1302(0x8C,0x09);//设置初始值YEAR
*/
write_1302(0x90,0xa5);//启动充电功能
write_1302(0x8e,0x80);
}
void Converweek()
{
uchar temp2;
year =nian&0x7f; //加载年月日数据,如为BCD则需转为十进制
month=yue;
day =ri;
year+=100;
temp2=year+year/0x4;
temp2=temp2%0x7;
temp2=temp2+day+table_week;
if (year%0x4==0&&month<3)temp2-=1;
zhou=temp2%0x7;
if(zhou==0)
zhou=8;
// return week_dat;
}
bit get_moon_day(uchar month_p,uint table_addr)
{
switch (month_p)
{
case 1: {if((year_code&0x08)==0) return(0);else return(1);}
case 2: {if((year_code&0x04)==0) return(0);else return(1);}
case 3: {if((year_code&0x02)==0) return(0);else return(1);}
case 4: {if((year_code&0x01)==0) return(0);else return(1);}
case 5: {if((year_code&0x80)==0) return(0);else return(1);}
case 6: {if((year_code&0x40)==0) return(0);else return(1);}
case 7: {if((year_code&0x20)==0) return(0);else return(1);}
case 8: {if((year_code&0x10)==0) return(0);else return(1);}
case 9: {if((year_code&0x08)==0) return(0);else return(1);}
case 10: {if((year_code&0x04)==0) return(0);else return(1);}
case 11: {if((year_code&0x02)==0) return(0);else return(1);}
case 12: {if((year_code&0x01)==0) return(0);else return(1);}
case 13: {if((year_code&0x80)==0) return(0);else return(1);}
}
}
voidConversion()
{
uchartemp1,temp2,temp3,month_p;
uinttemp4,table_addr;
// uint dat_return,dat_buffer;
bitflag_y;
year =nian&0x7f; //加载年月日数据,如为BCD则需转为十进制
month=yue;
day =ri;
table_addr=(year-1)*3;
temp1=year_code&0x60;
temp1=_cror_(temp1,5);
temp2=year_code&0x1f;
if(temp1==0x1)
{
temp3=temp2-1;
}
else
{
temp3=temp2+0x1f-1;
}
if (month<10)
{
temp4=day_code1+day-1;
}
else
{
temp4=day_code2+day-1;
}
if ((month>0x2)&&(year%0x4==0))
{
temp4+=1;
}
if (temp4>=temp3)
{
temp4-=temp3;
month=0x1;
month_p=0x1;
flag_y=0;
if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;
else temp1=0x1e;
temp2=year_code/16;
while(temp4>=temp1)
{
temp4-=temp1;
month_p+=1;
if(month==temp2)
{
flag_y=~flag_y;
if(flag_y==0)month+=1;
}
else month+=1;
if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else
{
temp3-=temp4;
year-=1;
table_addr-=0x3;
month=0xc;
temp2=year_code/16;
if (temp2==0)month_p=0xc;
else month_p=0xd;
flag_y=0;
if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;
else temp1=0x1e;
while(temp3>temp1)
{
temp3-=temp1;
month_p-=1;
if(flag_y==0)month-=1;
if(month==temp2)flag_y=~flag_y;
if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp1-temp3+1;
}
nnian= year|(nian&0x80);; //将农历信息写进指定变量
nyue = month;
nri = day;
Converweek();
/* dat_buffer=0;
dat_return=0;
dat_buffer=(uint)year;
dat_buffer<<=9;
dat_return|=dat_buffer;
dat_buffer=(uint)month;
dat_buffer<<=5;
dat_return|=dat_buffer;
dat_return|=(uint)day; */
//return dat_return;
}
/*********************************
************18B20****************
*********************************/
//DS18B20
void delayms(uchar count) //延时count ms子程序
{
uchar i,j;
do
{
for(i=5;i>0;i--)
for(j=98;j>0;j--);
}while(--count);
}
//延时us
void delayus(uchar us)
{
while(us--);
}
//产生900US复位脉冲,初始化18b20
void init18b20()
{
dq=0; //
delayus(100);
dq=1; //产生上升沿后延时15~60us
while(~dq);
delayus(8); //拉低总线60~240us产生应答脉冲
}
//读数据的一位
bit rdbit(void)
{
bit b;
dq=0;
_nop_();
_nop_(); //保持低至少1us
dq=1;
_nop_(); //延时15us以上读时序下降沿后15us 18b20输出属有效
_nop_();
b=dq;
delayus(8); //读时序不低于60us
return (b);
}
//读取数据的一个字节
uchar rdbyte(void)
{
uchar i,j,b;
b=0;
for(i=1;i<=8;i++)
{
j=rdbit();
b=(j<<7)|(b>>1);//接收到的数据从最高为往下移
}
return(b);
}
//写数据的一字解
void wrbyte(uchar b)
{
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp=b&0x01;
b=b>>1;
if(btmp)//写1
{
dq=0;
_nop_();
_nop_();
dq=1;
delayus(8);//读时隙不低于60us
}
else
{
dq=0;//写0
delayus(8);//读时隙不低于60us
dq=1;
_nop_();
_nop_();
}
}
}
//启动温度转换
/*void convert(void)
{
init18b20();
delayms(1);
wrbyte(0xcc);//此命令用于但挂接总线系统 无须提供64为ROM序列号;跳过ROM
wrbyte(0x44);//开始温度转换
}
*/
//读取温度
void rdtemp(void)
{
init18b20();
delayms(1);
wrbyte(0xcc);//此命令用于但挂接总线系统 无须提供64为ROM序列号;跳过ROM
wrbyte(0x44);//开始温度转换
init18b20();
delayms(1);
wrbyte(0xcc);//此命令用于但挂接总线系统 无须提供64为ROM序列号;跳过ROM
wrbyte(0xbe);//此命令读取暂存器内容
tplsb=rdbyte();//温度低8为,其中低四位为小数位
tpmsb=rdbyte();//温度高8位,其中高5位为符号位
tplsb >>= 4;
tpmsb <<= 4;
gw=tplsb | tpmsb;
if(gw & 0x80)
{
sw=10;
gw=~gw+1;
}
else
{
sw=11;
}
}
void display()
{
miao=read_1302(0x81); //读秒
fen=read_1302(0x83); //读分
shi=read_1302(0x85);//&0x3f;//读时
ri=read_1302(0x87); //读日
yue=read_1302(0x89); //读月
nian=read_1302(0x8d); //读年
// zhou=read_1302(0x8B); //读星期
rdtemp();
Conversion();
Converweek();
D=0;E=0;H=1; //位选
A=0;b=0;C=0;
P2=smgd;
delay(1);
A=1;b=0;C=0;
P2=smgd;
delay(1);
A=0;b=1;C=0;
P2=smgd;
delay(1);
A=1;b=1;C=0;
P2=smgd;
delay(1);
A=0;b=0;C=1;
P2=smgd;
delay(1);
A=1;b=0;C=1;
P2=smgd;
delay(1);
D=1;
E=0;
H=0;
if(knum==6)
{
A=0;b=0;C=0;
P2=0x5b&shan;
delay(1);
A=1;b=0;C=0;
P2=0x3f&shan;
delay(1);
A=0;b=1;C=0;
P2=smgd&shan;
delay(1);
A=1;b=1;C=0;
P2=smgd&shan;
delay(1);
}
else
{
A=0;b=0;C=0;
P2=0x5b;
delay(1);
A=1;b=0;C=0;
P2=0x3f;
delay(1);
A=0;b=1;C=0;
P2=smgd;
delay(1);
A=1;b=1;C=0;
P2=smgd;
delay(1);
}
if(knum==5)
{
A=0;b=0;C=1; // 月
P2=smgd&shan;
delay(1);
A=1;b=0;C=1;
P2=smgd&shan;
delay(1);
}
else
{
A=0;b=0;C=1; // 月
P2=smgd;
delay(1);
A=1;b=0;C=1;
P2=smgd;
delay(1);
}
//周
{
A=0;b=1;C=1; // 星期
P2=smgd;
delay(1);
}
D=0;
E=1;
H=0;
if(knum==4)
{
A=0;b=0;C=0; // 日
P2=smgd&shan;
delay(1);
A=1;b=0;C=0;
P2=smgd&shan;
delay(1);
}
else
{
A=0;b=0;C=0; // 日
P2=smgd;
delay(1);
A=1;b=0;C=0;
P2=smgd;
delay(1);
}
if(knum==3)
{
S=0;X=0;
A=0;b=1;C=0; // 时
P2=smgd&shan;
delay(1);
A=1;b=1;C=0;
P2=smgd&shan;
delay(1);
}
else
{
if(shi>12)
{
shi-=12;
S=0;X=1;
A=0;b=1;C=0; // 时
P2=smgd;
delay(1);
A=1;b=1;C=0;
P2=smgd;
delay(1);
}
else
{
S=1;X=0;
A=0;b=1;C=0; // 时
P2=smgd;
delay(1);
A=1;b=1;C=0;
P2=smgd;
delay(1);
}
}
if(knum==2)
{
A=0;b=0;C=1; // 分
P2=smgd&shan;
delay(1);
A=1;b=0;C=1;
P2=smgd&shan;
delay(1);
}
else
{
A=0;b=0;C=1; // 分
P2=smgd;
delay(1);
A=1;b=0;C=1;
P2=smgd;
delay(1);
}
if(knum==1)
{
A=0;b=1;C=1; // 秒
P2=smgd&shan;
delay(1);
A=1;b=1;C=1;
P2=smgd&shan;
// delay(1);
}
else
{
A=0;b=1;C=1; //秒
P2=smgd;
delay(1);
A=1;b=1;C=1;
P2=smgd;
// delay(1);
}
}
void key()
{ //
uchar temp;
// display();
if(k1==0)
{
delay(20);
if(k1==0)
{
while(!k1);
knum++;
if(knum==1)
{
temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,0x80|temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
}
if(knum==7)
{
knum=0;
// write_1302 (0x8e,0X00);//禁止写保护
// write_1302 (0x80,0x7f&temp); //时钟恢复
// write_1302 (0x8e,0x80);//允许写保护
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao数据写入DS1302
write_1302(0x8e,0x80);
}
}
}
if(knum!=0)
{
if(k4==0)
{
delay(20);
if(k4==0)
{
while(!k4);
// k_d_s=1;
knum=0;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao数据写入DS1302
write_1302(0x8e,0x80);
}
}
if(k2==0)
{
delay(20);
if(k2==0)
{
while(!k2);
switch(knum)
{
case 1:miao++;
if(miao==60)
miao=0;
temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
case 2:fen++;
if(fen==60)
fen=0;
temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x82,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护 }
break;
case 3:shi++;
if(shi==24)
shi=0;
temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x84,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
case 4:ri++;
switch(yue)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(ri==32)
ri=1;
break;
case 4:case 6:case 9:case 11:
if(ri==31)
ri=1;
break;
case 2:
if(nian%4==0||nian%400==0)
{
if(ri==30)
ri=1;
}
else
{
if(ri==29)
ri=1;
}
break;
}
temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x86,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
case 5:yue++;
if(yue==13)
yue=1;
temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x88,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
case 6:nian++;
if(nian==99)
nian=0;
temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x8c,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
}
}
}
if(k3==0)
{
delay(20);
if(k3==0)
{
while(!k3);
switch(knum)
{
case 1:miao--;
if(miao==-1)
miao=59;
temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
case 2:fen--;
if(fen==-1)
fen=59;
temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x82,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护 }
break;
case 3:shi--;
if(shi==-1)
shi=23;
temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x84,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
case 4:ri--;
switch(yue)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(ri==0)
ri=31;
break;
case 4:case 6:case 9:case 11:
if(ri==0)
ri=30;
break;
case 2:
if(nian%4==0||nian%400==0)
{
if(ri==0)
ri=29;
}
else
{
if(ri==0)
ri=28;
}
break;
}
temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x86,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
case 5:yue--;
if(yue==0)
yue=12;
temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x88,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
case 6:nian--;
if(nian==-1)
nian=99;
temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x8c,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
break;
}
}
}
}
}
void main()
{
ds1302_init();
init18b20();
TMOD=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
shan=0x00;
while(1)
{
key();
display();
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==9)
{
tt=0;
shan=~shan;
}
}
在1302 写 和 读命令的时候最好把中断暂时关闭 xiaoaf 发表于 2012-9-8 19:16 static/image/common/back.gif
在1302 写 和 读命令的时候最好把中断暂时关闭
我是新手,读命令的时候最好把中断暂时关闭,怎么关闭呀 ?我问的请哥不要生气,我是新手,请哥说的详细点谢谢你 {:victory:}{:victory:}{:victory:} niaiwma003 发表于 2012-9-8 20:00 static/image/common/back.gif
我是新手,读命令的时候最好把中断暂时关闭,怎么关闭呀 ?我问的请哥不要生气,我是新手,请哥说的详 ...
例如这个写字节的函数
void wrbyte(uchar b)
{
uchar j;
bit btmp;
TR0=0; //一进入把你用的定时器 先暂时关闭
for(j=1;j<=8;j++)
{
btmp=b&0x01;
b=b>>1;
if(btmp)//写1
{
dq=0;
_nop_();
_nop_();
dq=1;
delayus(8);//读时隙不低于60us
}
else
{
dq=0;//写0
delayus(8);//读时隙不低于60us
dq=1;
_nop_();
_nop_();
}
}
TR0=1;//函数退出时再开启, 防止 写和读字节的时候被中断打断
}
2楼说的没错,我遇到过这样的问题。 xiaoaf 发表于 2012-9-9 15:18 static/image/common/back.gif
例如这个写字节的函数
void wrbyte(uchar b)
{
哥还是不行呀?你的方法我试了,年月日,时分秒,还有温度都是一起跳变看不清楚是什么,是电路有问题?还是程序有问题?请哥在帮我修修,谢谢哥了 xiaoaf 发表于 2012-9-9 15:18
例如这个写字节的函数
void wrbyte(uchar b)
{
直接关EA就OK了 niaiwma003 发表于 2012-9-9 19:10 static/image/common/back.gif
哥还是不行呀?你的方法我试了,年月日,时分秒,还有温度都是一起跳变看不清楚是什么,是电路有问题?还 ...
具体是什么样的跳变? 有正常显示的时候么 niaiwma003 发表于 2012-9-9 19:10
哥还是不行呀?你的方法我试了,年月日,时分秒,还有温度都是一起跳变看不清楚是什么,是电路有问题?还 ...
没准是你把数码管的线接错了 void write(uchar date) //写入DS1302一个字节
uchar read() //读出DS1302一个字节
按我说的这2个函数都要关中断,再开中断 既然是新手,就不要想一口吃成胖子
先把按键,读1302,读温度什么的都去掉,只留显示。先把显示调正确了,再一点点加 时钟一致?硬件连接正常? 数码管动态显示点亮后要关闭,还有延时函数可能也要改。 同意12L的意见,一步一步来是王道 个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了 4152 发表于 2012-9-10 10:21 static/image/common/back.gif
同意12L的意见,一步一步来是王道
个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了 more 发表于 2012-9-9 16:21 static/image/common/back.gif
2楼说的没错,我遇到过这样的问题。
个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了 xiaoaf 发表于 2012-9-9 22:08 static/image/common/back.gif
void write(uchar date) //写入DS1302一个字节
uchar read() ...
个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了 sf49ers 发表于 2012-9-9 22:19 static/image/common/back.gif
既然是新手,就不要想一口吃成胖子
先把按键,读1302,读温度什么的都去掉,只留显示。先把显示调正确了, ...
个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了 先确定乱码是DS1302的数据读错了,还是单纯的显示问题。
把读数据那块去掉,自己赋值。
显示那块先一个一个测试,先只显示第一组的,看能不能正常显示。
你电路图太小了,看不清,仿真只能做个参考。 elecfun 发表于 2012-9-11 21:29 static/image/common/back.gif
先确定乱码是DS1302的数据读错了,还是单纯的显示问题。
把读数据那块去掉,自己赋值。
哥,您能把我的这个程序给著名一下程序的部位吗?程序那个地方是数码管显示部分,现在我还分不清楚那里是那里哪,请哥给著名全程序好吗?谢谢你哥
niaiwma003 发表于 2012-9-12 10:43 static/image/common/back.gif
哥,您能把我的这个程序给著名一下程序的部位吗?程序那个地方是数码管显示部分,现在我还分不清楚那里是 ...
我说程序不是你自己写的啊?昏,前面的朋友基本上都说到了,你先去掉显示以外的部分,读取什么的都去掉,看程序是不是正常
同意12L的意见,一步一步来是王道 求大哥帮帮忙该成功好吗?我所有的东西都买好了,就是乱码 乱码是"比较正常"还是"非常离谱",来张图。
楼主能看得懂上面的程序吗?
如果看不懂就别折腾了,别人帮不了你的。
如果看得懂就按照前面的大侠说的一步一步来,先让数码管一个一个显示,然后2个一起显示,然后三个。。。。。然后再加温度。。。
初学的时候直接抄别人的东西并不可耻,当年我的第一个时钟也是抄别人的,但是我能看懂他们写的东西,后来在把数码管改成了LCD,一步一步慢慢玩。 厉害,起步就玩这么复杂的,还好出错了,不然咋入门喔。 大哥们你们说的都对,我是刚入学的,我是在家里在电脑上看的资料,可是我在网站上下载的资料,我就把这个电子钟的电子元件全部买齐了,谁知道焊接完成后不能用,数码管全部同意乱码到最后我就傻脸了,不知道该怎么办了,我就想哭,我把头磕流血的求大哥帮我把这个做成功。我给大哥磕头了。
页:
[1]