久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3322|回復: 3
打印 上一主題 下一主題
收起左側

這個串口控制蜂鳴器 我選擇ASCII和16進制都試過了就是失敗幫忙看看

[復制鏈接]
跳轉到指定樓層
樓主
ID:125710 發表于 2016-7-28 17:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*一. 程序功能
由上位機發送1給單片機,蜂鳴器以400ms頻率發聲,發送2時以200ms頻率發聲,發送3時以100ms頻率發聲,發送4時關閉蜂鳴器.

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

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

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

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

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

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

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

void ser() interrupt 4
{
    //RI為接收中斷標志位, 在方式0時, 當串行接收第8位數據結束時, 或在其他方式, 串行接收停止位的
    //中間時, 由內部硬件使RI置1, 向CPU發出中斷申請, 也必須在中斷服務程序中, 用軟件將其清0,取消
    //此中斷申請, 以方便下一次中斷申請檢測, 即這樣才能產生下一次中斷.
    //這里RI清0, 因為程序既然產生了串口中斷, 肯定是收到或發送了數據, 在開始時沒有發送任何數據
    //那必然是收到了數據, 此時RI會被硬件置1, 所以進入串口中斷服務程序后必須由軟件清0, 這樣才能
    //產生下一次中斷.
    RI = 0;
    //將SBUF中的數據讀走給a, 這是此中斷服務程序最重要的目的
    a = SBUF;
    //將串口中斷標志位置1,方便主程序檢測
    flag = 1;
}

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


仿真也測試了  我在串口助手里面輸入1不來米 幫忙看看
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:135415 發表于 2016-7-29 09:01 | 只看該作者
把//ET1=1注釋,有要注釋的沒有注釋
回復

使用道具 舉報

板凳
ID:125710 發表于 2016-7-29 13:53 | 只看該作者
AMB 發表于 2016-7-29 09:01
把//ET1=1注釋,有要注釋的沒有注釋

效果一樣的
回復

使用道具 舉報

地板
ID:135498 發表于 2016-7-30 07:08 | 只看該作者
沒看到讀串口部分,收到的數在哪里?a的值從哪來?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产不卡一区二区三区 | 欧美日韩国产高清 | 国产 欧美 日韩 一区 | 欧美videosex性极品hd | 国产免费一区二区三区 | 成人一区精品 | 高清一区二区三区 | 综合久久久 | 成人av观看 | 国产成人一区二区三区精 | 国产精品99久久久久久久久久久久 | 久久国产成人午夜av影院武则天 | 日韩二三区 | 国产一级视频 | 91久久久精品国产一区二区蜜臀 | v亚洲| av在线免费观看网站 | 国产精品色一区二区三区 | 天堂在线免费视频 | 日韩精品一区二区三区在线观看 | 国产午夜av片 | 欧美一区久久 | 成人在线视频观看 | 日日干夜夜操 | 久久精品网| 国产99视频精品免费视频7 | 欧美成人影院在线 | 国产成人艳妇aa视频在线 | 欧洲精品一区 | 69热视频在线观看 | 国产精品成人69xxx免费视频 | 久久激情视频 | 黄色av网站在线观看 | av在线影院 | 国产精品久久九九 | 亚洲天堂一区二区 | 亚洲国产精品一区二区久久 | 黄色成人在线网站 | 日韩电影一区二区三区 | 国产一区三区在线 | 免费h视频 |