我是单片机新手(51),最近有个项目需要几段小程序,可是自己能力有限,希望高手帮忙,非常感谢

这一小段是利用TLC549芯片采集模拟量,然后在1602液晶上显示出来,我自己用了很多样例程序,可是都没有成功,请高手指教 非常着急,感谢。QQ 769021665

我的程序如下,仿真的时候就显示0.00V,偶尔开机的时候显示一下数据,但参数不对,如果在采集数据函数的返回值中直接填写十进制数据,液晶可以正常显示,计算都是对的,但连起来后就没有反应了,请高手指教

为了节省地方,液晶初始化程序和写命令、写数据程序都删了,那个是测试过的,没有问题,没有编写检测液晶忙程序,用的是延时。

TLC549LCD.c

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit AD_Out = P1^0; //TLC549输出端
sbit CS = P1^5; //TLC549片选信号
sbit AD_In = P1^1; //TLC549时钟
sbit E=P2^0; //1602使能引脚
sbit RW=P2^2; //1602读写引脚
sbit RS=P2^1; //1602数据/命令选择引脚

/***************
名称 : AD_Change(void)
功能 : TLC549驱动程序。
输出 : temp (电压值)
*******************/
uint AD_Change()
{
unsigned char i, tmp;
CS = 1; //CS 置高,片选无效
AD_In = 0;
CS = 0; //CS 置低,片选有效,同时DO 输出最高位
_nop_();
_nop_();
for(i = 0; i < 8; i++) //串行数据移位输入
{
tmp <<= 1;
tmp |= AD_Out;
AD_In = 1; //0.4us
_nop_();
AD_In = 0; //0.4us
}
CS = 1; //CS 置高,片选无效
for(i = 17; i != 0; i--) _nop_();
return (tmp); //直接在返回值填写十进制数据,液晶显示正常
}

uint shuchu(void)
{
unsigned char yt1;
unsigned int yt;
yt1=AD_Change();
yt=yt1 * 5000.0 / 256.0;
return yt;
}
/************
名称 : Main()
功能 : 主函数
************/
void Main(void)
{
uint yt2,yt3,yt4,yt5;
L1602_init();
L1602_string(1,1,"ADC(TLC549) TEST ");
L1602_string(2,1," 0.00V ");
yt5=shuchu();
yt2=yt5/1000%100;
yt3=(yt5-yt2*1000)/100 % 10;
yt4=((yt5-yt2*1000)-(yt3*100))/10%10;
L1602_char(2,6,yt2+48);
L1602_char(2,8,yt3+48);
L1602_char(2,9,yt4+48);

while(1)
{
delay(3000);
shuchu();
}
}

第1个回答  2012-02-26
uint shuchu(void)
{
unsigned char yt1; //0~65535
unsigned int yt;
yt1 = AD_Change(); //0~255
yt = yt1 * 5000.0 / 256.0; //乘以5000,应该是远远超过65535了.
return yt;
}

改成:
yt = yt1 * 19.53; //5000/256=19.53125,应该由人来计算,别让单片机犯难。

试试看。追问

呵呵,谢谢大家的帮忙。这个程序我终于试出来了,其实*5000是可以的,因为YT1比较小。
现在新的问题又出来了,我想用CH451读取键值,这个程序试不出来,不知道谁有这样的程序,非常感谢 QQ 769021665

第2个回答  2012-02-25
proteus 仿真 一下,如何?

建议 去 我的领地 5d6d 的 proteus 论坛看看

那里有很多 单片机仿真实例,包括仿真图 和 源码
搜 5d6d 和 proteus 2个关键词