Altium Designer畫的洗衣機控制器原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.jpg (69.59 KB, 下載次數: 56)
下載附件
2018-12-6 20:14 上傳
0.png (58.13 KB, 下載次數: 45)
下載附件
2018-12-6 20:15 上傳
0.png (9.17 KB, 下載次數: 56)
下載附件
2018-12-6 20:15 上傳
- #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)
2018-12-6 13:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|