微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机中基于定时器的简易电子琴问题

单片机中基于定时器的简易电子琴问题

时间:10-02 整理:3721RD 点击:
/* ch09-5-1.c- 简易电子琴实验 */
#include  <reg51.h>                        // 包含reg51.h档  
#define SW_Port  P2                        // 定义按键位置
sbit  buzzer=P3^7;                        // 声明蜂鸣器位置
unsigned char  keys;                // 声明变量  
unsigned char  TH0_temp,TL0_temp;//声明计时相关变量
/* 声明音阶阵列 --                     Do        Re        Mi        Fa        So        La        Si        Do_H  */
unsigned char code tone[]= {956,        852,        759,        716,        638,        568,        506,        478 };
void sound(unsigned char);        // 声明发声函数
//====主程序=====================================
main()                                                // 主程序开始
{
        IE=0x82;//启动定时器0中断
        TMOD=0x01;//选择Mode1模式
        while (1)                                // while循环   
        {       
                buzzer=1;
                keys=~SW_Port;                // 读取按键
                switch (keys)                // 判读
                {        case 0x01:sound(0);break;         // 按下S1,发Do音
                        case 0x02:sound(1);break;         // 按下S2,发Re音
                        case 0x04:sound(2);break;         // 按下S3,发Mi音
                        case 0x08:sound(3);break;         // 按下S4,发Fa音
                        case 0x10:sound(4);break;         // 按下S5,发So音
                        case 0x20:sound(5);break;         // 按下S6,发La音
                        case 0x40:sound(6);break;         // 按下S7,发Si音
                        case 0x80:sound(7);break;         // 按下S8,发高音Do音
                        default:TR0=0;break;
                }        
        }
                                                                // while循环结束
}                                                                                // 主程序结束
//=====发声函数=============================
void sound(unsigned char x)                                // 发声函数开始
{       
        LED=SW_Port;                                                // 点亮LED
        TH0_temp=(65536-tone[x])/256;
        TH0=TH0_temp;
        TL0_temp=(65536-tone[x])%256;
        TL0=TL0_temp;
        TR0=1;//启动定时器0       
}                                                                                // 结束
//======timer0中断子程序===============================
void timer0_int(void) interrupt 1
{
        TH0=TH0_temp;
        TL0=TL0_temp;
        buzzer=~buzzer;       
}
这是基于定时器的简易电子琴,想问一下为什么声音音调听起来是对的,但是特别嘈杂,又很尖锐的感觉,想问一下这是为什么?                                               

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top