欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1990|回復: 7
收起左側

這個單片機電路原理圖加個蜂鳴器的話程序要怎么弄?

[復制鏈接]
ID:987652 發(fā)表于 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;                        //按鍵狀態(tài)標志
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;    //低跳變執(zhí)行
   
}
/*******1602液晶屏寫數(shù)據(jù)程序********/
void write_date(uchar date)
{
    LCD_RS=1;    //允許寫數(shù)據(jù)
    P2=date;    //傳遞數(shù)據(jù)
    delay(10);    //延時1ms
    LCD_EN=1;    //使能寫入
    delay(10);    //延時1ms
    LCD_EN=0;    //低跳變執(zhí)行
   
}
/*******1602液晶屏初始化程序********/
void LCD_init()        //設置顯示模式、
{
    write_com(0x38);//設置16*2顯示,5*7點陣,8位數(shù)據(jù)接口
    write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
    write_com(0x0c);//設置開顯示,不顯光標
    write_com(0x06);//設置寫一個字符后地址指針加1
}
/***********按鍵掃描子程序****************/

void keyscan()   
{
    static uchar count=0;                        //計數(shù)變量            
    if(!key1||!key2||!key3)                        //檢測輸入如果為0
    {                    
        if(++count>=2 && key_sign==0)//計數(shù)延時消抖
        {            
            key_sign=1;            //按鍵狀態(tài)標志置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;                //計數(shù)變量清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);            //數(shù)據(jù)指針第一行起始0x80位置
    for(i=0;i<8;i++)            //每循環(huán)一次寫一個字節(jié)數(shù)據(jù)
        write_date(table[ i]);    //寫一個字節(jié)數(shù)據(jù)        
    write_com(0xc0);            //數(shù)據(jù)指針第二行起始位置0x80+0x40=0xc0
    for(i=0;i<8;i++)            //每循環(huán)一次寫一個字節(jié)數(shù)據(jù)
        write_date(table1[ i]);    //寫一個字節(jié)數(shù)據(jù)        
}

         





/***********定時器初始化程序****************/
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, 下載次數(shù): 2

回復

使用道具 舉報

ID:789121 發(fā)表于 2022-6-3 18:47 | 顯示全部樓層
蜂鳴器建議選有源的,這樣加個三極管就可以直接用引腳高低電平控制了。
回復

使用道具 舉報

ID:752225 發(fā)表于 2022-6-3 20:32 | 顯示全部樓層
同意樓上說的,可以用有源蜂鳴器和一個三極管來實現(xiàn),注意NPN或PNP三極管,蜂鳴器擺放的位置不同,可百度查詢
回復

使用道具 舉報

ID:979299 發(fā)表于 2022-6-3 20:46 | 顯示全部樓層
在中斷里找到標志位1,在下面添加上buzz=0;即可,標志位2也一樣,要停止鳴響,在主函數(shù)里添加一個按鍵程序
            if(sec_1==0&&min_1==0)
            {
                flag1=0;
                buzz=0;
                k1=0;
            }

主函數(shù)里寫
                 if(key4==0)
                {
                        buzz=1;
                }
當然還在先定義按鍵和BUZZ
sbit key4=P3^5;
sbit buzz=P1^0;
回復

使用道具 舉報

ID:987652 發(fā)表于 2022-6-3 20:49 | 顯示全部樓層
不要黑 發(fā)表于 2022-6-3 18:47
蜂鳴器建議選有源的,這樣加個三極管就可以直接用引腳高低電平控制了。

但是這些引腳的高低電平一直在變化。
回復

使用道具 舉報

ID:987652 發(fā)表于 2022-6-3 21:56 | 顯示全部樓層
興安xa 發(fā)表于 2022-6-3 20:46
在中斷里找到標志位1,在下面添加上buzz=0;即可,標志位2也一樣,要停止鳴響,在主函數(shù)里添加一個按鍵程序
...

好的,非常感謝!
回復

使用道具 舉報

ID:987652 發(fā)表于 2022-6-8 22:25 | 顯示全部樓層
興安xa 發(fā)表于 2022-6-3 20:46
在中斷里找到標志位1,在下面添加上buzz=0;即可,標志位2也一樣,要停止鳴響,在主函數(shù)里添加一個按鍵程序
...

打擾一下,大佬可以幫忙看看我的第二個主題該如何修改嗎
回復

使用道具 舉報

8#
無效樓層,該帖已經被刪除
ID:451718 發(fā)表于 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;
                }  
}      
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表