完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
单片机初学者,打算做一个智能风扇。可以实时随温度改变电机转速。不是调档位的那种。是可以随温度变化而变化的。温度越高,风扇转速越高。同学用光敏电阻通过定时器中断,可以实时通过改变PWM实时改变电机转速。而我用DS18B20就不可以。。。求教。
大概要求:温度高于30度风扇开始转动,温度越高转速越快。 下面是我的程序 #include #include #define uchar unsigned char #define uint unsigned int ***it ds = P2^2; ***it dula = P2^6; ***it wela = P2^7; ***it dianji=P1^7; bit flag; uint temp; uint t=0; uint PWM=0; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; void TempDelay(uchar us) { while(us--); //6.51us } void delay(int z) { uint x,y; for(x=z;x>0;x--) for(y=115;y>0;y--); } void display(uint temp) { uchar bai,shi,ge; bai=temp/100; shi=temp%100/10; ge=temp%100%10; dula=1; P0=table[bai]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delay(3); dula=1; P0=table1[shi]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(3); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(3); } void ds_reset() { ds=1; _nop_(); ds=0; TempDelay(80);//520us ds=1; TempDelay(5); if(ds==0) flag=1; else flag=0; TempDelay(20); ds=1; } bit ds_read_bit() { bit dat; ds=0; _nop_(); _nop_(); ds=1; _nop_(); dat=ds; TempDelay(12); return dat; } uchar ds_read_byte() { uchar i,j,value; for(i=0;i<8;i++) { j=ds_read_bit(); value=(j<<7)|(value>>1); } return value; } void ds_write_byte(uchar dat) { uchar i,onebit; for(i=0;i<8;i++) { onebit=dat&0x01; if(onebit) //写1 { ds=0; TempDelay(1); ds=1; _nop_(); } else //写0 { ds=0; TempDelay(11); ds=1; _nop_(); } dat>>=1; } } void ds_change() { ds_reset(); ds_write_byte(0xcc); ds_write_byte(0x44); ds_write_byte(0x7f); } uint get_temperature() { uchar a,b; float temperature; ds_reset(); ds_write_byte(0xcc); ds_write_byte(0xbe); a=ds_read_byte(); b=ds_read_byte(); temp=b; temp<<=8; temp|=a; temperature=temp*0.0625; temp=temperature*10+0.5; return temp; } void time_init() { EX0=1; IT0=0; EA=1; PWM=1; } void main() { //PWM=1; //dianji=1; ds_change(); delay(1000); time_init(); P1=0x00; while(1); } void out() interrupt 0 { display(get_temperature()); ds_change(); t++; PWM=get_temperature(); if(get_temperature()>300)//35度蜂鸣器发声 { P1=0xff; if(PWM==350) { PWM=1; } /*if(PWM==500) { PWM=1; } } */ else P1=0x00; if(t==300) { t=0; P1=0xff; } if(PWM==t) { P1=0x00; } } |
|
相关推荐
3个回答
|
|
|
中断程序中的几个if语句没看明白什么意思
|
|
|
|
|
|
一开始我用的定时器0中断,后来感觉PWM没用会不会因为定时器时间太长。就改成了外部中断感觉也没用。 中断里的程序一个是温度在数码管上的显示。一个是当温度在30度以上时风扇开始转动,在30度以下时停止转动。 PWM=get——temperature是把温度值当成PWM然后再调电机转速。这是我的想法。 |
|
|
|
|
电一电小萌新 发表于 2017-5-26 19:39 我看不懂的是if(PWM==350),还有if(t==300),if(PWM==t)是些什么作用?这个东西应该是比较简单的,你的思路也基本没有问题,但是要弄懂一个问题,你所用的电机是什么电机,它的转速是和什么相关的,比如电源的开关频率还是电压?然后你才能用PWM去控制,但是你的程序里面我没看出来。 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-9 16:28 , Processed in 0.719778 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
12150