|
本帖最后由 daniu 于 2014-12-26 21:31 編輯
STC12C5406AD 晶振頻率為12MHz 指令周期:本程序取:1.0us/6倍。
本程序已調(diào)試完成:
功能說明:STC12C5406AD+74HC164+1602液晶顯示的電壓表。
測(cè)量電壓:采用10位AD測(cè)量,測(cè)量結(jié)果非常準(zhǔn)確。
- #include "stc12c5410ad.h"//頭文件
- #include "intrins.h"
- #define uchar unsigned char//宏定義
- #define uint unsigned int//宏定義
- sbit RS=P3^4;//定義I/O的硬件接口
- sbit E=P3^7;
- sbit A_B=P3^2;
- sbit CP=P3^3;
- sbit Simulation=P1^7;//模擬電壓輸入
- uint temp;
- uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//1602:0-9 數(shù)字
- uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//溫度符號(hào)
- uchar DispBuf[6]; //6字節(jié)的顯示緩沖區(qū)
- char char_char_1[]={" www#mdizi#com "};//定義字符串
- void delay(uint z)//1ms延時(shí)
- {
- uchar x,x1;
- for(;z>0;z--)
- {
- for(x=0;x<114;x++)
- {
- for(x1=0;x1<1;x1++);
- }
- }
- }
- void delay1()//經(jīng)精準(zhǔn)計(jì)算,該段程序1次延時(shí)時(shí)間為 19.53us;多次調(diào)用需要重新計(jì)算。
- {
- _nop_();
- _nop_();
- _nop_();
- }
- void write_Directive(uchar a)//寫指令
- {
- uchar i,temp;
- for(i=0;i<8;i++)
- {
- temp=a;
- temp&=0x80;
- if(temp==0x80)
- A_B=1;
- else
- A_B=0;
- a=a<<1;
- delay1();
- CP=0;
- delay1();
- CP=1;
- delay1();
- CP=0;
- }
- RS=0;
- delay(3);
- E=0;
- delay(3);
- E=1;
- delay(3);
- E=0;
- delay(3);
- }
- void write_Data(uchar a)//寫數(shù)據(jù)
- {
- uchar i,temp;
- for(i=0;i<8;i++)
- {
- temp=a;
- temp&=0x80;
- if(temp==0x80)
- A_B=1;
- else
- A_B=0;
- a=a<<1;
- delay1();
- CP=0;
- delay1();
- CP=1;
- delay1();
- }
- RS=1;
- delay(3);
- E=0;
- delay(3);
- E=1;
- delay(3);
- E=0;
- delay(3);
- }
- void init()//初始化
- {
- uchar i;
- CP=1;
- A_B=1;
- delay(15);
- write_Directive(0x38);
- delay(5);
- write_Directive(0x38);
- delay(5);
- write_Directive(0x38);
- write_Directive(0x01);
- write_Directive(0x02);///初始化后數(shù)據(jù)地址為0x80;即第一行,第一個(gè)位置
- write_Directive(0x0c);
- write_Directive(0x80+0x40);//第二行第一位地址
- for(i=0;i<16;i++)
- {
- write_Data(char_char_1[ i]);//顯示字符串" wwwmdizicom "
- }
- }
- void Temperature_symbol()//溫度符號(hào)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- write_Directive(0x40+i);//寫入溫度符號(hào)
- write_Data(DispTab_2[ i]);
- }
- }
- void write_Data_String()//顯示時(shí)間函數(shù)
- {
- uchar i;
- unsigned int mm;
- DispBuf[0]=temp/10000;//顯示百位
- mm=temp%10000;
- DispBuf[1]=mm/1000;//顯示十位
- mm=mm%1000;
- DispBuf[2]=mm/100;//顯示個(gè)位
- mm=mm%100;
- DispBuf[3]=mm/10;//顯示小數(shù)點(diǎn):0.001
- DispBuf[4]=mm%10;//顯示小數(shù)點(diǎn):0.0001
- i=DispBuf[0];
- DispBuf[0]=DispTab_1[ i];//查表,取字符
- i=DispBuf[1];
- DispBuf[1]=DispTab_1[ i];
- i=DispBuf[2];
- DispBuf[2]=DispTab_1[ i];
- i=DispBuf[3];
- DispBuf[3]=DispTab_1[ i];
- i=DispBuf[4];
- DispBuf[4]=DispTab_1[ i];
- write_Directive(0x80+0x04);//第一行,第五個(gè)位置地址
- write_Data(DispBuf[0]);//第一行,第五個(gè)位置
- write_Data('.');//第一行,第六個(gè)位置
- write_Data(DispBuf[1]);//第一行,第七個(gè)位置
- write_Data(DispBuf[2]);//第一行,第八個(gè)位置
- write_Data(DispBuf[3]);//第一行,第九個(gè)位置
- write_Data(DispBuf[4]);//第一行,第十個(gè)位置
- write_Data('V');
- }
- void I_O_init()
- {
- P1M1=0x80;
- P1M0=0x80;
- }
- void ADC_Conversion()//ADC開始轉(zhuǎn)
- {
- ADC_CONTR=0x87;
- delay(1);
- ADC_CONTR=0x8f;
- delay(1);
- //while((ADC_CONTR==0x8f));
- ADC_CONTR=0x87;
- delay(1);
- }
- void ADC_Calculated()//ADC計(jì)算
- {
- float temp1;
- float temp2;
- uint temp3;
- temp=ADC_DATA;//高8位
- temp1=temp;
- temp=temp1/256*5*10000;//高8位計(jì)算
- temp3=ADC_LOW2;//低2位
- temp2=temp3;
- temp3=temp2/256*5*10000;//低2位計(jì)算
- temp=temp+temp3;//高8位的計(jì)算值+低2位的計(jì)算值=實(shí)際值
- }
- void main()
- {
- init();
- I_O_init();//I/O口初始化
- Temperature_symbol();//寫入溫度符號(hào)
- while(1)
- {
- ADC_Conversion();//ADC開始轉(zhuǎn)
- ADC_Calculated();//ADC計(jì)算
- write_Data_String();//顯示溫度
- delay(1000);
- }
- }
-
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|