14227|4

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

小弟今天试着写DS1302的程序,出现很多“bad operand type”错误,求解 [复制链接]

如题,不知语法错在哪里了,请大虾们帮帮忙,我在网上查了很久都没有找到答案,程序在附件里面。
我编译出来11个错误,但不知道应该怎么改,很多都是“bad  operand type”错误   


哎,没人理我,那我直接贴代码了,问题是主要是在“设置时钟函数”和“处理函数”中,求解!!!!!!

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit sck=P2^1;
sbit io=P2^0;
sbit rst=P2^4;
void writr_ds1302_byte(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_ds1302(uchar add);
void time_pros(void);
void display();
void read_rtc(void);
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar time_data[7]={12,4,8,17,10,48,30}; //放时间初值
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //要写到的地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};  //要读的地址
uchar disp[8];

void delay(int m)  //延时//
{
int i,j;
for(i=m;i>0;i--)
  for(j=50;j>0;j--);

}

void writr_ds1302_byte(uchar dat)  //单字节 写
{
uchar i;
for(i=0;i<8;i++)
{
  sck=0;
  io=dat&0x01; //准备数据
  dat=dat>>1;  //移位
  sck=1;
}

}
void write_ds1302(uchar add,uchar dat)  //多字节  写
{
rst=0;
_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(add);  //地址
write_ds1302_byte(dat);  //数据
rst=0;_nop_();
io=1;
sck=1;  //释放
}
uchar read_ds1302(uchar add) //单字节读
{
uchar i,value;
rst=0;_nop_();
sck=0;_nop_();
rst=0;_nop_();
write_ds1302_byte(add);  //写地址
for(i=0;i<8;i++)
{
  value=value>>1;
  sck=0;
  if(io)
  value=value|0x80;
  sck=1;
}
rst=0;_nop_();
sck=0;_nop_();
sck=1;
io=1; //释放
return value;
}
void set_rtc(void)  //设置时钟
{
uchar i,j;
for(i=0;i<7;i++)
{
  j=time_data/10;
  time_data=time_data%10;
  time_data=time_data+j*16;
}

write_ds1302(0x8e,0x00); //去保护
for(i=0;i<7;i++)
{
  write_ds1302(write_add,time_data);
}
write_ds1302(0x8e,0x80); //写保护
}

void read_rtc(void)  //读
{
uchar i;
for(i=0;i<7;i++)
{
  time_data=read_ds1302(read_add);
}   
}
void time_pros(void)  //处理函数
{
disp[0]=time_data[6]%16;
disp[1]=time_data[6]/16;

disp[2]=time_data[5]%16;
  disp[3]=time_data[5]/16;

disp[4]=time_data[4]%16;
disp[5]=time_data[4]/16;
}


void display()    //数码管显示
{
dula=1;       //显示 秒
P0=disp[1];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(5);
dula=1;
P0=disp[0];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(5);


dula=1;       //显示 分
P0=disp[2]+0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(5);


dula=1;
P0=disp[3];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(5);


dula=1;        //显示 时
P0=disp[4]+0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);


dula=1;
P0=disp[5];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
}

void main()
{
set_rtc();
while(1)
{
  read_rtc();
  time_pros();
  display();
}
}

[ 本帖最后由 茹zhiwei 于 2012-8-16 21:07 编辑 ]

DS1302 .c

2.88 KB, 下载次数: 5

此帖出自51单片机论坛

最新回复

for(i=0;i  详情 回复 发表于 2012-8-16 22:45

点评

for(i=0;i  详情 回复 发表于 2012-8-16 22:45
io=dat&0x01; //准备数据 这句会不会有问题呢,io是个位变量,而给它赋值unsigned char型的 可以考虑这样写 if(dat&0x01) { io = 1; } else { io =0; } 遇到的问题要根据提示结果具体分析了,这样看代码  详情 回复 发表于 2012-8-16 22:41
点赞 关注
 

回复
举报

22

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
不能沉了,我顶上去·······
此帖出自51单片机论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

回复 楼主 茹zhiwei 的帖子

io=dat&0x01; //准备数据
这句会不会有问题呢,io是个位变量,而给它赋值unsigned char型的
可以考虑这样写
if(dat&0x01)
{
io = 1;
}
else
{
io =0;
}
遇到的问题要根据提示结果具体分析了,这样看代码有点晕
此帖出自51单片机论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(高级)

4
 

回复 楼主 茹zhiwei 的帖子

for(i=0;i<7;i++)
{
  write_ds1302(write_add,time_data);
}
这句话也有问题,write_ds1302函数的输入量应该是数据,而你这样写的话是把数组指针放进去了,并且你反复写了7次,你的意思应该是这样吧:write_ds1302(write_add,time_data
此帖出自51单片机论坛

点评

感谢回复,我刚才重新打了一次程序,已经没有错误和警告了,原因可能是有些语句是我复制粘贴的,导致出现了一些未知的符号,而keil又显示不出来,所以报错。后面display中应该是P0=table[disp[5]];的,而不是P0=dis  详情 回复 发表于 2012-8-16 23:09
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 xhb_123 的帖子

感谢回复,我刚才重新打了一次程序,已经没有错误和警告了,原因可能是有些语句是我复制粘贴的,导致出现了一些未知的符号,而keil又显示不出来,所以报错。后面display中应该是P0=table[disp[5]];的,而不是P0=disp[5];


不过 虽然程序没有报错,可是数码管上面显示的是FFFFFF(静止不自动计数),并没有安装预定设置的提前显示,问题还是没有解决·····
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表