下面的是程序,和仿真,是之前一位壇友分享的,我畫了一個(gè)PCB,PCB的原理圖如下:
51hei圖片20200519144355.png (208.12 KB, 下載次數(shù): 45)
下載附件
仿真圖
2020-5-19 14:46 上傳
51hei圖片20200519144420.png (128.04 KB, 下載次數(shù): 41)
下載附件
原理圖
2020-5-19 14:46 上傳
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int /***************引腳聲明*********************/ #define lcd P0 sbit rs=P2^7; //LCD液晶控制端 sbit en=P2^6; sbit SPK=P1^7; //蜂鳴器引腳 sbit CS=P1^2; //將CS位定義為P1.2引腳 sbit CLK=P1^0; //將CLK位定義為P1.0引腳 sbit DIO=P1^1; //將DIO位定義為P1.1引腳 sbit key=P2^5; //定義按鍵引腳 sbit a=P2^0; //模擬量通道選擇端 sbit b=P2^1; //模擬量通道選擇端 sbit c=P2^2; //模擬量通道選擇端
/***********LCD顯示數(shù)組**************************/ uchar code table0[]=" DCV(0-5V) "; uchar table1[]=" V=0000.00 v"; uchar code table2[]=" DCI(0-100mA)"; uchar table3[]=" I=0000.00mA"; uchar code table4[]=" R(0-1k) "; uchar table5[]=" R=000.0 ";
/***************全局變量************************/ uchar flag=0; //換擋標(biāo)志位
void delay(uint count) //延時(shí) { uint i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); }
/*************LCD1602驅(qū)動(dòng)程序************************/ void w_cmd(uchar com) //lcd1602寫命令 { rs=0; lcd=com; en=1; delay(5); en=0; }
void w_data(uchar dat) //lcd1602讀數(shù)據(jù) { rs=1; lcd=dat; en=1; delay(5); en=0; }
void w_str(uchar *s) //lcd1602寫字符串 { while(*s) w_data(*s++); }
void init() //lcd1602初始化 { en=0; w_cmd(0x38); w_cmd(0x0c); w_cmd(0x06); w_cmd(0x01); }
/***************************************************** 函數(shù)功能:將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào) ***************************************************/ unsigned char A_D() { unsigned char i,dat; CS=1; //一個(gè)轉(zhuǎn)換周期開始 CLK=0; //為第一個(gè)脈沖作準(zhǔn)備 CS=0; //CS置0,片選有效 DIO=1; //DIO置1,規(guī)定的起始信號(hào) CLK=1; //第一個(gè)脈沖 CLK=0; //第一個(gè)脈沖的下降沿,此前DIO必須是高電平 DIO=1; //DIO置1, 通道選擇信號(hào) CLK=1; //第二個(gè)脈沖,第2、3個(gè)脈沖下沉之前,DI必須跟別輸入兩位數(shù)據(jù)用于選擇通道,這里選通道CH0 CLK=0; //第二個(gè)脈沖下降沿
DIO=0; //DI置0,選擇通道0 CLK=1; //第三個(gè)脈沖 CLK=0; //第三個(gè)脈沖下降沿 DIO=1; //第三個(gè)脈沖下沉之后,輸入端DIO失去作用,應(yīng)置1 CLK=1; //第四個(gè)脈沖 for(i=0;i<8;i++) //高位在前 { CLK=1; //第四個(gè)脈沖 CLK=0; dat<<=1; //將下面儲(chǔ)存的低位數(shù)據(jù)向右移 dat|=(unsigned char)DIO; //將輸出數(shù)據(jù)DIO通過或運(yùn)算儲(chǔ)存在dat最低位 } CS=1; //片選無效 return dat; //將讀書的數(shù)據(jù)返回 } /**********************報(bào)警程序************************/ void BaoJing(void) { uinti, j; for(i = 0; i < 200; i++) //產(chǎn)生脈沖使蜂鳴器發(fā)出聲音 { SPK = 0; for (j = 0; j < 100; j++); SPK = 1; for (j = 0; j < 100; j++); } } /*********************按鍵判定************************************/ void keyscan() { if(key==0) //判斷是否按下 { delay(10); if(key==0) { while(!key); flag++; if(flag>3)flag=0;
} } } /*******************定時(shí)器1初始化程序******************/ void Timer1_Init(void) // { TMOD=0x11; TH1= ( 65535 - 50000 ) / 256; //0.2ms TL1= ( 65535 - 50000 ) % 256; ET1=1; TR1=1; EA=1; } /*******************定時(shí)器1中斷程序********************/ void Timer1 ( void ) interrupt 3 //定時(shí)器1中斷函數(shù) 0.2ms { TH1= ( 65535 - 50000) / 256; TL1= ( 65535 - 50000 ) % 256; keyscan(); //按鍵判定 }
/*主函數(shù)*/ void main() { uint adval; unsigned long int temp; init(); //液晶初始化 Timer1_Init(); //定時(shí)器1初始化 while(1) {
if(flag==0) //直流電壓測(cè)量 { c=0;b=0;a=0; //通道選擇 w_cmd(0x80); w_str(table0); adval=A_D(); //進(jìn)行A/D轉(zhuǎn)換 temp=adval*5.0/255* 2*100; //轉(zhuǎn)換成實(shí)際電壓并放大100倍 if(temp>500) { BaoJing(); //超量程報(bào)警 w_cmd(0xc0+0x00); w_str(" V= .OL v "); delay(500); } else { table1[4]=temp/100000+0x30; table1[5]=temp%100000/10000+0x30; table1[6]=temp%10000/1000+0x30; table1[7]=temp%1000/100+0x30; table1[9]=temp%100/10+0x30; table1[10]=temp%10+0x30; w_cmd(0xc0+0x00); w_str(table1); delay(10); } }
if(flag==1) // 直流電流測(cè)量 { c=0;b=0;a=1; //通道選擇 w_cmd(0x80); w_str(table2); adval=A_D(); //進(jìn)行A/D轉(zhuǎn)換 temp=adval*0.1/255*5000000/10; if(temp>10000) { BaoJing(); //超量程報(bào)警 w_cmd(0xc0+0x00); w_str(" I= .OL mA "); delay(500); } else { table3[4]=temp/100000+0x30; table3[5]=temp%100000/10000+0x30; table3[6]=temp%10000/1000+0x30; table3[7]=temp%1000/100+0x30; table3[9]=temp%100/10+0x30; table3[10]=temp%10+0x30; w_cmd(0xc0+0); w_str(table3);
delay(10); } } if(flag==2) // 電阻測(cè)量 { c=0;b=1;a=0; //通道選擇 adval=A_D(); //進(jìn)行A/D轉(zhuǎn)換 temp=adval*1.0/(255-adval)*1000; if(temp>50000) { BaoJing(); //超量程報(bào)警 w_cmd(0xc0+0x00); w_str(" R= .OL k "); delay(500); } else { w_cmd(0x80); w_str(table4);
table5[4]=temp/1000+0x30; table5[5]=temp%1000/100+0x30; table5[6]=temp%100/10+0x30; table5[8]=temp%10+0x30; w_cmd(0xc0+0); w_str(table5); delay(10); } } } }
|