楼上说的对, 没有转换ADC,显示不了数据。 |
点评就行,反正现在做好了。 |
点评就行,反正现在做好了。 |
你的ADC没有转换啊,不转换怎么能够显示啊 |
黑币就是牌面,你看看你,就有牌面 |
我来看能赚黑币吗? |
zl2168 发表于 2018-1-17 11:16 黑币就是牌面,你看看你,就有牌面 |
xyz 是电压 abc是温度 |
#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以上就是十进制之外的码,这个怎么处理 |
你的ADC没有转换啊,肯定显示不了数据的,yuanmayoucuowu |
学习了 |
黑币有什么用?能换钱吗? |
905377346 发表于 2018-1-16 17:24 #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 |
没有转换ADC,显示不了数据 |
你的ADC没有转换啊,肯定显示不了数据的 |