完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
13个回答
|
|
兄弟,你这程序有很大问题,在中断中运行长时间程序,然后这么简单的程序居然用了2个中断,中断不是这样用的
逻辑容易混乱。当然你写这程序是为了连续中断用法那又是另外一回事了 unsigned char Play_Music() { uint k,n; uint SoundLong,SoundTone; uint i,j,m; do { if(i>=25) i=0; SoundLong=SOUNDLONG[i]; SoundTone=SOUNDTONE[i]; i++; for(n=0;n for(k=0;k<12;k++) { BEEP=0; for(m=0;m for(m=0;m } } delay50us(6); if(sound_sensor==0) //如果有声音(吹气) { return 1; } }while((SOUNDLONG[i]!=0)||(SOUNDTONE[j]!=0)); return 0 } void delay50us(uchar time) { uchar a,b; for(a=0;a for(b=0;b<6;b++); } void main() { uint x=60000,y=110; //60秒内检测是否有热源,开机超过60秒不再检测 for(;x>0;x--) for(;y>0;y--) { if(fire_sensor==0) //如果有热源 { P1=0x00; //开led while(1) { if( Play_Music()) //一直生日快乐直到吹气退出 { P1=0xff; //关掉led BEEP=1;//关蜂鸣器 break; } } break;//跳出检测 } } while(1); }
最佳答案
|
|
|
|
下面没有注释的语句都是些放歌啊,延时啊什么的,应该不会错在那里,
|
|
|
|
没注意打错了,main中初值和中断中初值都是50000,中断中初值不是65000
|
|
|
|
|
|
|
|
|
|
|
|
第一张是板子和传感器整个
|
|
|
|
这是单片机左边接线
|
|
|
|
这是右边接线
|
|
|
|
上面是声音传感器,下面是火焰传感器。
|
|
|
|
wufa1986 发表于 2016-9-3 14:02 谢谢,看懂了,确实不用中断,下载好后没问题了。我写太复杂了。 |
|
|
|
|
|
|
|
原来那个版本音乐难听,现在修改了音乐,比较和听,重发一下。
#include #define uchar unsigned char #define uint unsigned int ***it BEEP=P2^3; //蜂鸣器 ***it fire_sensor=P3^0;//定义火焰传感器管脚 ***it sound_sensor=P3^1; //定义声音传感器管脚。 ***it light_sensor=P3^2;//定义光电传感器管脚 //生日快乐歌的音符频率表,不同频率由不同的延时来决定 uchar code SONG_TONE[]= { 212,212,190,212, 159,169,212,212, 190,212,142,159, 212,212,106,126, 159,169,190,119, 119,126,159,142, 159,0 }; //生日快乐歌节拍表,节拍决定每个音符的演奏长短 uchar code SONG_LONG[]= { 9,3,12,12, //9,3,12,12 12,24,9,3, //12,24,9,3 12,12,18,24, //12,12,12,24 10,4,20,20, //9,3,12,12 19,14,14,12, //12,12,12,9 8,16,16,16, //3,12,12,12 24,0 //24,0 }; void DelayMS(uint x) { uchar t; while(x--) { for(t=0;t<80;t++); //播放函数 yuanlai s 120 } } uint PlayMusic() //大改 { uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG 为拍子长度 for(j=0;j if(sound_sensor==0) { P1=0xff; BEEP=1; return 1; //return 1? } BEEP=~BEEP; //SONG_TONE 延时表决定了每个音符的频率 for(k=0;k DelayMS(30);//yuanlai s 10 i++; } return 0; //return 0? } //光电传感器要实现的功能:在有光(光太强)时不能点亮蜡烛,在无光(弱光)时可以点亮蜡烛 void main() { while(1) { if((fire_sensor==0)&&(light_sensor==1)) //如果有热源,且没光(或弱光) { P1=0x00; //开led while(1) { if( PlayMusic()) //一直生日快乐直到吹气退出 { P1=0xff; //关掉led BEEP=1;//关蜂鸣器 break; } } //break是跳出最近的循环 } } } |
|
|
|
wufa1986 发表于 2016-9-2 22:24 串口那块不太懂,想问下,下面是书上程序 uchar readbyte() { uchar i,k; SCL=0; delay(); SDA=1; for(i=0;i<8;i--) { SCL=1; delay(); k=(k<<1)|SDA;//这一句看不懂,不知道为什么就能完成8位的接收 SCL=0; delay(); } delay(); return k; } 书上的解释是:串行接收一个字节时需要将8位一位一位地接收,然后再组合成一个字节,上面代码中我们定义了一个临时变量k,将k左移一位后与SDA进行“或”运算,依次把8个独立的位放入一个字节中来完成接收。 它为什么要k<<1之后与SDA1 按位或?怎么完成把8位放入一个字节? 这个字节放入了谁中? |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
298 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
309 浏览 0 评论
826 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1911 浏览 2 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1427 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 04:19 , Processed in 0.856695 second(s), Total 100, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号