找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1258|回复: 7
收起左侧

这个单片机电路原理图加个蜂鸣器的话程序要怎么弄?

[复制链接]
ID:987652 发表于 2022-6-3 15:47 | 显示全部楼层 |阅读模式
1.png
初学者 求指导 谢谢大家
单片机源程序如下:
#include <reg51.H>
#define uint unsigned int
#define uchar unsigned char

sbit LCD_RS=P3^0;
sbit LCD_EN=P3^1;
sbit key1=P3^2;   
sbit key2=P3^3;
sbit key3=P3^4;


uchar table[]= "T1:00.00";    //第一行
uchar table1[]="T2:00.00";    //第二行
uchar keyvalue,k1,k2;
char sec_1=0,sec_2=0,min_1,min_2;//分秒变量
uchar min1=50,min2=50;                //预置分变量
uint ms1=0;ms2=0;                        //中断计时变量
bit key_sign=0;                        //按键状态标志
bit flag1,flag2;                        //启停标志

void delay(uint x);
void write_com(uchar com);
void write_date(uchar date);
void LCD_init();
void display();
void keyscan();
void Timer0Init();

/*******100us延时程序********/
void delay(uint x)
{
    uint a,b;
    for(a=x;a>0;a--)
        for(b=10;b>0;b--);
}
/*******1602液晶屏写指令程序********/
void write_com(uchar com)
{
    LCD_RS=0;    //允许写指令
    P2=com;        //传递指令
    delay(10);    //延时1ms
    LCD_EN=1;    //使能写入
    delay(10);    //延时1ms
    LCD_EN=0;    //低跳变执行
   
}
/*******1602液晶屏写数据程序********/
void write_date(uchar date)
{
    LCD_RS=1;    //允许写数据
    P2=date;    //传递数据
    delay(10);    //延时1ms
    LCD_EN=1;    //使能写入
    delay(10);    //延时1ms
    LCD_EN=0;    //低跳变执行
   
}
/*******1602液晶屏初始化程序********/
void LCD_init()        //设置显示模式、
{
    write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
    write_com(0x01);//显示清零,数据指针清零
    write_com(0x0c);//设置开显示,不显光标
    write_com(0x06);//设置写一个字符后地址指针加1
}
/***********按键扫描子程序****************/

void keyscan()   
{
    static uchar count=0;                        //计数变量            
    if(!key1||!key2||!key3)                        //检测输入如果为0
    {                    
        if(++count>=2 && key_sign==0)//计数延时消抖
        {            
            key_sign=1;            //按键状态标志置1,防止重复响应
            if(!key1&&flag1==0&&flag2==0)
                keyvalue=++keyvalue%3;
            if(!key2)
            {
                switch(keyvalue)
                {
                    case 0:
                        k1++;
                        if(k1==1)//启动
                        {
                            min_1=min1;   
                            sec_1=0;
                            flag1=1;
                        }
                        if(k1==2)//暂停
                            flag1=0;
                        if(k1==3)//清0
                        {
                            k1=0;
                            min_1=0;   
                            sec_1=0;
                            ms1=0;
                        }break;
                    case 1: if(min1<98)min1++;sec_1=0; break;
                    case 2: if(min2<98)min2++;sec_2=0; break;
                }
            }   
            if(!key3)
            {
                switch(keyvalue)
                {
                    case 0:
                        k2++;
                        if(k2==1)//启动
                        {
                            min_2=min2;   
                            sec_2=0;
                            flag2=1;
                        }
                        if(k2==2)//暂停
                            flag2=0;
                        if(k2==3)//清0
                        {
                            k2=0;
                            min_2=0;   
                            sec_2=0;
                            ms2=0;
                        }break;
                    case 1: if(min1>1)min1--;sec_1=0; break;
                    case 2: if(min2>1)min2--;sec_2=0; break;
                }
            }
        }
    }
    else
    {
        count=0;                //计数变量清0
        key_sign=0;
    }
}


void display()
{
    uchar i;
    if(keyvalue==0)
    {
        table[3]=min_1/10+'0';
        table[4]=min_1%10+'0';
        table[6]=sec_1/10+'0';
        table[7]=sec_1%10+'0';
        table1[3]=min_2/10+'0';
        table1[4]=min_2%10+'0';
        table1[6]=sec_2/10+'0';
        table1[7]=sec_2%10+'0';
    }
    if(keyvalue==1)
    {
        table[3]=min1/10+'0';
        table[4]=min1%10+'0';
        table[6]=0x3c;//<
        table[7]=0x3c;//<
        table1[3]=min2/10+'0';
        table1[4]=min2%10+'0';
        table1[6]='0';
        table1[7]='0';
    }
    if(keyvalue==2)
    {
        table[3]=min1/10+'0';
        table[4]=min1%10+'0';
        table[6]='0';
        table[7]='0';
        table1[3]=min2/10+'0';
        table1[4]=min2%10+'0';
        table1[6]=0x3c;//<
        table1[7]=0x3c;//<
    }
    write_com(0x80);            //数据指针第一行起始0x80位置
    for(i=0;i<8;i++)            //每循环一次写一个字节数据
        write_date(table[ i]);    //写一个字节数据        
    write_com(0xc0);            //数据指针第二行起始位置0x80+0x40=0xc0
    for(i=0;i<8;i++)            //每循环一次写一个字节数据
        write_date(table1[ i]);    //写一个字节数据        
}

         





/***********定时器初始化程序****************/
void Timer0Init()        //1毫秒@11.0592MHz
{
    TMOD = 0x01;        //设置定时器模式
    TL0 = 0x66;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    EA=1;                            //开总中断
    ET0=1;                        //开定时器0中断   
}
/***************主程序****************/
void main()
{
    LCD_init();   
    Timer0Init();                //定时器初始化
    while(1)
    {
        keyscan();
        display();
    }
}
/**************中断服务程序*****************/
void timer0() interrupt    1
{
    TL0 = 0x66;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    if(flag1)
    {
        ms1++;
        if(ms1>=1000)
        {
            ms1=0;
            sec_1--;
            if(sec_1==0&&min_1==0)
            {
                flag1=0;
                k1=0;
            }
            else if(sec_1<0)
            {
                sec_1=59;
                min_1--;
            }
        }
    }
    if(flag2)
    {
        ms2++;
        if(ms2>=1000)
        {
            ms2=0;
            sec_2--;
            if(sec_2==0&&min_2==0)
            {
                flag2=0;
                k2=0;
            }
            else if(sec_2<0)
            {
                sec_2=59;
                min_2--;
            }
        }
    }
}

双路99分钟倒计时 仿真.zip

110.53 KB, 下载次数: 2

回复

使用道具 举报

ID:789121 发表于 2022-6-3 18:47 | 显示全部楼层
蜂鸣器建议选有源的,这样加个三极管就可以直接用引脚高低电平控制了。
回复

使用道具 举报

ID:752225 发表于 2022-6-3 20:32 | 显示全部楼层
同意楼上说的,可以用有源蜂鸣器和一个三极管来实现,注意NPN或PNP三极管,蜂鸣器摆放的位置不同,可百度查询
回复

使用道具 举报

ID:979299 发表于 2022-6-3 20:46 | 显示全部楼层
在中断里找到标志位1,在下面添加上buzz=0;即可,标志位2也一样,要停止鸣响,在主函数里添加一个按键程序
            if(sec_1==0&&min_1==0)
            {
                flag1=0;
                buzz=0;
                k1=0;
            }

主函数里写
                 if(key4==0)
                {
                        buzz=1;
                }
当然还在先定义按键和BUZZ
sbit key4=P3^5;
sbit buzz=P1^0;
回复

使用道具 举报

ID:987652 发表于 2022-6-3 20:49 | 显示全部楼层
不要黑 发表于 2022-6-3 18:47
蜂鸣器建议选有源的,这样加个三极管就可以直接用引脚高低电平控制了。

但是这些引脚的高低电平一直在变化。
回复

使用道具 举报

ID:987652 发表于 2022-6-3 21:56 | 显示全部楼层
兴安xa 发表于 2022-6-3 20:46
在中断里找到标志位1,在下面添加上buzz=0;即可,标志位2也一样,要停止鸣响,在主函数里添加一个按键程序
...

好的,非常感谢!
回复

使用道具 举报

ID:987652 发表于 2022-6-8 22:25 | 显示全部楼层
兴安xa 发表于 2022-6-3 20:46
在中断里找到标志位1,在下面添加上buzz=0;即可,标志位2也一样,要停止鸣响,在主函数里添加一个按键程序
...

打扰一下,大佬可以帮忙看看我的第二个主题该如何修改吗
回复

使用道具 举报

ID:451718 发表于 2022-6-9 15:49 | 显示全部楼层
unsigned char BPFlag = 0;
void Deel_Beep()
{
    static unsigned char BPSign = 0;
          switch(BPFlag)
                {
                        case 0:                //-------不响
                                BZ = 0;
                                break;
                        case 1:                //-------长响
                                BZ = 1;
        BPSign ++;
        if(BPSign>5)
        {
            BPSign = 0;
            BPFlag = 0;
            BZ = 0;
        }
                                break;
                        case 2:                //-------双响
                                switch(BPSign)
        {
            case 0:
                BZ = 1;
                BPSign++;
                break;
            case 1:
                                                          BZ = 0;
                                                    BPSign++;
                                                    break;
                                                case 2:
                BZ = 1;
                BPSign++;
                break;
            default:                                               
                                                          BZ = 0;
                                                    BPSign = 0;
                                                    BPFlag = 0;
                                                    break;
        }
                                break;
                        case 3:                //-------短响
                                BZ = 1;
        BPSign ++;
        if(BPSign>1)
        {
            BPSign = 0;
            BPFlag = 0;
            BZ = 0;
        }
                                break;
                        case 4:                //-------双响
                        switch(BPSign)
                        {
                                        case 0:
                                                        BZ = 1;
                                                        BPSign++;
                                                        break;
                                        case 1:
                                                        BZ = 0;
                                                        BPSign++;
                                                        break;
                                        case 2:
                                                        BZ = 1;
                                                        BPSign++;
                                                        break;
                                        case 3:
                                                        BZ = 0;
                                                        BPSign++;
                                                        break;
                                        case 4:
                                                        BZ = 1;
                                                        BPSign++;
                                                        break;
                                        default:                                               
                                                        BZ = 0;
                                                        BPSign = 0;
                                                        BPFlag = 0;
                                                        break;
                        }
                        break;
                }  
}      
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表