Altium Designer画的洗衣机控制器原理图和PCB图如下:(51hei附件中可下载工程文件)
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include<intrins.h> //因为要用到左右移函数,所以加入这个头文件
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- sbit MOTOA = P1^0;//步进机控制
- sbit MOTOB = P1^1;
- sbit MOTOC = P1^2;
- sbit MOTOD = P1^3;
- sbit k1 = P3^2;//按键 定时
- sbit k2 = P3^1;//按键 启动
- sbit k3 = P3^3;
- sbit LSA =P2^2; //段选
- sbit LSB =P2^3;
- sbit LSC =P2^4;
- sbit beep =P2^0; //蜂鸣器
- sbit right =P2^5; //灯显示状态
- sbit opposite=P2^6;
- sbit stort =P2^7;
- #define speed1 1
- #define speed2 2
- #define speed3 3
- u8 code FFW[]=
- {
- 0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
- }; //反转
- u8 code REV[]=
- {
- 0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
- }; //正转
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
- u8 DisplayData[8];
-
- u16 i,second = 0,time=0,start=0,X,Y,Z=0,f,fengtime=0,fengstop_sign=0,interval=speed1,num=0;
- void delay(u16 i)
- {
-
- while(i--);
- }
- void delay2ms500us(void) //误差 0us
- {
- unsigned char a,b;
- for(b=227;b>0;b--)
- for(a=4;a>0;a--);
- }
- void delay2ms(void) //误差 0us
- {
- u8 a,b;
- for(b=4;b>0;b--)
- for(a=248;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- void delay1ms200us(void) //误差 0us
- {
- unsigned char a,b;
- for(b=171;b>0;b--)
- for(a=2;a>0;a--);
- }
- void keyprosk2()
- {
- if(k2==0) //检测按键K2是否按下
- {
- delay(1000); //消除抖动 一般大约10ms
- if(k2==0) //再次判断按键是否按下
- {
- time=start; //启动键赋值
-
- }
- while(!k2); //检测按键是否松开
- }
- }
- void keyprosk3() //控制转速 三档转速
- {
- static u16 speed=1,m=0; //m是过滤第一次进来的第一档(因为interval初值是185
- //第一次换挡需要按两次才能进入二档) 所以消掉
- if(k3==0) //检测按键K2是否按下
- {
- delay(1900); //消除抖动 一般大约10ms
- if(k3==0) //再次判断按键是否按下
- {
- if(speed==4)
- {
- speed=1;
- }
- if(interval==speed1&&m==0)
- {
- speed=2;
- }
- switch(speed)
- {
- case(1):
- interval=speed1; break;
- case(2):
- interval=speed2; break;
- case(3):
- interval=speed3; break;
- }
-
- }
- while(!k3); //检测按键是否松开
- speed++;
- m++;
- }
- }
- void tiaosu() //调速函数
- {
- if(interval==1)
- {
- delay1ms200us();
- }
- if(interval==2)
- {
- delay2ms();
- }
- if(interval==3)
- {
- delay2ms500us();
- }
- }
- void Timer0() interrupt 1
- {
- static u16 i;
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- i++;
- if(i==1000)
- {
- i=0;
- if(time>0)
- {
- time --;
- second ++;
- }
- if(fengstop_sign==1) //时间到后 开始计时 3秒后蜂鸣器停止响
- {
- fengtime++;
- }
-
- }
- }
- void Int0() interrupt 0
- {
- if(k1==0) //检测按键k1是否按下
- {
- delay(1900); //消除抖动 一般约10ms
- if(k1==0) //再次判断按键是否按下
- {
- start=start+60;
- second=0;
- }
- while(!k1); //检测按键是否松开
- }
- }
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- }
- P0=DisplayData[i];//发送段码
- delay(100); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- }
- void Timer0Init()
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- IT0=0;//低电平触发
- EX0=1;//打开外部中断0
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- ET0=1;//打开定时器0中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
- }
- void wash_finalstop()
- {
- MOTOA = 0;
- MOTOB = 0;
- MOTOC = 0;
- MOTOD = 0;
- right = 1;
- opposite=1;
- stort =0;
-
-
- }
- void washstop()
- {
- MOTOA = 0;
- MOTOB = 0;
- MOTOC = 0;
- MOTOD = 0;
- right = 1;
- opposite=1;
- stort =0;
-
- }
- void washright()
- {
- u8 j;
- for(j=0;j<8;j++)
- {
-
- P1 = REV[j];
- tiaosu();
-
-
- }
-
-
- right = 0;
- opposite=1;
- stort =1;
-
-
- }
- void washopposite()
- {
- u8 j;
- for(j=0;j<8;j++)
- {
- P1 = FFW[j];
- tiaosu();
- }
-
-
- right = 1;
- opposite=0;
- stort =1;
-
- }
- void main()
- {
-
- Timer0Init();
-
- P1=0X00;
-
- while(1)
- {
-
- if(time>0&&((second%60)<20))
- {
- washright();
- }
-
- else if(time>0&&((second%60)<30))
- {
- washstop();
-
- }
-
- else if(time>0&&((second%60)<50))
- {
- washopposite();
- }
-
- else if(time>0&&((second%60)<60))
- {
- washstop();
-
- }
- else
- {
-
-
-
-
- }
-
-
- DisplayData[0] = smgduan[((start/60)-(second/60)) % 100 / 10];
- DisplayData[1] = smgduan[((start/60)-(second/60)) %10];
- DisplayData[2] = 0x00;
- DisplayData[3] = 0x00;
- DisplayData[4] = 0x00;
- DisplayData[5] = 0x00;
- DisplayData[6] = 0x00;
- DisplayData[7] = 0x00;
- DigDisplay();
- keyprosk2();
- keyprosk3();
-
- if(time==0&&start>0&&second>0)
- {
- fengstop_sign=1;
-
- }
- if(fengstop_sign==1) //判断是时间到了才停止蜂鸣 而不是一开始蜂鸣器就响
- {
- wash_finalstop();
- beep=0;
- while(1)
- {
- DisplayData[0] = smgduan[((start/60)-(second/60)) % 100 / 10];
- DisplayData[1] = smgduan[((start/60)-(second/60)) %10];
- DisplayData[2] = 0x00;
- DisplayData[3] = 0x00;
- DisplayData[4] = 0x00;
- DisplayData[5] = 0x00;
- DisplayData[6] = 0x00;
- DisplayData[7] = 0x00;
- DigDisplay();
- if(fengtime>=3)
- {
- beep=1;
- }
- }
-
- }
-
-
- }
-
- }
-
复制代码
全部资料51hei下载地址:
洗衣机控制器.rar
(610.82 KB, 下载次数: 120)
|