亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3924|回復(fù): 3
收起左側(cè)

這個(gè)串口控制蜂鳴器 我選擇ASCII和16進(jìn)制都試過(guò)了就是失敗幫忙看看

[復(fù)制鏈接]
ID:125710 發(fā)表于 2016-7-28 17:38 | 顯示全部樓層 |閱讀模式
/*一. 程序功能
由上位機(jī)發(fā)送1給單片機(jī),蜂鳴器以400ms頻率發(fā)聲,發(fā)送2時(shí)以200ms頻率發(fā)聲,發(fā)送3時(shí)以100ms頻率發(fā)聲,發(fā)送4時(shí)關(guān)閉蜂鳴器.

二. 程序源碼*/
#include <reg52.h>

//聲明程序需要的全局變量
unsigned char flag, a, num, benum;

//聲明單片機(jī)的蜂鳴器
sbit beep = P2 ^ 3;

//聲明初始化函數(shù)
void init();

//主函數(shù)
void main()
{
    //初始化
    init();

    while (1)
    {
       //檢測(cè)是否發(fā)生串口中斷
       if (flag == 1)
       {
           //手動(dòng)將flag置0,方便下次檢測(cè)
           flag = 0;
           //關(guān)閉中斷???為什么需要關(guān)閉總中斷而不僅僅是串口中斷
           EA = 0;
           //開(kāi)啟計(jì)數(shù)器0
           TR0 = 1;
           //根據(jù)串口接收的數(shù)據(jù)設(shè)置蜂鳴器的頻率基數(shù)
           switch(a)
           {
               case 1:
                   benum = 4;
                   break;
               case 2:
                   benum = 2;
                   break;
               case 3:
                   benum = 1;
                   break;
               case 4:
                   TR0 = 0;
                   beep = 1;
           }
           //開(kāi)啟總中斷
           EA = 1;
        }
    }
}

void init()
{
    //設(shè)置定時(shí)器1為工作方式2, 定時(shí)器0為工作方式1
    TMOD = 0x21;
    //波特率 = (2的SMOD次方/32) * (T1溢出率)                                                                     //T1溢出率 = [256 - X]*12/晶振頻率
    //根據(jù)SMOD的0,1取值得到的X分別為TH1,TL1
    //波特率選取9600,晶振頻率為11.0592
    TH1 = 0xfd;
    TL1 = 0xfd;
    //以50s作為計(jì)數(shù)器0的基數(shù)
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;
    //ET1 = 1;  這里不需要開(kāi)啟定時(shí)器1中斷,因?yàn)槎〞r(shí)器1工作在方式2,為8位自動(dòng)重裝方式,進(jìn)入中斷也無(wú)事可做
    //啟動(dòng)T1定時(shí)器
    TR1 = 1;
    //開(kāi)啟T0定時(shí)器
    ET0 = 1;
    //TR0 = 1; TR0的初始化放在主函數(shù)的while中,從而啟動(dòng)T0定時(shí)器,使蜂鳴器按頻率發(fā)聲
    //設(shè)定串口工作方式
    //10位異步收發(fā)(8位數(shù)據(jù)), 波特率可變(由定時(shí)器溢出率控制)
    SM0 = 0;
    SM1 = 1;
    //容許串口中斷
    REN = 1;
    //開(kāi)啟總中斷
    EA = 1;
    //開(kāi)啟串口中斷
    ES = 1;
}

void ser() interrupt 4
{
    //RI為接收中斷標(biāo)志位, 在方式0時(shí), 當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時(shí), 或在其他方式, 串行接收停止位的
    //中間時(shí), 由內(nèi)部硬件使RI置1, 向CPU發(fā)出中斷申請(qǐng), 也必須在中斷服務(wù)程序中, 用軟件將其清0,取消
    //此中斷申請(qǐng), 以方便下一次中斷申請(qǐng)檢測(cè), 即這樣才能產(chǎn)生下一次中斷.
    //這里RI清0, 因?yàn)槌绦蚣热划a(chǎn)生了串口中斷, 肯定是收到或發(fā)送了數(shù)據(jù), 在開(kāi)始時(shí)沒(méi)有發(fā)送任何數(shù)據(jù)
    //那必然是收到了數(shù)據(jù), 此時(shí)RI會(huì)被硬件置1, 所以進(jìn)入串口中斷服務(wù)程序后必須由軟件清0, 這樣才能
    //產(chǎn)生下一次中斷.
    RI = 0;
    //將SBUF中的數(shù)據(jù)讀走給a, 這是此中斷服務(wù)程序最重要的目的
    a = SBUF;
    //將串口中斷標(biāo)志位置1,方便主程序檢測(cè)
    flag = 1;
}

void T0_timer() interrupt 1
{
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;
    num++;
    if (num == benum)
    {
        num = 0;
        beep = ~beep;
    }
}


仿真也測(cè)試了  我在串口助手里面輸入1不來(lái)米 幫忙看看

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:135415 發(fā)表于 2016-7-29 09:01 | 顯示全部樓層
把//ET1=1注釋,有要注釋的沒(méi)有注釋
回復(fù)

使用道具 舉報(bào)

ID:125710 發(fā)表于 2016-7-29 13:53 | 顯示全部樓層
AMB 發(fā)表于 2016-7-29 09:01
把//ET1=1注釋,有要注釋的沒(méi)有注釋

效果一樣的
回復(fù)

使用道具 舉報(bào)

ID:135498 發(fā)表于 2016-7-30 07:08 | 顯示全部樓層
沒(méi)看到讀串口部分,收到的數(shù)在哪里?a的值從哪來(lái)?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表