找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2803|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机消防车、救护车声音模拟源程序

[复制链接]
跳转到指定楼层
楼主
ID:552758 发表于 2019-6-1 23:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h> //包含特殊功能寄存器的定义
sbit SPK=P1^0; //定义喇叭端口
sbit K1=P1^4; //报警声按键
sbit K2=P1^5; //消防声按键
sbit K3=P1^6; //救护声按键
sbit K4=P1^7; //停止按键
unsigned char frq; //频率变量
unsigned char sel=0; //功能变量
void DelayUs(unsigned char t) //us延时函数
{
    while(--t); //大致延时tus
}
void DelayMs(unsigned char t) //ms延时函数
{
    while(t--) //大致延时tms
    {
        DelayUs(245);
        DelayUs(245);
    }
}

void Keyscan() //键盘扫描
{
    if(K1==0)sel=1; //报警声
    if(K2==0)sel=2; //消防声
    if(K3==0)sel=3; //救护声
    if(K4==0)sel=0; //停止
}


void Init_Timer0(void)
{
    TMOD|=0x01; //方式1,使用"|"可使用多个定时器时互不影响
    EA=1; //开总中断
    ET0=1; //开定时器中断
    TR0=0; //关闭定时器
}

void main() //主程序
{
    unsigned char i; //循环变量定义
    Init_Timer0(); //初始化定时器
    while(1)
    {
        Keyscan();
        if(sel==0)TR0=0;
        else      TR0=1;
        if(sel==1) //模拟报警声
        {
            DelayMs(1); //延时1ms,累加频率值
            frq++;
        }
        if(sel==2) //模拟消防车声
        {
            for(i=0;i<200;i++)
            {
                DelayMs(10); //延时10ms,累加频率值
                frq=i;
            }
            for(i=200;i>0;i--)
            {
                DelayMs(10); //延时10ms,累减频率值
                frq=i;
            }
        }
        if(sel==3)
        {
            frq=0;
            for(i=0;i<60;i++)DelayMs(10);//播放1s左右一种频率
            frq=100;
            for(i=0;i<60;i++)DelayMs(10);//播放1s左右另外一种频率
        }
    }
}

void Timer0_isr(void) interrupt 1
{
    TH0=0xfe; //重新赋值
    TL0=frq; //低8位值在主程序中不断累加
    SPK=!SPK; //端口电平取反
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表