打印
[51单片机]

小白求教!!!

[复制链接]
619|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
innvatation|  楼主 | 2017-5-25 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人单片机课程设计简易电子琴,可是仿真出来一直有错误,
#include <reg51.h>

sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;

                             
unsigned char key;

sbit sound=P3^7;
unsigned int C;
unsigned int f;

#define dao 523     
#define re 587      
#define mi 659      
#define fa 698      
#define sao 784     
#define la 880      
#define xi 987      
#define h_dao 1046  


void delays20ms(void)
{
   unsigned char i,j;
        for(i=0;i<100;i++)
         for(j=0;j<60;j++)
           ;
}

void delay()
{
   unsigned char i,j;
          for(i=0;i<250;i++)
            for(j=0;j<250;j++)
                    ;
}

       
void Output_Sound(void)
{
   C=(46083/f)*10;
   TH0=(65536-C)/256;
   TL0=(65536-C)%256;
   TR0=1;
   delay();
   
   TR0=0;
   sound=1;
   key=0xff;

}  
void main(void)
  {  
             EA=1;         //开总中断
           ET0=1;         //定时器T0中断允许
                ET1=1;        //定时器T1中断允许
                TR1=1;        //定时器T1启动,开始键盘扫描
      TMOD=0x11;    //分别使用定时器T1的模式1,T0的模式0
     TH1=(65536-500)/256;  //定时器T1的高8位赋初值
          TL1=(65536-500)%256;  //定时器T1的高8位赋初值         
                         while(1)            //无限循环
                                   {
                                    switch(key)
                                            {
                                                    case 0:f=dao;
                                                                                         
                                                            Output_Sound();     
                                                                 break;
                                                         case 1:f=re;
                                                                
                                                           Output_Sound();     
                                                                 break;
                      case 2:f=mi;                    
                                                           Output_Sound();   
                                                                 break;
                                                    case 3:f=fa;         
                                                             Output_Sound();   
                                                                 break;
                                                         case 4:f=sao;            
                                                               Output_Sound();   
                                                                 break;
                                                         case 5:f=la;                  
                                                            Output_Sound();   
                                                                 break;
                      case 6:f=xi;            
                                                           Output_Sound();   
                                                                 break;
                                                    case 7:f=h_dao;              
                                                           Output_Sound();   
                                                                 break;
                                                       
                           }
                          }       
        }
/**************************************************************
函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波
**************************************************************/

  void Time0_serve(void ) interrupt 1 using 1  
  {
         
        TH0=(65536-C)/256;     //可证明这是13位计数器TH0高8位的赋初值方法
        TL0=(65536-C)%256;     //可证明这是13位计数器TL0低5位的赋初值方法
             sound=~sound;        //将P3.7引脚取反,输出音频方波
  }                                               
  /**************************************************************
函数功能:定时器T1的中断服务子程序,进行键盘扫描,判断键位
**************************************************************/
  void time1_serve(void) interrupt 3 using 2    //定时器T1的中断编号为3,使用第2组寄存器
  {
     TR1=0;                  //关闭定时器T0
     P1=0xff;                 //所有行线置为低电平“0”,所有列线置为高电平“1”
          if((P1&0xff)!=0xff)      //列线中有一位为低电平“0”,说明有键按下
           {
                                 //delays20ms();           //延时一段时间、软件消抖
                                  if((P1&0xff)!=0xff)      //确实有键按下
                                    {
                                       if(P10==0)
                                            key=0;
                                          else if(P11==0)
                                            key=1;
                                          else if(P12==0)
                                            key=2;
                                           else if(P13==0)
                                            key=3;
                                          else  if(P14==0)
                                            key=4;
                                           else if(P15==0)
                                            key=5;
                                           else if(P16==0)
                                            key=6;
                                           else if(P17==0)
                                            key=7;
                                       
                             }
                }
     TR1=1;                    //开启定时器T1
     TH1=(65536-500)/256;  //定时器T1的高8位赋初值
          TL1=(65536-500)%256;  //定时器T1的高8位赋初值                 
}

               

相关帖子

沙发
innvatation|  楼主 | 2017-5-26 17:28 | 只看该作者

扬声器一直响

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝