一. 程序功用
二. 程序源码
#include
//声明程序需求的全局变量
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;
}
}