BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #11828同步于 2012/3/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

【求助】单片机呼吸灯程序问题

W1039766642
2012/3/3镜像同步1 回复
/*************************************************** *PWM控制LED灯渐亮渐灭程序 控制LED模块; *晶振为11.0592MHZ;利用定时器产生占空比可变的PWM波 *K1键 PWM 增加 占空比减小 渐暗 , *K2键 PWM 减少 占空比增加 渐亮 ; *当增加或者减少到最大或者最小值的时候,蜂鸣器开始报警 ****************************************************/ #include<reg52.h> #include<intrins.h> sbit K1=P3^2; //PWM增加键 sbit K2=P3^3; //PWM减少键 sbit BEEP=P0^0; //蜂鸣器 unsigned char PWM=0X7F; //赋初值 void Beep(); //函数声明 void delayms(unsigned char ms); void delay(unsigned char t); /****************************************************/ void main() { P1=0XFF; //P1口锁存器, TMOD=0X21; //定时器/计数器方式控制寄存器 TH0=0XFC; //1ms时延常数,定时器计数器0(高字节)控制寄存器 TL0=0X66; //频率调节 TH1=PWM; //脉宽调节 TL1=0; EA=1; // ET0=1; ET1=1; TR0=1; while(1) { do{ if(PWM!=0XFF) {PWM++;delayms(10);} else Beep(); }while(K1==0); do{if(PWM!=0X21) {PWM--;delayms(10);} else Beep(); }while(K2==0); } } /**************************************************** //定时器0中断服务程序 *******************************************************/ void timer0() { TR1=0; TH0=0XFC; TL0=0X66; TH1=PWM; TR1=1; P1=0X00; //启动输出 } /**************************************************** //定时器1中断服务程序 ****************************************************/ void timer1() { TR1=0; P1=0XFF; //结束输出 } //蜂鸣器子程序 void Beep() { unsigned char i; for(i=0;i<100;i++) { delay(); BEEP=!BEEP; //beep取反 } BEEP=1; // 关闭蜂鸣器 delayms(100); } //延时子程序 void delayms(unsigned char t) { while(t--); } //延时子程序 void delay(unsigned char ms) { unsigned char i; while(ms--) { for(i=0;1<120;i++); } } /************************************************************/ 前辈们 这个main()函数内 while循环之前的东西是干什么的?每一句代表什么意思? 还有 定时器 的程序为什么是这样写的 ?每一句代表什么? Beep()函数内的 BEEP取反是为了什么? 我觉得我还没有以单片机工作的思维方式去思考 谢谢啊 问题有点多 但是如果不问的话 问题还会更多。。 再次谢谢各位啦?!!!!!!!!!!!!!!!!!!谢谢
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
hangtj机器人#1 · 2012/3/3
你最好去找本讲原理的书看看吧,里面会讲会清楚的。while循环之前是为中断进行设置,比如要哪种中断,中断时间等。使用不同的定时器写法有点区别,书上有写很清楚的。Beep()函数可知你使用的发声器(具体叫什么我也不记得了,相当于喇叭)是要求给脉冲才工作,所以要取反。我以前用的是给高电平就响,那就不用取反了。感觉你对中断那好像没看过还是没看懂,你再好好看书吧,多看几遍,在多练习就好了。