微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手51单片机程序求助大神!

新手51单片机程序求助大神!

时间:10-02 整理:3721RD 点击:
代码:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep = P2^3;    //蜂鸣器
sbit key = P3^4;    //按键
uchar num3 = 0, num4 = 0, num2000 = 0;
void init()    //T0方式1计时初始化
{
    TMOD = 0x01;
    TH0 = (65536 - 65305) / 256;
    TL0 = (65536 - 65305) % 256;
    EA = 1;
    ET0 = 1;
//    TR0 = 1;
}
void delay(uint z)    //延时z毫秒
{
    uint x, y;
    for(x=z; x>0; x--)
        for(y=110; y>0; y--);   
}
void main()
{
    init();
    while(1)
    {
        if (0 == key)
        {
            delay(10);
            if(0 == key)
            {
                TR0 = 1;    //T0开始计时
            }
            while(!key);    //松手检测
        }
        if (num2000 < 2000)    //头0.5秒
        {
            if (3 == num3)    //700HZ
            {
                num3 = 0;
                beep = ~beep;
            }
        }
        else if (num2000>2000 && num2000<4000)    //后0.5秒
        {
            if (4 == num4)    //500HZ
            {
                num4 = 0;
                beep = ~beep;
            }   
        }
        else if (num2000 > 4000)    //归零,并停止计时
        {
            num2000 = 0;
            TR0 = 0;   
        }
    }
}
void T0_time() interrupt 1
{
    TH0 = (65536 - 65305) / 256;
    TL0 = (65536 - 65305) % 256;
    ++ num3;
    ++ num4;
    ++ num2000;   
}
声音频率实现不出来,求助大神!(PS:我用的天翔的51单片机。)

要实现的内容!


原来是这样

//    TR0 = 1;
你的定时器没有启动,为什么要把这句注释掉呢?

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep = P2^3;    //蜂鸣器
sbit key = P3^4;    //按键
uchar num3 = 0, num4 = 0,num2000 = 0;
void init()    //T0方式1计时初始化
{
    TMOD = 0x01;
    TH0 = (65536 - 65305) / 256;
    TL0 = (65536 - 65305) % 256;
    EA = 1;
    ET0 = 1;
//    TR0 = 1;
}
void delay(uint z)    //延时z毫秒
{
    uint x, y;
    for(x=z; x>0; x--)
        for(y=110; y>0; y--);   
}
void main()
{
    init();
    while(1)
    {
        if (0 == key)
        {
            delay(10);
            if(0 == key)
            {
                TR0 = 1;    //T0开始计时
            }
            while(!key);    //松手检测
        }
        if (num2000 < 40)    //头0.5秒
        {
            if (2 == num3)    //700HZ
            {
                num3=0;
                                num4=0;
                beep = ~beep;
            }
        }
        else if (num2000>40 && num2000<80)    //后0.5秒
        {
            if (4 == num4)    //500HZ
            {
                num4 = 0;
                       
                beep = ~beep;
            }   
        }
        if (num2000 > 80)    //归零,并停止计时
        {
            num2000 = 0;
                        num3=0;
            TR0 = 0;   
        }
    }
}
void T0_time() interrupt 1
{
    TH0 = (65536 - 65305) / 256;
    TL0 = (65536 - 65305) % 256;
    ++num3;
    ++num4;
    ++num2000;   
}

这个程序可以实现不同频率,你自己对照下,你错在哪里了。
还有就是,num2000的类型限制它不能大于256,你居然还取到4000.要注意这点。希望可以帮到你。

我是key按键按先后TR0 = 1了。

我下载下去,还是么有反应、、、

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top