新闻中心

EEPW首页>嵌入式系统>设计应用> 洗衣机正反转、定时、加速减速模拟源代码

洗衣机正反转、定时、加速减速模拟源代码

作者: 时间:2012-08-16 来源:网络 收藏
/*==================================================CopyLeft(CL) FORVERE WjjAll rights NOT reserved版权所无,翻版不究,但请保留此处信息http://blog.sina.com.cn/u/2150397142 any problem or suggestion mail to: 15258297408@163.com************************************************************文件名:Motor_simulation*文件说明:正反转、定时、代码*版本: The final version*芯片: STC89C52RC*晶振: (外)内部12MHz晶振*作者: Wang Jian Jun*日期: 2010年6月4日 *编译环境: keil4 proteus7 *结果: 软件测试通过,实物测试通过*说明:正反转、定时、模拟,由LCD1602显示定时时长,并倒计时显示,转速(转速由0-9数字表征),转动由数码管段位交替显示来体现================================================*/#includereg52.h> //加载C51核心库文件#includeintrins.h> //加载应用型库文件#define nop() _nop_()#define N 15536#define uint unsigned int#define uchar unsigned char //宏定义,方便写程序sbit key0 = P0^0;sbit key1 = P0^1;sbit key2 = P0^2;sbit key3 = P0^3; //定时选择、启动(再次启动)按键定义sbit pp = P2^7; //定时到报警输出口sbit SpeAdd = P0^5; //速度加sbit SpeSub = P0^4; //速度减sbit lcden=P2^2;sbit lcdrw=P2^1;sbit lcdrs=P2^0; //LCD控制端口定义uint count = 0;uint count1 = 0;uint count2 = 0;uint count3 = 0; //计数变量定义uint time = 0;uint time1 = 0; //定时时间存储变量uint Speed = 4; //速度选择 值越大速度越慢uint Direction = 0; //方向标志uint LedPa = 0; //数码管参数uchar LedCode1[] = {0Xfe, 0Xfd, 0Xfb, 0Xf7, 0Xef, 0Xdf}; //正时针显示uchar LedCode2[] = {0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe}; //逆时针显示uchar idata table[]={"Set Time:"}; //第一行提示语"Set Time:"uchar idata table1[]={"Real Speed:"}; //第一行提示语"Real Speed:"/************************************** 延时子程序 ****** 无返回值 **************************************/void DelayNS(uint dly) { uint i;for(; dly>0; dly--) for(i=0; i100; i++);}/************************************** LCD忙检测 ****** 返回忙标志 ***************************************/bit lcd_busy(){bit result;lcdrw = 1;lcdrs = 0;lcden = 1;nop();nop();nop();nop();result = (bit)(P10x80);lcden = 0;return(result);}/************************************** LCD写命令子程序 ****** 无返回值 ***************************************/void write_com(uchar com){while(lcd_busy()); //LCD忙等待lcdrs = 0;lcdrw = 0;P1 = com;DelayNS(5);lcden = 1;DelayNS(5);lcden = 0;}/************************************** LCD写数据子程序 ****** 无返回值 ***************************************/void write_data(uchar date){while(lcd_busy()); //LCD忙等待lcdrs = 1;lcdrw = 0;P1 = date;DelayNS(5);lcden = 1;DelayNS(5);lcden = 0;}/************************************** LCD初始化 ****** 无返回值 ***************************************/void lcd_init(){lcden = 0;write_com(0x38);DelayNS(5);write_com(0x0c);DelayNS(5);write_com(0x06);DelayNS(5);write_com(0x01);DelayNS(5);write_com(0x80);DelayNS(5);write_com(0x01);} /************************************** 键盘扫描子程序 ****** 无返回值 ***************************************/void keyscan(){P1=0xff;if(key0==0){DelayNS(10);if(key0==0){time = 300;time1 = time;}while(!key0); //等待按键松开} //设置300sif(key1==0){DelayNS(10);if(key1==0){time = 200;time1 = time;}while(!key1); //等待按键松开} //设置200sif(key2==0){DelayNS(10);if(key2==0){time = 100; time1 = time;}while(!key2); //等待按键松开} //设置100sif(key3==0){DelayNS(10);if(key3==0){ while(!key3); //等待按键松开TR1 = ~TR1;TR0 = ~TR0;time1 = time;pp=1;}} //启动(再次启动)}/************************************** 主程序 ****** ***************************************/void main() //主函数{uint i;lcd_init(); //LCD初始化EA = 1; //开总中断 ET0 = 1; //开定时器0中断ET1 = 1; //开定时器0中断TMOD = 0x11; //定时器0和1的工作方式都为1TH0 = 0x00; TL0 = 0x00;TH1=0x3c;TL1=0xb0; //定时初值Direction = 0; //方向设置(顺)for(i=0;i9;i++) { write_data(table[i]);DelayNS(2);} //第一行提示语"Set Time:"显示write_com(0x80+0x40); //LCD第二行起始地址for(i=0;i11;i++) { write_data(table1[i]);DelayNS(2);} //第一行提示语"Real Speed:"write_com(0x80);while(1) //主循环{keyscan(); //按键扫描table[10]=time1/100+0x30;table[11]=time1%100/10+0x30;table[12]=time1%100%10+0x30;table[13]=0x73;write_com(0x80+0x0a);for(i=10;i14;i++) { write_data(table[i]);DelayNS(2);}table1[12]=(10-Speed)+0x30;write_com(0x80+0x4c);for(i=12;i13;i++){write_data(table1[i]);DelayNS(2); }} //以上显示定时时间,转速}/************************************** 定时器0中断服务程序 ****** 无返回值 ***************************************/void timer_0() interrupt 1 {count++;if(count==(6800/Speed)){count=0;Direction=~Direction; //10s转向取反 }if(!SpeAdd) //速度加判断{DelayNS(10);while(!SpeAdd);DelayNS(10);++Speed;if(Speed == 10) //档位溢出处理{Speed = 9;}}if(!SpeSub) //速度减判断{DelayNS(10);while(!SpeSub);DelayNS(10);Speed--;if(Speed == 1) //档位溢出处理{Speed = 2;} }count1++;if(count1 == 50){ if(Direction){P3 = LedCode1[LedPa++];if(LedPa == 6){LedPa = 0;} } if(!Direction){P3 = LedCode2[LedPa++];if(LedPa == 6){LedPa = 0;}}count1 = 0;} //数码管段位交替显示TH0 = (65536 - (Speed*1000))/256;TL0 = (65536 - (Speed*1000))%256; //重装初值}/************************************** 定时器1中断服务程序 ****** 返回time1 ***************************************/void timer_1() interrupt 3 {count3++;if(count3 == 20) //定时1s{time1--; //实现倒计时if(time1 == 0){TR0 = ~TR0; //时间到关timer0TR1 = ~TR1; //时间到关timer2time1 = 0;pp=0; //时间到报警}count3 = 0;}TH1=0x3c;TL1=0xb0; //重装初值}

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭