#include<reg51.h> #define uint unsigned int #define uchar unsignde char sbit key1=P3^0; sbit key2=P3^1; sbit key3=P3^2; sbit key4=P3^3; sbit key5=P3^4; sbit A=P2^6;//電機(jī)驅(qū)動(dòng)端口 sbit D=P2^7; sbit wei1=P2^0; sbit wei2=P2^3; sbit wei3=P2^2; sbit wei4=P2^1; sbit wxout=P2^5; //溫度 太高 報(bào)警燈 sbit clock=P2^4; sbit start=P3^5; sbit eoc=P3^6; //adc0809 驅(qū)動(dòng)端口定義 sbit oe=P3^7; unsigned char wxin=100;//定義初始值為100,轉(zhuǎn)換成實(shí)際電壓值為1.95V unsigned int getdata,ss;// 溫度過(guò)高標(biāo)志位 int num=0,count=0,se=1,flag=1;//定時(shí)標(biāo)志位;電機(jī)正反轉(zhuǎn)標(biāo)志位 int shou_num,di_num,gao_num, le,bai,shi,ge;//電機(jī)占空比標(biāo)志位 void display( ); //聲明顯示函數(shù) void delay(uint x);//聲明延時(shí)函數(shù) void qudong(); //聲明電機(jī)驅(qū)動(dòng)函數(shù) unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰數(shù)碼管 char seg[3]={0}; //延時(shí)函數(shù) void delay(uint x) { uint i; while(x--) for(i=122;i>0;i--); } //數(shù)碼管顯示函數(shù) void display() { bai=num/100;//百位 shi=num%100/10;//十位 ge=num%10;//個(gè)位 seg[0]=bai; seg[1]=shi; seg[2]=ge; wei1=0; P1=table[shou_num]; delay(1); wei1=1; wei2=0; P1=table[seg[0]]; delay(1); wei2=1; wei3=0; P1=table[seg[1]]; delay(1); wei3=1; wei4=0; P1=table[seg[2]]; delay(1); wei4=1; } //按鍵掃描函數(shù) void scan() { if(key1==0) { if(key1==0) display(); le=1; } else { le=0;A=0;D=0; } if(key2==0) { if(key2==0) { le=2; display(); } else {le=0;A=0;D=0; }} if(key3==0) { if(key3==0) { le=3; display(); } else { le=0;A=0;D=0; }} if(key4==0) //定時(shí)鍵按下 delay(5); {if(key4==0) { TR0=1; num=num+10; if(num==1000) num=990; while(key4==0) display(); }} if(key5==0) //電機(jī)正反轉(zhuǎn)按鍵 { delay(5); if(key5==0) { flag=!flag; while(key5==0) display(); }}} //電機(jī)驅(qū)動(dòng)函數(shù) void qudong() { int i; if(ss!=0) // 電機(jī)是否發(fā)熱? { if(se!=0) //定時(shí)到了嗎? {if(flag) //是否正轉(zhuǎn)? { D=0; for(i=0;i<di_num;i++) //輸出di_num個(gè)低電平 {A=0; display(); //用顯示函數(shù)做延時(shí)函數(shù),一舉兩得 } for(j=0;j<gao_num;j++) //輸出gao_num個(gè)高電平 {A=1; display(); } display(); } else //電機(jī)反轉(zhuǎn) {A=0; for(i=0;i<di_num;i++) //輸出di_num個(gè)低電平 { D=0; display(); } for(j=0;j<gao_num;j++) //輸出gao_num個(gè)高電平 { D=1; display(); }}} else { A=0; D=0; }} //按鍵處理函數(shù) void dispose() { switch(le) { case 1: shou_num=1; gao_num=1; di_num=3; break; case 2: shou_num=2; gao_num=3; di_num=1; break; case 3: shou_num=3; gao_num=1; di_num=5; break; default: break; }} //定時(shí)器T1中斷函數(shù) void time1() interrupt 3 { clock=!clock; //clock信號(hào)取反 } //AD轉(zhuǎn)換函數(shù) void adc0809() { start=0; start=1; display(); start=0; while(eoc==0) //轉(zhuǎn)換成功 oe=1; getdata=P0; oe=0; if(getdata>wxin) //如果轉(zhuǎn)換值大于100則發(fā)光二極管燈亮,電機(jī)停止 { wxout=0; ss=0; display(); } else { ss=1; wxout=1; display(); }} //主函數(shù) void main() { TMOD=0x21; //定義T1和T0的工作方式風(fēng)別為方式2和方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=216; TL1=216; EA=1; ET1=1; TR1=1; ET0=1; A=0;D=0; // 剛開(kāi)機(jī)電機(jī)不轉(zhuǎn) while(1) //無(wú)限循環(huán) { display();//調(diào)用顯示函數(shù) adc0809();//調(diào)用ADC0809函數(shù) scan(); //調(diào)用按鍵掃描函數(shù) dispose(); //調(diào)用按鍵處理函數(shù) qudong(); //調(diào)用電機(jī)驅(qū)動(dòng)函數(shù) }} |