完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1、试题
(1)功能简述 “模拟风扇控制系统”能够模拟电风扇工作,通过按键控制风扇的转动速度和定时时间,数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间,系统主要由数码管显示、单片机最小系统、按键输入和电机控制保护电路组成,系统框图如图 1 所示: (2)设计任务及要求 1、工作模式 设备具有“睡眠风”、“自然风”和“常风”三种工作模式可以通过按键切换,通过单片机 P34 引脚输出脉宽调制信号控制电机运行状态,信号频率为 1KHz。 1.1 “睡眠风”模式下,对应 PWM 占空比为 20%; 1.2 “自然风”模式下,对应 PWM 占空比为 30%; 1.3 “常风”模式下,对应 PWM 占空比为 70%; 2、数码管显示 数码管实时显示设备当前工作模式和剩余工作时间(倒计时),如图 2 所示。 “睡眠风”状态下,对应数码管显示数值为 1,自然风模式下,显示数值为 2,常风模式下,显示数值为 3。 3.、按键控制 使用 S4、S5、S6、S7 四个按键完成按键控制功能。 3.1 按键 S4 定义为工作模式切换按键,每次按下 S4,设备循环切换三种工作模式。工作过程如下: 3.2 按键 S5 定义为“定时按键”每次按下 S5,定时时间增加 1 分钟,设备的剩余工作时间重置为当前定时时间,重新开始倒计时,工作过程如下: 3.3 按键 S6 定义为“停止”按键,按下 S6 按键,立即清零剩余工作时间,PWM信号停止输出,直到通过 S5 重新设置定时时间。 3.4 按键 S7 定义为“室温”按键,按下 S7,通过数码管显示当前室温,数码管显示格式如图 3 所示,再次按下 S7,返回图 2 所示的工作模式和剩余工作时间显示界面,如此往复。 室温测量、显示功能不应影响设备正在执行的 PWM 信号输出、停止、模式切换和计时等功能。 4、LED 指示灯 “睡眠风”模式下,L1 点亮,“自然风”模式下 L2 点亮,“常风”模式下 L3 点亮;按下停止按键或倒计时结束时,LED 全部熄灭。 5、电路原理图设计 电机过热检测及驱动电路设计:假定设备使用的是 12V 直流电机,过热检测传感器输出为小电压信号 Vs,设计过热检测及电机驱动电路,当检测到 Vs 信号幅度大于 10mV 时,电机停止转动,简述电路的工作原理与设计思路,并绘制出电路原理图。 2、试题分析 对于DS18B20芯片,温度传感器来说,只需知道温度读取函数: unsigned char Get_wendu(){ unsigned char high,low; unsigned char temp; Init_DS18B20(); Write_DS18B20(0XCC); Write_DS18B20(0X44); Delay_OneWire(200); Init_DS18B20(); Write_DS18B20(0XCC); Write_DS18B20(0XBE); low=Read_DS18B20(); high=Read_DS18B20(); temp=(low》》4)|(high《《4); return temp; } 按键、数码管、LED灯都是省赛必考项,对于他们之间的连接不再多说。 PWM控制占空比,通过P34口输出。信号频率为1000HZ=0.001s=1ms=1000us。 可以通过定时器0每次定时100us,总计10次; 如果PWM占空比为20%,说明在一个PWM周期内,P34口高电平占20%,其余同理。 如果发现数码管用显示的字符用眼睛可以看出闪动时,说明延时过长,可以修改下延时函数。通过程序发现: void display12(uchar f1,uchar f2){ P2=0XC0;P0=0X01;P2=0XFF;P0=tab[f1]; delay(); P2=0XC0;P0=0X02;P2=0XFF;P0=tab[f2]; delay(); } void delay(){ uchar i,j; for(i=10;i》0;i--) for(j=200;j》0;j--); } 这个延时对于数码管的显示比较理想。 3、实现代码 onewire.c #include “onewire.h” //单总线延时函数 void Delay_OneWire(unsigned int t) { t=12*t; while(t--); } //DS18B20芯片初始化 bit Init_DS18B20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); DQ = 1; Delay_OneWire(10); initflag = DQ; Delay_OneWire(5); return initflag; } //通过单总线向DS18B20写一个字节 void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i《8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(5); DQ = 1; dat 》》= 1; } Delay_OneWire(5); } //从DS18B20读取一个字节 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i《8;i++) { DQ = 0; dat 》》= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(5); } return dat; } unsigned char Get_wendu(){ unsigned char high,low; unsigned char temp; Init_DS18B20(); Write_DS18B20(0XCC); Write_DS18B20(0X44); Delay_OneWire(200); Init_DS18B20(); Write_DS18B20(0XCC); Write_DS18B20(0XBE); low=Read_DS18B20(); high=Read_DS18B20(); temp=(low》》4)|(high《《4); return temp; } onewire.h #ifndef _ONEWIRE_H #define _ONEWIRE_H #include “stc15f2k60s2.h” #define OW_SKIP_ROM 0xcc #define DS18B20_CONVERT 0x44 #define DS18B20_READ 0xbe //IC引脚定义 ***it DQ = P1^4; //函数声明 void Delay_OneWire(unsigned int t); void Write_DS18B20(unsigned char dat); bit Init_DS18B20(void); unsigned char Read_DS18B20(void); unsigned char Get_wendu(); #endif text.c #include《stc15f2k60s2.h》 #include “onewire.h” #define uchar unsigned char #define uint unsigned int uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0XC6}; uchar f1,f2,f3,f4,f5,f6,f7,f8; uchar moshi=1; uchar wendu; uchar dingshi=0; uchar flag=0; uchar pwm_zhankongbi=0; uchar n=0; uint count=0; void delayms(uchar ms); void display12(uchar f1,uchar f2); void display34(uchar f3,uchar f4); void display56(uchar f5,uchar f6); void display78(uchar f7,uchar f8); void allinit(); void Time0_init(); void keyscan(); void delay(); void main(){ allinit(); Time0_init(); f1=11;f2=11;f3=11;f4=11;f5=11;f6=11;f7=11;f8=11; while(1) { wendu=Get_wendu(); if(flag==0) { f1=10;f2=moshi;f3=10;f4=11;f5=0;f6=dingshi/100;f7=dingshi%100/10;f8=dingshi%10; } else if(flag==1) { f1=10;f2=4;f3=10;f4=11;f5=11;f6=wendu/10;f7=wendu%10;f8=12; } if(dingshi》0) { if(moshi==1) { P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; P00=0; } else if(moshi==2) { P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; P01=0; } else if(moshi==3) { P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; P02=0; } } else if(dingshi==0) { P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; P0=0XFF; } keyscan(); display12(f1,f2); display34(f3,f4); display56(f5,f6); display78(f7,f8); } } void keyscan(){ if(P33==0) //切换转换模式 { delayms(5); if(P33==0) { if(moshi==1) { moshi=2; } else if(moshi==2) { moshi=3; } else if(moshi==3) { moshi=1; } } while(!P33); } if(P32==0) //定时设置 { delayms(5); if(P32==0) { if(dingshi==0) { dingshi=60; } else if(dingshi《=60) { dingshi=120; } else if(dingshi《=120) { dingshi=0; } } while(!P32); } if(P31==0) //清零剩余工作时间 { delayms(5); if(P31==0) { dingshi=0; } while(!P31); } if(P30==0) //温度和剩余工作时间转换 { delayms(5); if(P30==0) { if(flag==0) { flag=1; } else if(flag==1) { flag=0; } } while(!P30); } } //1000hz=0.001s=1ms=1000us,每次定时100us。 void Time0_init(){ TMOD=0X01; TH0=(65536-100)/256; TL0=(65536-100)%256; TR0=1; ET0=1; EA=1; } void Time0_service() interrupt 1 { TH0=(65536-100)/256; TL0=(65536-100)%256; n++; count++; pwm_zhankongbi++; if(count==10000) { count=0; if(dingshi》0) { dingshi--; } } if(dingshi》0) { if(moshi==1) { if(pwm_zhankongbi==3) { P34=1; } else { P34=0; } } else if(moshi==2) { if(pwm_zhankongbi==4) { P34=1; } else { P34=0; } } else if(moshi==3) { if(pwm_zhankongbi==8) { P34=1; } else { P34=0; } } } if(n==11) { n=0; pwm_zhankongbi=0; } } void delayms(uchar ms){ uchar i,j,k; for(k=ms;k》0;k--){ i=12; j=169; do { while(j--); } while(i--); } } void allinit(){ P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF; } void display12(uchar f1,uchar f2){ P2=0XC0;P0=0X01;P2=0XFF;P0=tab[f1]; delay(); P2=0XC0;P0=0X02;P2=0XFF;P0=tab[f2]; delay(); } void display34(uchar f3,uchar f4){ P2=0XC0;P0=0X04;P2=0XFF;P0=tab[f3]; delay(); P2=0XC0;P0=0X08;P2=0XFF;P0=tab[f4]; delay(); } void display56(uchar f5,uchar f6){ P2=0XC0;P0=0X10;P2=0XFF;P0=tab[f5]; delay(); P2=0XC0;P0=0X20;P2=0XFF;P0=tab[f6]; delay(); } void display78(uchar f7,uchar f8){ P2=0XC0;P0=0X40;P2=0XFF;P0=tab[f7]; delay(); P2=0XC0;P0=0X80;P2=0XFF;P0=tab[f8]; delay(); } void delay(){ uchar i,j; for(i=10;i》0;i--) for(j=200;j》0;j--); } |
|
|
|
只有小组成员才能发言,加入小组>>
4510个成员聚集在这个小组
加入小组3335 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4264 浏览 1 评论
4291 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 01:06 , Processed in 0.706875 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号