2015年10月25日星期日

蜂鸣器

无源的蜂鸣器,就要通过IO口输出振荡信号来驱动蜂鸣器
蜂鸣器简介:蜂鸣器根据结构不同分为压电式蜂鸣器和电磁式蜂鸣器;而两种蜂鸣器又分为有源蜂鸣器和无源蜂鸣器,这里的源特指振荡源;有源蜂鸣器直接加电就可以响起,无源蜂鸣器需要我们给提供振荡源。理想的振荡源为一定频率的方波。

只有当有一定频率的电流从正极流向负极,蜂鸣器才会叫。
三极管在这些方波的控制下导通,截止(图,可以看单片机教程上的),就会有和方波频率相同的电流流过蜂鸣器。

改变控制方波的频率就可以控制蜂鸣器音调,产生各种不同的音色,音调的声音。控制方波的频率越高,蜂鸣器的声音越尖。反之,越低沉。改变控制方波的的高低电平占空比,则可以控制蜂鸣器的声音大小.


图中(a)(b)改变了频率。图(c)(d)改变了占空比,频率一样。

如果系统采用了无源蜂鸣器,所以需要我们通过编程来控制I/0口的翻转来产生一定频率的方波信号。如果采用默认频率0.5KHZ的标准方波。可以算出周期T = 2ms 脉宽t = 1ms,因此我们可以通过简单的延时函数延时1ms。然后控制P口的电平高低产生0.5KHZ的方波信号;

本程序只是通过简单延时达到驱动蜂鸣器的效果。
#include <reg52.h>
sbit buzzer = P1^5;
void delayms(unsigned int xms)   //延时函数 ,延时xms
{
      unsigned int i , j;
          for(i = 0; i < xms; i++)
              for(j = 0; j < 110; j++);
}

void fengming()    //蜂鸣函数,脉宽t = 1ms 周期T = 2ms 频率f = 0.5khz 实际发现延时1ms的时候效果最好
{
        buzzer = 0; //
P1.5口送低电平
        delayms(1);   //
延时1ms
        buzzer = 1;   //
P1.5口送高电平
        delayms(1);   //
延时1ms
}





2015年10月4日星期日

K1-K4 按键状态显示

名称:K1-K4 按键状态显示
说明:K1、K2 按下时 LED 点亮,松开时熄灭, K3、K4 按下并释放时 LED 点亮,再次按下并释放时熄灭;

              #include<reg51.h>
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4        
   5          sbit LED1 = P2^0;
   6          sbit LED2 = P2^1;
   7          sbit LED3 = P2^2;
   8          sbit LED4 = P2^3;
   9        
  10          sbit K1 = P0^0;
  11          sbit K2 = P0^1;
  12          sbit K3 = P0^2;
  13          sbit K4 = P0^3;
  14        
  15          //延时,用来防抖
  16          void delayMS(uint x)
  17          {
  18   1              uchar i;
  19   1              while(x--)
  20   1              {
  21   2                    
  22   2                      for(i = 0; i < 120; i++);
  23   2                    
  24   2              }
  25   1      }
  26          //主程序
  27          main()
  28          {
  29   1              P0 = 0xff;//给P0和P2口赋值;高电平;
  30   1              P2 = 0xff;
  31   1              while(1)
  32   1              {
  33   2                      LED1 = K1;//K1端接地,当按下K,P0^0变为0(低电平)
  34   2                      LED2 = K2;
  35   2                      if(K3 == 0)
  36   2                      {
  37   3                              while(K3==0);//按着k3不放,就循环。等待,什                                                    // 么也不干,一旦放开,继续执                                                      // 行;
  38   3                              LED3 =~ LED3;
  39   3                      }
  40   2                      if(K4 == 0)
  41   2                      {
  42   3                              while(K4 == 0);
  43   3                              LED4 =~ LED4;
  44   3                      }
  45   2                      delayMS(10);
  46   2              }
  47   1            
  48   1      }

        理解if(K3 == 0)
              {
                  while(K3 == 0);
                  LED3 = LED3;
               }


一旦K3 == 0 也就是if 的条件为true,那么必须把if里面的所以东西执行完。

  类比c语言:if(k == 0){
                          k=9;//虽然这步k 已经是9 了,但是还是要把下面的表达式子                               //  执行完
                          led = 1;
                          }

单片机sbit p1_1 = p1^1 的理解????

sbit p1_1 = P1^1;
p1_1 = 1;

P1^1是位,相当于地址,P1^1不是变量,不能写成P1^1 = 0;

P1.1是端口名字,不能用它当变量,因为不符合c的变量命名规则;

sbit 定义的是位变量,赋值只能是0或者1;

因为P1^1是地址,通过sbit,定义变量p1_1代表了P1^1的空间,这空间的名字为p1_1.
给变量p1_1赋值,就相当于把值放在了P1^1里面;

相当于c语言 int c = 5;把5付给变量c,系统自动给c分配了一片内存,内存的名字为c;这里只是自动的,但是在单片机要用 sbit p1_1 = P1^1人工设置。