串行口通信单片机根据上位机发送的数字控制蜂鸣器发声

发布者:painter最新更新时间:2016-03-08 来源: eefocus关键字:串行口通信  单片机  上位机 手机看文章 扫描二维码
随时随地手机看文章
一. 程序功能
由上位机发送1给单片机,蜂鸣器以400ms频率发声,发送2时以200ms频率发声,发送3时以100ms频率发声,发送4时关闭蜂鸣器.
 
二. 程序源码
#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;
    }
}
 
关键字:串行口通信  单片机  上位机 引用地址:串行口通信单片机根据上位机发送的数字控制蜂鸣器发声

上一篇:串行口通信 发送0~255数据,单片机再将数据发送回上位机
下一篇:串行口通信 单片机在数码管显示AD采集值

推荐阅读最新更新时间:2024-03-16 14:46

基于pic单片机的评估板设计方案
pic单片机是单片机系列中的佼佼者,对于pic单片机,想必大家均有一定了解。在现实中,pic单片机的应用更是随处可见。 近年来,由于数据通信需求的推动,加上半导体、计算机等相关电子技术领域的快速发展,短距离无线与移动通信技术也经历了一个快速发展的阶段。短距离无线通信通常指的是 l00m 到 200m 以内的通信。 它被广泛应用于无线数据采集、无线水表、煤气表、电力表抄表、工业遥控、遥测、工业数据采集、楼宇自动化、安防、机房设备无线监控、家庭自动化数据网络组网等领域。 IAI 系列无线芯片具有集成度高,外围元件少,功耗低,性能稳定可靠,芯片内部集成了 FSK 无线收发必需的全部功能模块,包括多边带 PLL 合成器、PA、LN
[单片机]
基于pic<font color='red'>单片机</font>的评估板设计方案
基于MAX267的程控滤波器的实现
滤波是信号处理、数据传送和抑制干扰等领域必不可少甚至是至关重要的环节。最常用的滤波器是RC有源滤波器,它是由电阻、电容以及运算放大器构成,并通过模拟开关选取不同的R,C的值来改变滤波器的频率特性。对于高阶有源滤波器,由于所需模拟开关很多,电路复杂,分布参数较大,截止频率精度不高。而采用频率特性可变的程控开关电容滤波器,用程控方法对带宽大的信号进行滤波的方法可以克服以上的缺点。由于MAXIM公司生产的开关电容程控滤波器性价比较高,且易于程控,本文在线性雷达料位仪测试系统中采用了MAX267带通有源滤波器。 1 MAX267概述 MAX267内部含有2个独立的二阶开关电容带通滤波器,它有12个可编程输入端,其中5个用来设置滤波器中心频
[单片机]
基于MAX267的程控滤波器的实现
基于单片机中央空调能效管理系统
l 引 言 中央空调系统主要由制冷机、冷却水循环系统、冷冻水循环系统,风机盘管系统和散热水塔组成。制冷机通过压缩机将制冷剂压缩成液态后送蒸发器中与冷冻水进行热交换,将冷冻水制冷,冷冻水泵将冷冻水送到各风机风口的冷却盘管中,由风机吹送冷风达到降温的目的。在系统中,冷动泵、冷却泵、水塔风扇变频器采用开环控制,由维护人员根据季节不同和负荷的变化进行调节,在每一个房间内都安装热交换器和循环风机,通过控制风机的转速来改变热交换量的大小,达到调节房间温度的目地。 常见的控制方法是按“高、中、低、关”分档模式控制,其缺点是房间的温度需要手动调节,各种环境因素的变化常常会使人感到不适。风机转速控制方案,采用变频器调速控制,有效地解决了上述
[单片机]
基于<font color='red'>单片机</font>中央空调能效管理系统
51单片机之计时器
一、实验目的: 让六个数码管动态显示数字,计算秒数 二、实验分析: a.因为要显示秒数,所以我们首先应该定义一个数组,用来存放0-9数字在数码管上对应的 十六进制数 b.3/8译码器的使能设置 c.定时器的理解。首先应该知道定时器与TMOD和和TCON有关。对于TMOD值得我们特别注意的是TMOD的Gate位(门控位)和C/T位。Gate=0时,仅由运行控制位TR1/TR0来启动定时器运行。而当Gate=1时,仅由运行控制位TR1/TR0和外中断引脚(INT0和INT1)上的高电平共同来启动定时器运行。C/T=0为定时模式,C/T=1为计数模式。我这次用到的是定时器1的方式一,为了不影响TMOD上的其他位,我
[单片机]
基于单片机ATmega16的无线温度监测系统
摘要:利用AVR系列的ATmega16单片机、无线收发模块nRF24L01、数字温度传感器DS18B20和LCD1602液晶显示器设计了无线温度监测系统。该系统通过配置ATmega16单片机,采集DS18B20转换的温度量,将温度信息显示在LCD1602液晶显示器上,同时通过无线收发模块将温度信息传送到管理终端进行显示和处理。系统同时保证当被测温度不在合理范围时发出声音报警信号。 关键词:单片机;ATmega16;DS18B20;无线温度监测;nRF24L01 0 引言 随着社会的发展和进步,越来越多的场合对温度的要求日臻严格,温度监控系统的应用日趋受到重视。在农业发展领域,农业大棚、冷库、培育温室等众多场合都需要温度测量技
[工业控制]
基于<font color='red'>单片机</font>ATmega16的无线温度监测系统
基于AT89C51单片机和DDS器件实现频率特征测试仪的设计
1、 引 言 频率特性是一个系统(或元件)对不同频率正弦输入信号的响应特性。如图1所示,被测系统输入幅值为Ar、角频率为ω的正弦信号,如果该系统是线性的,则其稳态输出也是正弦信号,频率ω不变,幅值为Ac,相角差为φ。改变ω可以得到一系列输入和输出数据。输出对输入的幅值比A(ω)=Ac/Ar与ω的关系曲线称为该系统的幅频特性,通常取20 lg A(ω)称为对数幅频特性。输出对输入的相角差φ(ω)与ω的关系曲线称为该系统的相频特性。幅频特性和相频特性综合称为频率特性,常用的是系统的开环频率特性即波特图。 一个系统的频率特征可通过频率特征测试仪来测定。频率特性测试仪也称扫频仪,用于测试被测网络的幅频特性。他可以测量被测网络的谐振频
[单片机]
基于AT89C51<font color='red'>单片机</font>和DDS器件实现频率特征测试仪的设计
51单片机单键开关
51单片机单键开关程序,按一下点亮led,再按一下关闭led. 主程序: /************************** 说明: 按键被按下时led灯灭 **************************/ #include reg52.h #define uint unsigned int #define uchar unsigned char //定义按键端口 sbit key = P1^0; //定义LED灯端口 sbit led = P2^0; //延时函数声明 void delay(uint xms); //程序入口 void main(){ while(1){ //第一次判断 if(key == 0
[单片机]
HC705单片机的LED驱动技术
    本文介绍了使用MC68HC705J1A大电流引脚,不使用外部晶体管放大电路,直接驱动LED的的方法。文中所提出的计算公式对不同的单片机(MCU)(低电平电流IOL 不同)都适用。只是公式中的最大低电平电流要改变。     正常的HCOMS I/O引脚具有足够的电流来驱动HCMOS或TTL电路的输入。这些引脚通常在输出低电平0.4V时能够吸入1.6mA的电流。但是在许多应用场合,当1个CMOS输出引脚用于驱动较大电流的设备时,就显得力不从心了。例如LED(发光二极管)、前级运算放大器等,大约需要10mA电流。通常的做法是再加驱动电路,如:用三极管的放大电路驱动或用其他如75452等驱动能力大的集成电路来驱动。   
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved