找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3215|回复: 15
打印 上一主题 下一主题
收起左侧

快来这里,解决问题赚黑币~~~

[复制链接]
跳转到指定楼层
楼主
大佬们好 ,我想请教 TLC549 AD转换用1602液晶屏显示的c语言程序,电路图已经画好。
想要实现上述功能,程序应该怎么修改
#include "reg51.h"
#define uint unsigned int
#define uchar unsigned char
#ifndef __TLC549_ADC_H__
#define __TLC549_ADC_H__
sbit lcdrs=P2^0; //
sbit lcdwr=P2^1;
sbit lcden=P2^2;
sbit CLK = P3^0;
sbit DO = P3^5;
sbit CS = P3^1;
unsigned int Volt;
unsigned char LCD[7];
unsigned char TLC549_ADC(void);
uchar    bdata ADCdata;
sbit    ADbit=ADCdata^0;
uchar code dispbuf[]="how are you?";
uchar code dispbuf1[]="I'm fine.";
void delayms(uint ms)
{
uint y;
while(ms--)
{
for(y=0;y<125;y++);
}
}

void write_comdata(uchar rs,uchar comdata)
{
lcdrs=rs;
lcdwr=0;
P0=comdata;
lcden=1;
delayms(1);
lcden=0;
}
void Data_Conversion(void)
{
unsigned char AD_Data;
AD_Data = TLC549_ADC();
Volt = 5.0 / 256 * AD_Data * 1000;
}
void Volt_To_LCD(void)
{
Data_Conversion();
LCD[0] = Volt / 1000 + '0';
LCD[1] = '.';
LCD[2] = Volt / 100 % 10 + '0';
LCD[3] = Volt / 10 % 10 + '0';
LCD[4] = Volt % 10 + '0';
LCD[5] = 'V';
LCD[6] = '\0';
}

uchar TLC549ADC(void)
{  
    uchar i;
        CS=1;   
    CLK=0;   
    DO=1;
    CS=0;
    for(i=0;i<8;i++)
    {
        CLK=1;
//                Delay_MS(5);
   
       ADbit=DO;  
           ADCdata<<=1;      
        CLK=0;
//                Delay_MS(5);
      
    }
    return (ADCdata);
}

void write_charchuan(uchar add, uchar *zfc)
{
write_comdata(0,add);
for(;*zfc!='\0';zfc++)
{
write_comdata(1,*zfc);
}
}
void lcdinitial()
{
lcden=0;
write_comdata(0,0x38);
write_comdata(0,0x0c);
write_comdata(0,0x06);
write_comdata(0,0x01);
write_comdata(0,0x80);
}
main()
{
lcdinitial();
write_charchuan(0x80,dispbuf);
write_charchuan(0x80+0x40,dispbuf1);
while(1);

1.png (28.97 KB, 下载次数: 80)

1.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:76227 发表于 2018-1-16 17:23 | 只看该作者
你的ADC没有转换啊,肯定显示不了数据的
回复

使用道具 举报

板凳
ID:76227 发表于 2018-1-16 17:24 | 只看该作者
没有转换ADC,显示不了数据
回复

使用道具 举报

地板
ID:276150 发表于 2018-1-17 09:02 | 只看该作者
905377346 发表于 2018-1-16 17:24
没有转换ADC,显示不了数据

#include <reg51.h>    //包含头文件
#include <intrins.h>   //空操作函数_nop_()必须的头文件
#include <stdio.h>
#ifndef __1602_H__
#define __1602_H__  
sbit RS = P2^0;   //定义1602各个控制位
sbit RW = P2^1;
sbit EN = P2^2;
sbit TLC549_CS = P3^1;  //TLC549片选,低电平有效
sbit TLC549_DO = P3^5;  //TLC549数字量输出
sbit TLC549_CLK = P3^0;  //TLC549片外独立时钟
//sbit led = P0^7;    //工作状态灯,闪烁为正常
unsigned char DO, num;   //读土壤湿度返回值、定时器计数变量
unsigned char LCD[7];
float DO_F, volt,hh;  //读取返回值的20次累加值、最终转换系数
bit flag=1;   //工作标志位  
unsigned char str1[] = "Volt:";
unsigned char str2[] = "   0V";
unsigned char temp[3];
void InitTimer0();  //声明 定时器T0初始化 函数
void delayus(unsigned int t);  //声明 延时t个机器 周期
unsigned char TLC549_read();  //声明 TLC549读数字量 函数  
void InitTimer0()
{     
TMOD = 0x01;   //选择定时器T0     
TH0  = 0x4C;    //定时50毫秒     
TL0  = 0x00;     
EA   = 1;      //开总中断      
ET0  = 1;    //开定时器T0中断   
TR0  = 1;    //使能定时器T0
}  
void Timer0Interrupt() interrupt 1   
{     
TH0 = 0x4C;  //重装初值      
TL0 = 0x00;  num++;   //计数变量增加1   
if(num==10)   //每500毫秒读一次数字量   
{      //定时50毫秒,即每50毫秒进1次中断,num加1   
num = 0;  //进10次中断后num为10,即过了500毫秒   
flag = 1; //num清零,标志位置1   
}     
}
unsigned char TLC549_read()   
{  
unsigned char i , temp;  
TLC549_CS = 1;    //关闭片选  
TLC549_CLK = 0;    //时钟线拉低  
TLC549_CS = 0;    //打开片选  
_nop_();  //空操作等待两个机器周期待总线稳定
_nop_();
for( i = 0; i < 8; i++ )  //循环8次读出8位转换结果
{   
temp <<= 1;   
temp |= TLC549_DO;  
TLC549_CLK = 1;
_nop_();   
TLC549_CLK = 0;
}
TLC549_CS = 1;  
delayus(14);  //TLC549转换速度小于14微秒,大致延时14微秒等待转换结束  
return temp; //返回转换值
}
void delayus(unsigned int t)   //延时函数,延时t个机器周期
{  
while(--t);
}
void delayus1602(unsigned char t)   
{   
  while(--t); }  
void delayms1602(unsigned char t)   //大致延时t毫秒
{        
while(t--)   
{
delayus1602(245);   
delayus1602(245);
  }
}  
void LCD_check_busy()   //判忙
{  
RS = 0;
RW = 1;  
EN = 1;
while((P0 & 0x80)==0x80);  
delayus1602(2);  
EN = 0;
}
void LCD_write_com(unsigned char com)  
{
LCD_check_busy();  
RS = 0;  
RW = 0;  
EN = 1;  
P0 = com;  
delayus1602(2);  
EN = 0;
}
void LCD_write_Data(unsigned char Data)   
{
LCD_check_busy();  
RS = 1;  
RW = 0;  
EN = 1;  
P0 = Data;  
delayus1602(2);  
EN = 0;  
}
void LCD_clear()   
{  
LCD_write_com(0x01);   
delayms1602(5);
}
void LCD_write_string(unsigned char x , unsigned char y , unsigned char *s)
//在第x行第y位写字符串
{  
LCD_check_busy();  
if( x == 1 )  
{   
LCD_write_com(0x80 + y - 1);  
}
else if( x == 2 )  
{   
LCD_write_com(0xc0 + y - 1);  
}  
while(*s)  
{   
LCD_write_Data(*s);   
s++;
}
}
void LCD_init()  
{  
delayms1602(15);
LCD_write_com(0x38);
delayms1602(5);
LCD_write_com(0x38);//8位总线、双行5×7点阵
LCD_write_com(0x08);
LCD_write_com(0x01);
LCD_write_com(0x06);
delayms1602(5);
LCD_write_com(0x0c);
}
void main()
{
unsigned char i;//for循环变量
InitTimer0(); //初始化定时器T0
LCD_init();  
delayus(1000);  
LCD_clear();
LCD_write_string(1, 1, str1);  
LCD_write_string(2, 1, str2);   
while(1)
{
if(flag)
  { flag=0; //标志位清零
//for(i=0,i<20,i++)
{
DO=TLC549_read();//读     
DO_F=DO_F+DO;//累加
}
DO_F=DO_F/20.00;//累加值除20求平均   
volt=(float)(( DO_F * 5 )/256.00); // TLC549是8位A/D芯片,2的8次方是256即转换所得数值为0-255,所以乘以基准电压再除以精度
sprintf(temp,"%4.2f", volt);   
LCD_write_string(2,7,temp);         
//if(volt>4.5|volt<0.5)  
//led=1;
//if(volt>0.5&&volt<4.5)      
//led=0;      
  }
}


}
#endif
回复

使用道具 举报

5#
ID:111634 发表于 2018-1-17 11:16 | 只看该作者
黑币有什么用?能换钱吗?
回复

使用道具 举报

6#
ID:276587 发表于 2018-1-17 17:03 来自手机 | 只看该作者
学习了
回复

使用道具 举报

7#
ID:277088 发表于 2018-1-17 17:41 | 只看该作者
你的ADC没有转换啊,肯定显示不了数据的,yuanmayoucuowu
回复

使用道具 举报

8#
ID:276150 发表于 2018-1-17 22:40 | 只看该作者
#include <reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uint unsigned int  //预定义一下  
#define uchar unsigned char  
sbit rs=P2^0; //1602:0写指令,1写数据
sbit rw=P2^1; //1602读写信号
sbit en=P2^2; //1602片选信号
sbit TLC549_CS = P3^1;  //TLC549片选,低电平有效
sbit TLC549_DO = P3^5;  //TLC549数字量输出
sbit TLC549_CLK = P3^0;  //TLC549片外独立时钟
uchar bdata ADCdata;
uchar code tabl[]={'0','1','2','3','4','5','6','7','8','9',}; //要显示的内容1放入数组tablel  u
uchar code tab2[]={'0','1','2','3','4','5','6','7','8','9',}; //要显示的内容1放入数组tablel  u
void delay(uint n)       //延时函数                       
{      
uint x,y;      
for(x=n;x>0;x--)         
for(y=110;y>0;y--);  
}  
void lcd_wcom(uchar com)  //1602写命令函数                  
{      
rs=0;            //选择指令寄存器     
rw=0;            //选择写     
P0=com;            //把命令字送入P2      
delay(5);            //延时一小会儿,让1602准备接收数据      
en=1;           //使能线电平变化,命令送入1602的8位数据口      
en=0;  
}  
void lcd_wdat(uchar dat)        //1602写数据函数      
{      
rs=1;        //选择数据寄存器      
rw=0;        //选择写      
P0=dat;        //把要显示的数据送入P2      
delay(5);        //延时一小会儿,让1602准备接收数据      
en=1;        //使能线电平变化,数据送入1602的8位数据口      
en=0;  
}  
void lcd_init()              //1602初始化函数        
{      
lcd_wcom(0x38);       //8位数据,双列,5*7字形            
lcd_wcom(0x0c);      //开启显示屏,关光标,光标不闪烁      
lcd_wcom(0x06);    //显示地址递增,即写一个数据后,显示位置右移一位      
lcd_wcom(0x01);    //清屏  
}  
uchar ad549( )
{      
uchar i;   
TLC549_CLK =0;   
TLC549_DO=1;   
TLC549_CS=0;
for(i=0;i<8;i++)  
{   
TLC549_CLK=1;   
_nop_();   
_nop_();   
ADCdata<<=1;   
TLC549_CLK =0;   
ADCdata|=TLC549_DO;   
_nop_();
}  
TLC549_CS=1;  
_nop_();
_nop_();  
return (ADCdata);
}   
void main()            //主函数  
{   
uchar n,m=0;   
float num;   
int x,y,a,b,a1,b1;   
num=ad549( );
x=(int)(num/51);   
y=num/51*10;       //2.62x10=26.2   
y=(int)y-x*10;    //  26-20   
//z=(int)(num/51*10); //262   
//z=(int)(num/51*100-100*x-y*10);   
delay(5);
a1=num*13.4;
b1=num*1.34;
a=(int)(a1/51);
b=b1/51*10;
b=(int)b-a1*10;    //  26-20   
//c=(int)(a1/51*10); //262   
//c=(int)(a1/51*100-100*a-b*10);
//P3=z;
delay(20);
lcd_init();             //液晶初始化            
/*lcd_wcom(0x80);   //显示地址设为80H                  
lcd_wdat('U');    //该处显示字符u                     
delay(10);    //     
lcd_wcom(0x81);   //显示地址设为81H                  
lcd_wdat('o');    //该处显示字符o                  
delay(10);    //     
lcd_wcom(0x82);   //显示地址设为82H                 
lcd_wdat('u');                        
delay(10);    //   
lcd_wcom(0x83);                  
lcd_wdat('t');                       
delay(10);    //   
lcd_wcom(0x84);                     
lcd_wdat('=');                        
delay(10);    //*/
lcd_wcom(0x80); //1//显示地址设为80H(即00H,)上排第一位                    
lcd_wdat(tabl[x]);   //该处设置变量x;                  
delay(10);    //     
lcd_wcom(0x81);                  
lcd_wdat('.');                        
delay(10);    //     
lcd_wcom(0x82);                       
lcd_wdat(tabl[y]);                        
delay(10);    //     
//lcd_wcom(0x83);                     
//lcd_wdat(tabl[z]);                        
//delay(10);    //     
lcd_wcom(0x84);                     
lcd_wdat('v');                        
delay(10);    //      
lcd_wcom(0x80+0x41); //重新设定显示地址为0xc4,即下排第5位     
lcd_wdat(tab2[a]);   //该处设置变量x;                  
delay(10);    //     
lcd_wcom(0x81+0x41);                  
lcd_wdat(tab2[b]);                        
delay(10);    //     
lcd_wcom(0x82+0x41);                       
lcd_wdat('.');                        
delay(10);    //     
lcd_wcom(0x83+0x41);                     
lcd_wdat('0');                        
delay(10);    //     
lcd_wcom(0x84+0x41);                     
lcd_wdat('c');                        
delay(10);    //  
for(n=0;n<14;n++)   //将tab2[]中的数据依次写入1602显示     
{                           
delay(10);      
}     
delay(1000);
}

现在能显示0-5v电压
想显示温度0-66℃,在算法部分怎么改,
目前最多显示到8℃,1v以上就是十进制之外的码,这个怎么处理
回复

使用道具 举报

9#
ID:276150 发表于 2018-1-17 22:58 | 只看该作者
xyz 是电压  abc是温度
回复

使用道具 举报

10#
ID:276150 发表于 2018-1-17 22:59 | 只看该作者
zl2168 发表于 2018-1-17 11:16
黑币有什么用?能换钱吗?

黑币就是牌面,你看看你,就有牌面
回复

使用道具 举报

11#
ID:277205 发表于 2018-1-17 23:31 | 只看该作者
我来看能赚黑币吗?
回复

使用道具 举报

12#
ID:253780 发表于 2018-1-18 07:18 | 只看该作者
黑币就是牌面,你看看你,就有牌面
回复

使用道具 举报

13#
ID:276794 发表于 2018-1-18 10:43 来自手机 | 只看该作者
你的ADC没有转换啊,不转换怎么能够显示啊
回复

使用道具 举报

14#
ID:276150 发表于 2018-1-18 16:19 | 只看该作者
点评就行,反正现在做好了。
回复

使用道具 举报

15#
ID:276150 发表于 2018-1-18 16:20 | 只看该作者
点评就行,反正现在做好了。
回复

使用道具 举报

16#
ID:105075 发表于 2018-1-18 23:20 | 只看该作者
楼上说的对,
没有转换ADC,显示不了数据。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表