/*占空比,方波,直流电机高电平有效*/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit wela=P2^0; sbit dula=P2^1; uchar code tablewe[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code tabledu[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Data[8]; sbit dc1=P1^1; //定义电机信号输出端口1 sbit dc2=P1^2; //定义电机信号输出端口2 void delay(uchar t) { while(--t); } void delayMS(uchar t) { while(t--) { delay(245); delay(245); } } void init(); uchar keyscan(); void display(uchar f,uchar n); void main() { uchar num; init(); Data[0]=0x5E; //‘d’ Data[1]=0x39; //'c' Data[2]=0x06; //'1' Data[5]=0x5E; //'d' Data[6]=0x39; //'c' Data[7]=0x5b; //'2' while(1) { num=keyscan(); switch (num) { case 1: dc1=!dc1; //电平取反 Data[0]=0x5E; //'d' Data[1]=0x39; //'c' Data[2]=0x06; //'1' if(dc1) //高电平 { Data[5]=0x3F; //'o' Data[6]=0x54; //'n' Data[7]=0; } else { Data[5]=0x3F; //'o' Data[6]=0x71; //'f' Data[7]=0x71; //'f' } break; case 2: dc2=!dc2; //电平取反 Data[0]=0x5E; //'d' Data[1]=0x39; //'c' Data[2]=0x5b; //'2' if(dc2) //高电平 { Data[5]=0x3F; //'o' Data[6]=0x54; //'n' Data[7]=0; } else { Data[5]=0x3F; //'o' Data[6]=0x71; //'f' Data[7]=0x71; //'f' } break; } } } void init() //初始化定时器 { TMOD=0X01; EA=1; ET0=1; TR0=1; } uchar keyscan() //键盘扫描函数 { uchar value; if(P3!=0xff) { delayMS(10); if(P3!=0xff) { value=P3; while(P3!=0xff); switch(value) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default :return 0;break; } } } return 0; } void display(uchar f,uchar n) //显示函数 { static uchar i; P0=0; dula=1; dula=0; P0=tablewe[i+f]; wela=1; wela=0; P0=Data[i]; dula=1; dula=0; i++; if(i==n) i=0; } void timer0() interrupt 1 //定时器0中断 { TH0=(65536-2000)/256; TL0=(65536-2000)%256; display(0,8); }