#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;//電機驅動端口 sbit D=P2^7; sbit wei1=P2^0; sbit wei2=P2^3; sbit wei3=P2^2; sbit wei4=P2^1; sbit wxout=P2^5; //溫度 太高 報警燈 sbit clock=P2^4; sbit start=P3^5; sbit eoc=P3^6; //adc0809 驅動端口定義 sbit oe=P3^7; unsigned char wxin=100;//定義初始值為100,轉換成實際電壓值為1.95V unsigned int getdata,ss;// 溫度過高標志位 int num=0,count=0,se=1,flag=1;//定時標志位;電機正反轉標志位 int shou_num,di_num,gao_num, le,bai,shi,ge;//電機占空比標志位 void display( ); //聲明顯示函數 void delay(uint x);//聲明延時函數 void qudong(); //聲明電機驅動函數 unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰數碼管 char seg[3]={0}; //延時函數 void delay(uint x) { uint i; while(x--) for(i=122;i>0;i--); } //數碼管顯示函數 void display() { bai=num/100;//百位 shi=num%100/10;//十位 ge=num%10;//個位 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; } //按鍵掃描函數 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) //定時鍵按下 delay(5); {if(key4==0) { TR0=1; num=num+10; if(num==1000) num=990; while(key4==0) display(); }} if(key5==0) //電機正反轉按鍵 { delay(5); if(key5==0) { flag=!flag; while(key5==0) display(); }}} //電機驅動函數 void qudong() { int i; if(ss!=0) // 電機是否發熱? { if(se!=0) //定時到了嗎? {if(flag) //是否正轉? { D=0; for(i=0;i<di_num;i++) //輸出di_num個低電平 {A=0; display(); //用顯示函數做延時函數,一舉兩得 } for(j=0;j<gao_num;j++) //輸出gao_num個高電平 {A=1; display(); } display(); } else //電機反轉 {A=0; for(i=0;i<di_num;i++) //輸出di_num個低電平 { D=0; display(); } for(j=0;j<gao_num;j++) //輸出gao_num個高電平 { D=1; display(); }}} else { A=0; D=0; }} //按鍵處理函數 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; }} //定時器T1中斷函數 void time1() interrupt 3 { clock=!clock; //clock信號取反 } //AD轉換函數 void adc0809() { start=0; start=1; display(); start=0; while(eoc==0) //轉換成功 oe=1; getdata=P0; oe=0; if(getdata>wxin) //如果轉換值大于100則發光二極管燈亮,電機停止 { wxout=0; ss=0; display(); } else { ss=1; wxout=1; display(); }} //主函數 void main() { TMOD=0x21; //定義T1和T0的工作方式風別為方式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; // 剛開機電機不轉 while(1) //無限循環 { display();//調用顯示函數 adc0809();//調用ADC0809函數 scan(); //調用按鍵掃描函數 dispose(); //調用按鍵處理函數 qudong(); //調用電機驅動函數 }} |