|
/*一. 程序功能
由上位機(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)米 幫忙看看
|
|