|
本帖最后由 daniu 于 2014-12-26 21:31 編輯
STC12C5406AD 晶振頻率為12MHz 指令周期:本程序取:1.0us/6倍。
本程序已調試完成:
功能說明:STC12C5406AD+74HC164+1602液晶顯示的電壓表。
測量電壓:采用10位AD測量,測量結果非常準確。
- #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 數字
- uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//溫度符號
- uchar DispBuf[6]; //6字節的顯示緩沖區
- char char_char_1[]={" www#mdizi#com "};//定義字符串
- void delay(uint z)//1ms延時
- {
- uchar x,x1;
- for(;z>0;z--)
- {
- for(x=0;x<114;x++)
- {
- for(x1=0;x1<1;x1++);
- }
- }
- }
- void delay1()//經精準計算,該段程序1次延時時間為 19.53us;多次調用需要重新計算。
- {
- _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)//寫數據
- {
- 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);///初始化后數據地址為0x80;即第一行,第一個位置
- write_Directive(0x0c);
- write_Directive(0x80+0x40);//第二行第一位地址
- for(i=0;i<16;i++)
- {
- write_Data(char_char_1[ i]);//顯示字符串" wwwmdizicom "
- }
- }
- void Temperature_symbol()//溫度符號
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- write_Directive(0x40+i);//寫入溫度符號
- write_Data(DispTab_2[ i]);
- }
- }
- void write_Data_String()//顯示時間函數
- {
- uchar i;
- unsigned int mm;
- DispBuf[0]=temp/10000;//顯示百位
- mm=temp%10000;
- DispBuf[1]=mm/1000;//顯示十位
- mm=mm%1000;
- DispBuf[2]=mm/100;//顯示個位
- mm=mm%100;
- DispBuf[3]=mm/10;//顯示小數點:0.001
- DispBuf[4]=mm%10;//顯示小數點: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);//第一行,第五個位置地址
- write_Data(DispBuf[0]);//第一行,第五個位置
- write_Data('.');//第一行,第六個位置
- write_Data(DispBuf[1]);//第一行,第七個位置
- write_Data(DispBuf[2]);//第一行,第八個位置
- write_Data(DispBuf[3]);//第一行,第九個位置
- write_Data(DispBuf[4]);//第一行,第十個位置
- write_Data('V');
- }
- void I_O_init()
- {
- P1M1=0x80;
- P1M0=0x80;
- }
- void ADC_Conversion()//ADC開始轉
- {
- ADC_CONTR=0x87;
- delay(1);
- ADC_CONTR=0x8f;
- delay(1);
- //while((ADC_CONTR==0x8f));
- ADC_CONTR=0x87;
- delay(1);
- }
- void ADC_Calculated()//ADC計算
- {
- float temp1;
- float temp2;
- uint temp3;
- temp=ADC_DATA;//高8位
- temp1=temp;
- temp=temp1/256*5*10000;//高8位計算
- temp3=ADC_LOW2;//低2位
- temp2=temp3;
- temp3=temp2/256*5*10000;//低2位計算
- temp=temp+temp3;//高8位的計算值+低2位的計算值=實際值
- }
- void main()
- {
- init();
- I_O_init();//I/O口初始化
- Temperature_symbol();//寫入溫度符號
- while(1)
- {
- ADC_Conversion();//ADC開始轉
- ADC_Calculated();//ADC計算
- write_Data_String();//顯示溫度
- delay(1000);
- }
- }
-
復制代碼
|
評分
-
查看全部評分
|