#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(); //调用电机驱动函数 }} |