打印

求大腿改改程序啊。。感激。。

[复制链接]
728|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaocainiaoa|  楼主 | 2016-4-28 09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此程序的功能是太阳能热水器水位的查表法显示。。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar Chan0Value,Chan1Value;

sbit RS=P1^0; //1602各控制脚
sbit RW=P1^1;
sbit EN=P1^2;
sbit Cs0832=  P2^0;    //0832各控制脚
sbit Clk0832= P3^6;
sbit Di0832=  P3^7;
sbit Do0832=  P3^7;

void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
    int i,j;
   for(i=0;i<ms;i++)
    for(j=0;j<100;j++);
}

/**********************************ADC0832********************************/
uchar GetValue0832(uchar Channel) //获取数值返回。入口:通道(0或1)。出口:数值。
{
uchar i,Dat1=0,Dat2=0;
Clk0832=0;
Di0832=1;
Cs0832=0;
Clk0832=1;
Clk0832=0; //第一脉冲,开始位
Di0832=1;
Clk0832=1;
Clk0832=0; //第二脉冲,模式选择
Di0832=Channel;//通道选择,0或1
Clk0832=1;
Clk0832=0; //第三脉冲,通道选择
Di0832=1; //释放输入线
for(i=0;i<8;i++)   //从高到低取一次数
  {
   Clk0832=1; //下降沿有效
   Clk0832=0;
   if(Do0832) Dat1|=0x80>>i;
   }
for(i=0;i<8;i++)   //从低到高取一次数
  {
  if(Do0832) Dat2|=0x01<<i;
  Clk0832=1; //下降沿有效
  Clk0832=0;
  }
Cs0832=1;
Di0832=1;
Clk0832=1;  //数据读取完成,释放所有数据线
if(Dat1==Dat2)
return Dat1; //校验两次数相等,输出
}
/*本程序与其他一般程序最大的不同就是要读两次
一次从最高位到最低位,一次从最低位到最高位,
两次所读值相等即为正常,可以输出*/
/******************************LCD1602**************************************/
/*************************lcd1602程序**************************/

void wr_com(unsigned char com)//写指令//
{ delay1ms(1);
   RS=0;
   RW=0;
   EN=0;
   P0=com;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
}
void wr_dat(unsigned char dat)//写数据//
{ delay1ms(1);
   RS=1;
   RW=0;
   EN=0;
   P0=dat;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
}
void lcd_init()//初始化设置//
{
delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x80);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void writevalue(uchar add,uchar dat)
{
wr_com(0x80+add);
wr_dat(dat);
}
void zifuchuan(uchar *ch)
{
  while(*ch!=0)
  wr_dat(*ch++);
  delay1ms(20);
}
void main(void)
{   
     
    int table[5]={0%,20%,50%,80%,100%}
     lcd_init();
while(1)
{
  Chan0Value=GetValue0832(0);
  delay1ms(100);
     Chan1Value=GetValue0832(1);

        wr_com(0x80);
  zifuchuan("HIGHT:");
  writevalue(1,table[Dat1]);

  delay1ms(1000);
}
}
SWCLXS.C(106): 错误 C141: syntax error near ','
SWCLXS.C(107): 错误 C231: 'lcd_init': redefinition
SWCLXS.C(116): 错误 C202: 'Dat1': undefined identifier
那个Dat1就是0832 输出的,,还有顺便问一下,,这玩意0832 输出是0-255 的值。。我水位只有5档,,怎么弄得,,完全小白求介绍啊。。
这验证码太屌了。。。

相关帖子

沙发
NE5532| | 2016-4-28 10:23 | 只看该作者
大腿不在,请下载《程序调试黑宝书》

使用特权

评论回复
板凳
dongshan| | 2016-4-29 10:10 | 只看该作者
本帖最后由 dongshan 于 2016-4-29 10:12 编辑

1. 第一个问题情况不明,你自己看不出来,别人根本也不可能看出来。
2. 第二个问题,是你的lcd_init定义了多个。
3. 第二个问题,main函数中 writevalue(1,table[Dat1]); 的Dat1你直接就用 了,没有定义。
第四个问题: int table[5]={0%,20%,50%,80%,100%}
这是c语言的语法吗?

使用特权

评论回复
地板
ywlzh| | 2016-4-29 12:32 | 只看该作者
dongshan 发表于 2016-4-29 10:10
1. 第一个问题情况不明,你自己看不出来,别人根本也不可能看出来。
2. 第二个问题,是你的lcd_init定义了 ...

这第四个问题 你不说还没注意

这种写法还是第一次见,不知道成不成

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝