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