|
- //主程序
- //#include <STC89C5xRC.H>
- #include <reg52.h>
- #include"LM35LCD1602.h"
- #define ADC_DATA P1
- uchar Temp;
- uchar ggao[]="0123456789";
- uchar volt_data[]="volt:000.00v";
- uchar t1_flag = 0; //用于標記顯示第幾位數(shù)碼管
- uchar seg0 = 0; //第0位數(shù)碼管的值
- uchar seg1 = 1; //第1位數(shù)碼管的值
- uchar seg2 = 2; //第2位數(shù)碼管的值
- uchar seg3 = 3; //第3位數(shù)碼管的值
- //處理后的數(shù)據(jù)
- sbit ADC_EOC = P3^3;
- sbit ADC_CLK = P3^4;
- sbit ADC_START = P3^6;
- sbit ADC_OE = P3^7;
- //*********************************************************************************
- //函數(shù)名:Delay
- //函數(shù)功能:軟件延時函數(shù)
- //形式參數(shù):uint i
- //*********************************************************************************
- void delayms(unsigned int ms)
- {
- unsigned char a,b,c;
- while(ms--)
- {
- for(c=1;c>0;c--)
- for(b=142;b>0;b--)
- for(a=2;a>0;a--);
- }
- }
- //===========================
- //定時器初始化,配置ADC0809時鐘
- //===========================
- void timer_init(void)
- {
- //配置定時器0
- ET0 = 1;
- TMOD &= 0xF0;
- TMOD |= 0x02; //定時器0,模式2,自動重裝定時器
- TH0 = 200; //自動重裝值
- TL0 = 200;
- TR0 = 1; //配置定時器1
- ET1 = 1;
- TMOD &= 0x0F; //清除定時器1配置,不改動定時器0的配置
- TMOD |= 0x10; //定時器1模式一,不改動定時器0的模式
- TH1 = (65536 - 2000)/256;
- TL1 = (65536 - 2000)%256;
- TR1 = 1;
- EA = 1;
- }
- //============================
- //ADC0809 轉(zhuǎn)換函數(shù)
- //============================
-
- uchar ADC0809_GET(void)
- {
- ADC_START = 0;
- ADC_OE = 0;
- ADC_START = 1;
- ADC_START = 0;
- while(ADC_EOC == 0);
- ADC_OE = 1;
- return ADC_DATA;
- }
- /********************
- **********************/
- void timer0() interrupt 1
- {
- ADC_CLK = ~ADC_CLK;
- }
- /********************************************
- void timer1() interrupt 3
- {
- TH1 = (65536 - 2000)/256;
- TL1 = (65536 - 2000)%256;
-
- if(t1_flag == 0)
- {
- lcd_wcom(0x80+0x01);lcd_wdat(ggao[seg0]); ////選通第0位
- }
- else if(t1_flag == 1)
- {
- lcd_wcom(0x80+0x02);lcd_wdat(volt_data[seg1]);
- }
- else if(t1_flag == 2)
- {
- lcd_wcom(0x80+0x03);lcd_wdat(ggao[seg2]);
- }
- else if(t1_flag == 3)
- {
- lcd_wcom(0x80+0x04);lcd_wdat(ggao[seg3]); //選通第3位數(shù)碼管
- }
- t1_flag++; //自加1
- t1_flag = t1_flag%4; //讓t1_flag 在0和3之間循環(huán)
- }
- *********************************************************/
- //============================
- //顯示電壓值,輸入0~255,顯示0.000~5.000
- //============================
- uint Display_volt()
- {
- uchar num,Temp;// = 0; //ADC采集到的值
- Temp= ADC0809_GET;
- num=(Temp*1.0/255*5)*100; //數(shù)據(jù)處理:輸出值=輸入值*5/255 參數(shù)5是基準電壓5V
- volt_data[10]=num%10+48; //取處理后的數(shù)據(jù)個位,對應(yīng)顯示溫度值的小數(shù)2位
- volt_data[9]=num/10%10+48; //取處理后的數(shù)據(jù)十位,對應(yīng)顯示溫度值的小數(shù)1位
- volt_data[7]=num/100%10+48; //取處理后的數(shù)據(jù)百位,對應(yīng)顯示溫度值的個位
- volt_data[6]=num/1000; //取處理后的數(shù)據(jù)千位,對應(yīng)顯示溫度值的十位
- wsrt(0xc0,volt_data);
- return num;
- }
- /*************
- uint print_volt(uchar num)
- {
- uchar volt = 0;
- volt = num/255.0 * 5000 + 0.5; //除255.0和除255有很大區(qū)別,除255.0會自動轉(zhuǎn)換為float型,小數(shù)才能保持,而volt/255=0,+0.5四舍五入。
- seg0 = volt/1000%10;
- seg1 = volt/100%10;
- seg2 = volt/10%10;
- seg3 = volt%10;
- return volt;
- }
- *****************/
- //============================
- //主函數(shù)
- //============================
- void main()
- {
- uint volt = 0; //電壓值 0~5000,代表(0~5)V
- lcd_init();
- wsrt(0x80,ggao);
- lcd_wcom(0x80+0x0f);lcd_wdat(0xc3);//*"1",0*/
- lcd_wcom(0x80+0x0d);
- lcd_wdat(0xdf);//*"1",0*/
- lcd_wcom(0x80+0x0e);
- lcd_wdat(0x43);//*"1",0*/
- timer_init(); //定時器0、定時器1初始化。
- /**********************
- uchar adc_num = 0; //ADC采集到的值
- uint volt = 0;
- timer_init();
- lcd_init();
- lcd_wcom(0x38);
- lcd_wcom(0x0c);
- lcd_wcom(0x06);
- **************************/
- while(1)
- {
-
- Display_volt();
- delayms(5);
- }
- }
- //LCD程序
- /*------------------------------------*/
- #ifndef __LCD1602_H__
- #define __LCD1602_H__
- //#include"delay.h"
- #define uint unsigned int //預(yù)定義
- #define uchar unsigned char
- sbit rs=P2^5; //1602/定義數(shù)據(jù)/命令選擇端
- sbit rw=P2^6; //定義讀/寫選擇端
- sbit en=P2^7; //定義使能端
- /*P0口接1602的D0~D7*/
- //uchar h1,h2,h3,h4;//LCD顯示變量
- //uchar table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //要顯示的內(nèi)容放入數(shù)組table
- //uchar table1[43]="0123456789abcdefABCDEFGHIJKLMNOPQRSTUVWXYZ";
- //uchar table2[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};
- //uchar table3[]=".VAWa";
- //uchar table3[]="888888888888";
- //uchar code table[]="I LIKE MCU!";
- void delayZ(uint n) //延時函數(shù)
- {
- uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- //void tablex(uint tab1);
-
- void lcd_wcom(uchar com) //1602寫命令函數(shù)
- {
- rs=0; //RS置0
- rw=0; //RW置0 RS、RW置零,指令寄存器寫入
- en=1; //使能端置為高電平
- P0=com; //對液晶屏位置控制的命令
- en=0; //使能端置為低電平。使能端從高電平跳變低電平,液晶模塊執(zhí)行寫操作
- delayZ(5); //延時一定時間
- }
- void lcd_wdat(uchar dat) //1602寫數(shù)據(jù)函數(shù)
- {
- rs=1; //RS置1
- rw=0; //RW置0 RS置1,RW置零,數(shù)據(jù)寄存器寫入
- en=1; //讀取液晶模塊信息
- P0=dat; //液晶屏顯示的命令
- en=0; //使能端置為低電平。使能端從高電平跳變低電平,液晶模塊執(zhí)行寫操作
- delayZ(5); //延時一定時間
- }
- void lcd_init() //1602初始化函數(shù)
- {
- lcd_wcom(0x38); //8位數(shù)據(jù),雙列,5*7字形
- lcd_wcom(0x0c); //開啟顯示屏,關(guān)光標,光標不閃爍?
- lcd_wcom(0x06); //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位
- lcd_wcom(0x01); //清屏?
- }
- /************
- void tablex(uint tab1)//數(shù)據(jù)分解
- {
- uchar num;
- h1=tab1/1000;//1023//1
- h2=tab1%1000/100;//023//0
- h3=tab1%100/10;//23//2
- h4=tab1%10;//3
- }
- for(num=0;num<11;num++)
- {
- write_date(table[num]); //a//寫數(shù)據(jù)write_date(0x31); write_date('1');
- delay(200);
- // write_date('B');
- }
- ****************/
- /*----------------- -------------------*/
- void wsrt(unsigned char adr,unsigned char *p) //顯示位置及顯示內(nèi)容的函數(shù)
- {
- lcd_wcom(adr); //顯示位置
- while(*p!='\0') //指針指向?qū)ο笫欠駷樽址Y(jié)束符
- {
- lcd_wdat(*p); //顯示指針所指向?qū)ο?br />
- p++; //指針指向數(shù)組的下一個元素
- }
- }
- /*--------------------------------------------------------------*/
- #endif
-
復(fù)制代碼
顯示正常了,為什么只顯示0-9呢?哪里出錯了
|
|