熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2018-1-16 15:09
正文摘要:大佬們好 ,我想請(qǐng)教 TLC549 AD轉(zhuǎn)換用1602液晶屏顯示的c語(yǔ)言程序,電路圖已經(jīng)畫好。 想要實(shí)現(xiàn)上述功能,程序應(yīng)該怎么修改 #include "reg51.h" #define uint unsigned int #define uchar unsigned char #i ... |
樓上說(shuō)的對(duì), 沒(méi)有轉(zhuǎn)換ADC,顯示不了數(shù)據(jù)。 |
點(diǎn)評(píng)就行,反正現(xiàn)在做好了。 |
點(diǎn)評(píng)就行,反正現(xiàn)在做好了。 |
你的ADC沒(méi)有轉(zhuǎn)換啊,不轉(zhuǎn)換怎么能夠顯示啊 |
黑幣就是牌面,你看看你,就有牌面 |
我來(lái)看能賺黑幣嗎? |
zl2168 發(fā)表于 2018-1-17 11:16 黑幣就是牌面,你看看你,就有牌面 |
xyz 是電壓 abc是溫度 |
#include <reg51.h> #include<intrins.h> #include<stdio.h> #define uint unsigned int //預(yù)定義一下 #define uchar unsigned char sbit rs=P2^0; //1602:0寫指令,1寫數(shù)據(jù) sbit rw=P2^1; //1602讀寫信號(hào) sbit en=P2^2; //1602片選信號(hào) sbit TLC549_CS = P3^1; //TLC549片選,低電平有效 sbit TLC549_DO = P3^5; //TLC549數(shù)字量輸出 sbit TLC549_CLK = P3^0; //TLC549片外獨(dú)立時(shí)鐘 uchar bdata ADCdata; uchar code tabl[]={'0','1','2','3','4','5','6','7','8','9',}; //要顯示的內(nèi)容1放入數(shù)組tablel u uchar code tab2[]={'0','1','2','3','4','5','6','7','8','9',}; //要顯示的內(nèi)容1放入數(shù)組tablel u void delay(uint n) //延時(shí)函數(shù) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void lcd_wcom(uchar com) //1602寫命令函數(shù) { rs=0; //選擇指令寄存器 rw=0; //選擇寫 P0=com; //把命令字送入P2 delay(5); //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù) en=1; //使能線電平變化,命令送入1602的8位數(shù)據(jù)口 en=0; } void lcd_wdat(uchar dat) //1602寫數(shù)據(jù)函數(shù) { rs=1; //選擇數(shù)據(jù)寄存器 rw=0; //選擇寫 P0=dat; //把要顯示的數(shù)據(jù)送入P2 delay(5); //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù) en=1; //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口 en=0; } void lcd_init() //1602初始化函數(shù) { lcd_wcom(0x38); //8位數(shù)據(jù),雙列,5*7字形 lcd_wcom(0x0c); //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍 lcd_wcom(0x06); //顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位 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() //主函數(shù) { 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); //顯示地址設(shè)為80H lcd_wdat('U'); //該處顯示字符u delay(10); // lcd_wcom(0x81); //顯示地址設(shè)為81H lcd_wdat('o'); //該處顯示字符o delay(10); // lcd_wcom(0x82); //顯示地址設(shè)為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//顯示地址設(shè)為80H(即00H,)上排第一位 lcd_wdat(tabl[x]); //該處設(shè)置變量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); //重新設(shè)定顯示地址為0xc4,即下排第5位 lcd_wdat(tab2[a]); //該處設(shè)置變量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[]中的數(shù)據(jù)依次寫入1602顯示 { delay(10); } delay(1000); } 現(xiàn)在能顯示0-5v電壓 想顯示溫度0-66℃,在算法部分怎么改, 目前最多顯示到8℃,1v以上就是十進(jìn)制之外的碼,這個(gè)怎么處理 |
你的ADC沒(méi)有轉(zhuǎn)換啊,肯定顯示不了數(shù)據(jù)的,yuanmayoucuowu |
學(xué)習(xí)了 |
黑幣有什么用?能換錢嗎? |
905377346 發(fā)表于 2018-1-16 17:24 #include <reg51.h> //包含頭文件 #include <intrins.h> //空操作函數(shù)_nop_()必須的頭文件 #include <stdio.h> #ifndef __1602_H__ #define __1602_H__ sbit RS = P2^0; //定義1602各個(gè)控制位 sbit RW = P2^1; sbit EN = P2^2; sbit TLC549_CS = P3^1; //TLC549片選,低電平有效 sbit TLC549_DO = P3^5; //TLC549數(shù)字量輸出 sbit TLC549_CLK = P3^0; //TLC549片外獨(dú)立時(shí)鐘 //sbit led = P0^7; //工作狀態(tài)燈,閃爍為正常 unsigned char DO, num; //讀土壤濕度返回值、定時(shí)器計(jì)數(shù)變量 unsigned char LCD[7]; float DO_F, volt,hh; //讀取返回值的20次累加值、最終轉(zhuǎn)換系數(shù) bit flag=1; //工作標(biāo)志位 unsigned char str1[] = "Volt:"; unsigned char str2[] = " 0V"; unsigned char temp[3]; void InitTimer0(); //聲明 定時(shí)器T0初始化 函數(shù) void delayus(unsigned int t); //聲明 延時(shí)t個(gè)機(jī)器 周期 unsigned char TLC549_read(); //聲明 TLC549讀數(shù)字量 函數(shù) void InitTimer0() { TMOD = 0x01; //選擇定時(shí)器T0 TH0 = 0x4C; //定時(shí)50毫秒 TL0 = 0x00; EA = 1; //開總中斷 ET0 = 1; //開定時(shí)器T0中斷 TR0 = 1; //使能定時(shí)器T0 } void Timer0Interrupt() interrupt 1 { TH0 = 0x4C; //重裝初值 TL0 = 0x00; num++; //計(jì)數(shù)變量增加1 if(num==10) //每500毫秒讀一次數(shù)字量 { //定時(shí)50毫秒,即每50毫秒進(jìn)1次中斷,num加1 num = 0; //進(jìn)10次中斷后num為10,即過(guò)了500毫秒 flag = 1; //num清零,標(biāo)志位置1 } } unsigned char TLC549_read() { unsigned char i , temp; TLC549_CS = 1; //關(guān)閉片選 TLC549_CLK = 0; //時(shí)鐘線拉低 TLC549_CS = 0; //打開片選 _nop_(); //空操作等待兩個(gè)機(jī)器周期待總線穩(wěn)定 _nop_(); for( i = 0; i < 8; i++ ) //循環(huán)8次讀出8位轉(zhuǎn)換結(jié)果 { temp <<= 1; temp |= TLC549_DO; TLC549_CLK = 1; _nop_(); TLC549_CLK = 0; } TLC549_CS = 1; delayus(14); //TLC549轉(zhuǎn)換速度小于14微秒,大致延時(shí)14微秒等待轉(zhuǎn)換結(jié)束 return temp; //返回轉(zhuǎn)換值 } void delayus(unsigned int t) //延時(shí)函數(shù),延時(shí)t個(gè)機(jī)器周期 { while(--t); } void delayus1602(unsigned char t) { while(--t); } void delayms1602(unsigned char t) //大致延時(shí)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點(diǎn)陣 LCD_write_com(0x08); LCD_write_com(0x01); LCD_write_com(0x06); delayms1602(5); LCD_write_com(0x0c); } void main() { unsigned char i;//for循環(huán)變量 InitTimer0(); //初始化定時(shí)器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; //標(biāo)志位清零 //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即轉(zhuǎn)換所得數(shù)值為0-255,所以乘以基準(zhǔn)電壓再除以精度 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 |
沒(méi)有轉(zhuǎn)換ADC,顯示不了數(shù)據(jù) |
你的ADC沒(méi)有轉(zhuǎn)換啊,肯定顯示不了數(shù)據(jù)的 |
Powered by 單片機(jī)教程網(wǎng)