/*********************************************///如下程序使用了計數(shù)器T0,外部中斷INT0,普通I/O口P3.5//調(diào)用了用于顯示的液晶12864的頭文件/*********************************************/#include reg51.h>#include 12864A.H> //調(diào)用12864模塊#define uchar unsigned char#define uint unsigned intsbit ICL7135_POL=P3^5;sbit ICL7135_BUSY=P3^2; //接外部中斷口sbit ICL7135_CLK=P3^4; //接計數(shù)器口 int ICL7135_count; //計數(shù)存儲單元uint ICL7135_out; //A轉(zhuǎn)D后數(shù)據(jù)的10000倍,存于此單元bit ICL7135_flag; //輸出正負(fù)的位標(biāo)志float ICL7135_ref=2.0; //定義基準(zhǔn)電壓變量,方便修改Init_ICL7135() //初始化子程序{TMOD=0x05; //T0工作于計數(shù)模式EA=1;TL0=0;TH0=0;EX0=1;IT0=1;}/*---------------------------------------------------------------*/int0() interrupt 0{float a; //浮點(diǎn)型轉(zhuǎn)整型中間變量uchar A1,A2,A3,A4,A5,B1,B2,B3,B4,B5; //萬、千、百、十、個位TR0=0; //停止計數(shù)ICL7135_count=TH0*256+TL0; //16方式計得的數(shù)ICL7135_flag=ICL7135_POL; //判斷輸出是正是負(fù)a=ICL7135_ref*(ICL7135_count-10000);
// 正向積分為10000個脈沖ICL7135輸出放大10000倍后的采樣值 if(a0)
//此句是為了避免因計數(shù)誤差而導(dǎo)致a0而出現(xiàn)的錯誤顯示。
(前提ICL7135_count必須為有符號變量)a=0;ICL7135_out=a; //浮點(diǎn)型轉(zhuǎn)整型。//被測電壓的各位A1=ICL7135_out/10000; A2=ICL7135_out%10000/1000; A3=ICL7135_out%1000/100;A4=ICL7135_out%100/10;A5=ICL7135_out%10;//AD采樣的源碼各位B1=ICL7135_count/10000;B2=ICL7135_count%10000/1000;B3=ICL7135_count%1000/100;B4=ICL7135_count%100/10;B5=ICL7135_count%10;/*****************************************************************///顯示模塊 此處用液晶顯示器12864 可替換為CH451驅(qū)動的數(shù)碼管/*****************************************************************/LCD_Setaddress(1,1); //送顯示的縱橫坐標(biāo)print("當(dāng)前測試電壓:"); LCD_Setaddress(2,3);if(ICL7135_flag) //如果為正數(shù){ LCD_write_dat(0x30+A1); LCD_write_dat(0x2E); //顯示小數(shù)點(diǎn)LCD_write_dat(0x30+A2);LCD_write_dat(0x30+A3);LCD_write_dat(0x30+A4);LCD_write_dat(0x30+A5);}else //如果為負(fù)數(shù){LCD_write_dat(0x2d); //顯示負(fù)號LCD_write_dat(0x30+A1);LCD_write_dat(0x2E);LCD_write_dat(0x30+A2);LCD_write_dat(0x30+A3);LCD_write_dat(0x30+A4);LCD_write_dat(0x30+A5);}LCD_Setaddress(3,1); //送顯示的縱橫坐標(biāo)print("輸出源碼:"); LCD_Setaddress(4,3);LCD_write_dat(0x30+B1); LCD_write_dat(0x30+B2);LCD_write_dat(0x30+B3);LCD_write_dat(0x30+B4);LCD_write_dat(0x30+B5);/**********************************************************************/TL0=0; //重新轉(zhuǎn)載數(shù)據(jù) TH0=0; }/*-----------------------------------------------------------*/void main(){LCD_init(); //初始化12864Init_ICL7135(); //初始化ICL7135while(1){while(ICL7135_BUSY==0);TR0=1;}}//程序格式粗糙,無暇整理,僅為備份。如需參考,不明白處可留言。
評論