|
發布時間: 2018-1-16 15:09
正文摘要:大佬們好 ,我想請教 TLC549 AD轉換用1602液晶屏顯示的c語言程序,電路圖已經畫好。 想要實現上述功能,程序應該怎么修改 #include "reg51.h" #define uint unsigned int #define uchar unsigned char #i ... |
|
樓上說的對, 沒有轉換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沒有轉換啊,肯定顯示不了數據的 |