“天华杯”示例题_电风扇模拟控制系统_参考程序

2024-07-09
| 10页
| 81人阅读
| 0人下载

内容正文:

电风扇模拟控制系统设计 一、功能简述: 电风扇模拟控制系统能模拟电风扇工作,主要由电机控制电路、电机过热检测与保护电路、定时和状态显示电路等组成。 二、设计任务: 1.用4位数码管实时显示电风扇的工作状态,最高位显示风类:“自然风” 显示“ 1”、 “常风” 显示“2”、“睡眠风” 显示“3”。后3位显示定时时间:动态倒计时显示剩余的定时时间,无定时显示“000”。 2.设计 “自然风”、 “常风”和“睡眠风” 三个风类键用于设置风类; 设计一个“定时”键,用于定时时间长短设置; 设计一个“摇头” 键用于控制电机摇头。 3.设计过热检测与保护电路,若电风扇电机过热,则电机停止转动,电机冷却后电机又恢复转动。 三、设计要求 1.必须充分利用给定套装元件(内附元件,材料清单表)进行设计。 2.用一个直流小电机模拟电风扇电机,按下相应的风类键,电机工作在相应状态:“自然风”运行时PWM的占空比为1:3;“睡眠风”运行时PWM的占空比为1:5;“常风”运行时PWM的占空比为3:1。 3.每按一次“定时”键,定时时间增加10秒钟,工作过程如下:(图略) 4. 用另一个直流小电机模拟风扇摇头机构,按下“摇头” 键,“摇头”电机先正转30ms,再反转30ms,如次往复。 6.过热检测与保护电路不用传感器,用信号源产生的正弦波信号代替传感器“感应”出的信号,若信号幅度大于10mV,则电机停止转动。 四、上交电子文档 1.电风扇模拟控制系统原理示意图; 2.电风扇模拟控制系统电路原理图(用PROTEL软件); 3.电风扇模拟控制系统程序流程图; 4.电风扇模拟控制系统源程序。 ▲ 上交电子文档必须以选手比赛编号命名,不得使用实名,否则比赛成绩记为0分。 假如比赛编号为200917234,则四个电子文档依次命名为:200917234示意图.BMP;200917234原理图;200917234流程图.BMP;200917234源程序.TXT 参考电路 ============================================================= 代码说明: 1. 代码中将P2口作为LED的8个段的输出口,PO口作为位控,采用共阴LED数码管。由于89S52的I/O口驱动比较小,所以亮度不太高。可以通过调节限流电阻提高亮度。 2. 实际板上有一片1413驱动,可以作为LED数码管显示的位驱动,这样亮度就没有问题了。 3. 代码中尽量保证RAM的前128B(直接寻址)全部给用户变量使用,把堆栈放在后128B的空间,固定数据的数组定义在FLASH空间(见代码中有CODE声明的数组变量定义) 4. 外围的马达的驱动电路、马达、继电器、温度输入检测没有接,通过模拟方式验证和调试 5. PWM的输出直接控制板上的一个LED,不同占空比时,LED的亮度变化代表了转速的不同。实际如果有马达的话,只要根据实际情况,改变PWM的频率就可以了。 6. 摆动马达控制也可以使用2个LED显示控制I/O的输出情况 7. 采用一个I/O输入“1”或“0”表示温度的超过或正常。 参考代码 //================================================================== #include <Reg52.h> #include <intrins.h> //******************************************** // I/O port design //******************************************** //输入定义 #define Key_null 0xff #define Key_f 0xfe #define Key_m 0xfd #define Key_t 0xfb //控制输出/输入 sbit m_out = P3^6; sbit pwm_out = P3^7; sbit err_in = P1^3; //函数声明 void led_display(void); //====== //PWM 电机输出控制 (timer0 中断) code unsigned int pwm_m1[3] = {62536,56536,63536}; code unsigned int pwm_m2[3] = {56536,62536,55536}; unsigned char th01_new,tl01_new; unsigned char th02_new,tl02_new; bit pwm_state; void timer1(void) interrupt 1 //定时0中断 { if(pwm_state) { TL0 = tl01_new; TH0 = th01_new; pwm_out = 0; } else { TL0 = tl02_new; TH0 = th02_new; pwm_out = 1; } pwm_state = ~pwm_state; } bit key_time_ok,time_1s_ok; unsigned char key_time,time_1s; void timer0(void) interrupt 3 //定时1中断 { TL1 = 0x78; // THTL=0xec78 = 65536 - 5000(5ms) TH1 = 0xec; led_display(); // LED动态扫描 if (++key_time >= 4) { key_time = 0; key_time_ok = 1; //10ms到 if(++time_1s >= 50) { time_1s = 0; time_1s_ok = 1; //1秒到 } } } //====== //LED数码管扫描显示驱动 unsigned char dis_buff[4]; code unsigned char led_7[13]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x79}; code unsigned char position[4]= {0xfe,0xfd,0xfb,0xf7}; void led_display(void) // 4位LED数码管动态扫描函数,5ms执行一次 { static unsigned char posit; P0 = 0xff; // 关全部显示 P2 = led_7[dis_buff[posit]]; // 输出一位段码 P0 = position[posit]; // 显示其中一位 if(++posit >= 4) posit = 0; } //======================= //按键扫描底层接口 unsigned char read_key(void) { static unsigned char key_press_old = Key_null,key_state = 0 ; unsigned char key_value= Key_null,key_press; key_press = P1; switch (key_state) { case 0: if(key_press != Key_null) key_state = 1; break; case 1: if (key_press != key_press_old) { key_state = 0; } else { if (key_press == Key_f) key_value = Key_f; if (key_press == Key_m) key_value = Key_m; if (key_press == Key_t) key_value = Key_t; key_state = 2; } break; case 2: if (key_press == Key_null) key_state = 0; break; } key_press_old = key_press; return key_value; } //============================================================================= // 主程序 //============================================================================= void main(void) { bit delay_time_ok = 0,m_type_ok = 0, move_on = 0; unsigned char f_type = 1,time_type = 0,delay_time = 0,move_time = 0,key; EA = 0; //关闭全局中断 SP = 0x80; //将堆栈空间定义到RAM后128B的空间,让出前128B给变量 P2 = 0x00; P3 = 0x00; P0 = 0xff; P1 = 0xff; //Configure Timer0,Mode=1,Interrupt=ENABLED,Clock Source=INTERNAL,Enable Gating Control=DISABLED TMOD &= 0XF0; /* clear Timer 0 */ TMOD |= 0X01; TL0 = 0x78; TH0 = 0xec; ET0 = 1; /* IE.1*/ TR0 = 1; /* TCON.4 start timer */ //Configure Timer1,Mode=1,Interrupt=ENABLED,Clock Source=INTERNAL,Enable Gating Control=DISABLED TMOD &= 0X0F; /* clear Timer 1 control */ TMOD |= 0X10; TL1 = 0X78; // THTL=0xec78 = 65536 - 5000(5ms) TH1 = 0Xec; ET1 = 1; /* ET0 is IE.3 */ TR1 = 1; /* TCON.6 start timer */ dis_buff[3] = f_type; dis_buff[2] = 10; dis_buff[1] = 0; dis_buff[0] = 0; th01_new = pwm_m1[f_type-1] >> 8; tl01_new = pwm_m1[f_type-1]; th02_new = pwm_m2[f_type-1] >> 8; tl02_new = pwm_m2[f_type-1]; EA = 1; //打开全局中断 while(1) { if (err_in) { if(key_time_ok) { key_time_ok = 0; key = read_key(); if (key != Key_null) { if (key == Key_f) { if (++f_type >= 4) f_type = 1; th01_new = pwm_m1[f_type-1] >> 8; tl01_new = pwm_m1[f_type-1]; th02_new = pwm_m2[f_type-1] >> 8; tl02_new = pwm_m2[f_type-1]; dis_buff[3] = f_type; } else if(key == Key_t) { if (++time_type >= 7) { time_type = 0; delay_time_ok = 0; delay_time = 0; } else { delay_time_ok = 1; delay_time = time_type * 10; } } else if(key == Key_m) { m_type_ok = ~m_type_ok; } } } if (time_1s_ok) { time_1s_ok = 0; if(delay_time) delay_time-- ; dis_buff[1] = delay_time / 10; dis_buff[0] = delay_time % 10; if (m_type_ok) { if (++move_time >= 3) { move_time = 0; move_on = ~move_on; } } } if (delay_time_ok) dis_buff[2] = 11; else dis_buff[2] = 10; if (delay_time_ok && (delay_time == 0)) { ET0 = 0; pwm_out = 1; } else { ET0 = 1; } if (m_type_ok) m_out = move_on; } else { ET0 = 0; pwm_out = 1; dis_buff[2] = 12; } } } 学科网(北京)股份有限公司 $$

资源预览图

“天华杯”示例题_电风扇模拟控制系统_参考程序
1
“天华杯”示例题_电风扇模拟控制系统_参考程序
2
“天华杯”示例题_电风扇模拟控制系统_参考程序
3
相关资源
示范课
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。