1、利用MCS-51内部定时器定时,实现倒计时的时间控和显示; 2、能按键调整洗衣机洗涤类型; 3、正反转控制,到时间蜂鸣器报警;
制作成功的全自动洗衣机实物图:
单片机原理图:
系统C语言程序: - #include <REG51.H>
- #define uchar unsigned char //类型定义,方便书写
- #define uint unsigned int
- uchar code roundz[] ={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; //步进电机正转控制数组
- uchar code roundf[] ={0x08,0x0C,0x04,0x06,0x02,0x03,0x01,0x09}; //步进电机反转控制数组
- uchar code disptab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极LED显示器显示码
- sbit beep=P2^7;
- sbit baiwei=P2^0;
- sbit shiwei=P2^1;
- sbit gewei=P2^2; //数码管位选
- uint num,sec;
- #define K1 0x06
- #define K20x5
- #define K3 0x3 //按键码,分别检测三个按键是否有按下
- sbit in_water=P3^3;
- sbit out_water=P3^4;
- sbit LED_bz=P3^5;
- sbit LED_qr=P3^6;
- sbit LED_sg=P3^7; //5个LED灯,分别为进水,出水,标准,轻柔和甩干
- //**************基本延迟函数************************************************
- void delay(uint dcnt) // 延迟时间为dcntms
- {
- uint i,j;
- for(i=dcnt;i>0;i--)
- for(j=120;j>0;j--);
- }
- //************定时器0控制倒计时*****************************************
- void count_down() interrupt 1
- {
- int count ;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //定时器0每50ms产生一次中断;
- count ++;
- if(count == 20) //每50*20=1s sec的值减1
- {
- count =0;
- sec--;
- if(sec==0) //计时结束时,关闭总中断,电机停止转动。
- {
- EA=0;
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;
- while(1);
- }
- }
- }
- //***************倒计时的数码管显示程序*******************************
- void display() interrupt 3 //利用定时器1来进行数码管显示
- {
- TH1=(65536-5000)/256; //每5ms扫描一次
- TL1=(65536-5000)%256;
- num=(num%3);
- P0=0xff; //消影
- switch(num)
- {
- case 0:
- P0=disptab[sec/100];
- baiwei=1; shiwei=0;gewei=0;
- break;
- case 1:
- P0=disptab[(sec/10)%10];
- baiwei=0; shiwei=1; gewei=0;
- break;
- case 2:
- P0=disptab[sec%10];
- baiwei=0; shiwei=0; gewei=1;
- break;
- default:break;
- }
- num++;
- }
- //************************步进电机正转控制函数******************************
- void RotateWise(uinttime,uchar stepcnt) //time为转一步时间,stepcnt为圈数
- {
- uchar i ,j;
- for(i=0;i<stepcnt;i++)
- {
- for(j=0;j<8;j++)
- {
- P1= roundz[j] ;
- delay (time); //更改delay里数值可改变转速,转一圈时间为time*8 ms
- }
- }
- }
- //***********************步进电机反转控制函数****************************
- void ContraRotate(uinttime,uchar stepcnt) //time为转一步时间,stepcnt为圈数
- {
- uchar i ,j;
- for(i=0;i<stepcnt;i++)
- {
- for(j=0;j<8;j++)
- {
- P1= roundf[j] ; //更改delay里数值可改变转速,转一圈时间为time*8 ms
- delay (time);
- }
- }
- }
- //**************************洗涤子程序****************************************
- void xidi()
- {
- uint i;
- in_water = 0;
- delay(9000); //开水阀,进水9s
- in_water = 1; //关水阀
- delay(1000);
- for(i=10;i>0;i--) //转动十次
- {
- RotateWise(50,10) ; //正转10圈,转速为50ms*8
- delay(1000); //停止一秒
- ContraRotate(50,10) ; //反转10圈,转速为50ms*8
- delay(1000);
- }
- }
- //**************************漂洗子程序****************************************
- void piaoxi()
- {
- uint i;
- in_water = 0;
- delay(9000); //开水阀,进水9s
- in_water = 1; //关水阀
- delay(1000);
- for(i=5;i>0;i--) //转动五次
- {
- RotateWise(100,10) ; //正转10圈,转速为100ms*8
- delay(1000); //停止一秒
- ContraRotate(100,10) ; //反转10圈,转速为100ms*8
- delay(1000);
- }
- }
- //*********************脱水子程序*******************************************
- void tuoshui()
- {
- uint i;
- out_water = 0; //打开排水阀
- delay(9000); //排水9s
- for(i=10;i>0;i--) //转动十次
- {
- RotateWise(50,10) ; //正转10圈,转速为50ms*8
- }
- beep=0;
- delay(1000); //蜂鸣器警报
- beep=1;
- out_water =1 ; //甩干完毕,关闭水阀
- }
- //********************标准模式************************************************
- void biaozhun()
- { sec=360; //设定倒计时数目
- LED_bz = 0; //点亮“标准”LED灯
- xidi(); //洗涤
- piaoxi();
- piaoxi(); //2次漂洗
- tuoshui(); //脱水
- LED_bz=1; //熄灭LED灯
- }
- //*********************轻揉模式********************************************
- void qingrou()
- { sec=250; //设定倒计时数目
- LED_qr = 0; //点亮“轻揉”LED灯
- piaoxi();
- piaoxi(); //2次漂洗
- tuoshui(); //脱水
- LED_qr = 1; //熄灭LED灯
- }
- //**********************甩干模式********************************************
- void shuaigan()
- {
- sec=50; //设定倒计时数目
- LED_sg = 0; //点亮“甩干”LED灯
- tuoshui(); //脱水
- LED_sg = 1; //熄灭LED灯
- }
- //********************键盘扫描程序****************************************
- uchar scankey()
- {
- int key;
- if((P3&0x07)== 0x07)
- return(0xff); //消抖
- delay(30);
- if((P3&0x07)== 0x07)
- return(0xff);
- key = P3&0x07;
- while ((P3&0x07)!=0x07); //当有按键按下的时候,返回key值,判断哪个按键被按下
- return key;
- }
- //******************主函数************************************************
- void main()
- {
- TMOD|=0x11; //定时器0和定时器1模式 工作方式1
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //定时0器寄存器装初值,每50ms产生一次中断
- EA=0; //关总中断
- ET0=1; //开定时器0中断
- TH1=(65536-5000)/256; //定时器1寄存器装初值,没5ms产生一次中断
- TL1=(65536-5000)%256;
- ET1=1; //打开定时器1中断
- TR0=1;
- TR1=1; //打开定时器0和定时器1
- while(1)
- {
- uchar key = scankey();
- if (key == K1)
- {
- EA=1; //开总中断[em12]
- biaozhun();
- }
- if (key == K2)
- {
- EA=1;
- qingrou();
- }
- if (key == K3)
- {
- EA=1;
- shuaigan();
- } } }
复制代码
全部资料下载地址:
main.doc
(5.74 KB, 下载次数: 74)
|