| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 469 人关注过本帖
标题:at89c51单片机编程,遇到个问题,望指教
只看楼主 加入收藏
Tegrace
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-6-3
收藏
 问题点数:0 回复次数:0 
at89c51单片机编程,遇到个问题,望指教
这是一个AT89C51单片机电子琴的c语言代码,要播放存入的歌曲和1-7七个音阶,同时8段数码管在按下音阶时对应的简谱数字要亮起来。但是编译成功之后,数码管和键盘都没有工作,即数码管不亮同时按下键盘也没有声音(键盘为4x4键盘)
程序代码:
#include
#define uint unsigned int 
#define uchar unsigned char 
void Init(void);//初始化
void Key_Scan(void);//键值扫描
void Delayms(uint z);//延时
void LED_Display(void);//数码显示
void Sound_Player(void);//音频处理
uint Keycode;//键值
uint Time = 0;         
uint Flag = 0;
uint TH0code,TL0code;        
sbit Speaker = P3^0; //扬声器控制引脚
uint Num = 0;
uchar code table[]={ //数码管共阳码表
                     0xc0,0xF9,0xA4,0xB0,
                     0X99,0X92,0X82,0XF8,
                     0x80,0x90,0x88,0x83,
                     0xC6,0xA1,0x86,0x8E};
uchar code Music1_Tab[]={ 
                         0xc0,0xf9,0xa4,0xb0,
                         0x99,0x92,0x82,0xf8,
                         0x80,0x90,0x88,0x83,
                         0xc6,0xa1,0x86,0x8e};        //曲谱1码表
uint code Music2_Tab[]={ //曲谱2码表
                         64021,64103,64260,64400,
                         64524,64580,64684,64777,
                         64820,64898,64968,65030,
                         65058,65110,65157,65178};
uchar code Music3_Tab[]={  //曲谱3码表
                          0x64,0x42,0x62,0x98,0x74,0x92,0x72,0x68,
                          0x64,0x22,0x32,0x44,0x32,0x22,0x3c,0x64,
                          0x42,0x62,0x94,0x04,0x82,0x74,0x94,0x68,
                          0x64,0x32,0x42,0x54,0x04,0x12,0x2c,0x74,
                          0x94,0x98,0x84,0x72,0x82,0x98,0x72,0x82,
                          0x92,0x72,0x72,0x62,0x42,0x22,0x3c,0x64,
                          0x42,0x62,0x94,0x04,0x82,0x74,0x94,0x68,
                          0x64,0x32,0x42,0x54,0x04,0x12,0x2c,0x00};  
/****************************************
        主函数
****************************************/ 

void main()
{
    Init();
    while(1)
    {
        Sound_Player();//音频处理函数
        LED_Display();//数码管显示键值
    }
}
/****************************************
     初始化函数
****************************************/ 

void Init(void)
{
    P0 = 0xff;//先将P0口置为1
    Speaker = 0;
    IT0 = 1;//外部中断0边沿触发
    EX0 = 1;//外部中断0允许
    TMOD = 0x01;//定时器方式1
    ET0 = 1;//定时器0中断允许
    TR0 = 0;//关定时器0
    EA = 1;//开总中断
} 

/****************************************
    音频处理函数
****************************************/
void Sound_Player(void)
{
    if(Flag == 0) //Do~Si七个音调键
    {
        Flag = 1;     
        switch(Keycode)
        {
            case 1:    //Do
            {
                TH0code = 0XFB;
                TL0code = 0XE9;
                TH0 = TH0code;  //置初值
                TL0 = TL0code;  
                TR0 = 1; //开定时器0
                Speaker = ~Speaker;
                break;
            }
            case 2:    //Re
            {
                TH0code = 0XFC;
                TL0code = 0X5C;
                TH0 = TH0code;  //置初值
                TL0 = TL0code; 
                TR0 = 1; //开定时器0 
                Speaker = ~Speaker;
                break;
            }
            case 3:    //Mi
            {
                TH0code = 0XFC;
                TL0code = 0X5C;
                TH0 = TH0code;  //置初值
                TL0 = TL0code; 
                TR0 = 1; //开定时器0 
                Speaker = ~Speaker;
                break;
            }
            case 4:    //Fa
            {
                TH0code = 0XFC;
                TL0code = 0X5C;
                TH0 = TH0code;  //置初值
                TL0 = TL0code;
                TR0 = 1; //开定时器0  
                Speaker = ~Speaker;
                break;
            }
            case 5:    //So
            {
                TH0code = 0XFC;
                TL0code = 0X5C;
                TH0 = TH0code;  //置初值
                TL0 = TL0code;  
                TR0 = 1; //开定时器0
                Speaker = ~Speaker;
                break;
            }
            case 6:    //La 基于51单片机的电子琴设计
            {
                TH0code = 0XFC;
                TL0code = 0X5C;
                TH0 = TH0code;  //置初值
                TL0 = TL0code; 
                TR0 = 1; //开定时器0 
                Speaker = ~Speaker;
                break;
            }
            case 7:    //Si
            {
                TH0code = 0XFC;
                TL0code = 0X5C;
                TH0 = TH0code;  //置初值
                TL0 = TL0code; 
                TR0 = 1; //开定时器0 
                Speaker = ~Speaker;
                break;
            }
            default:break;
        }
    }
    else if(Keycode ==8)  //特殊功能键
    {
        switch(Time)
        {
            case 1:    //播放第一首乐曲
            {
                TH0code = Music1_Tab[Num++];
                TL0code = Music1_Tab[Num++];
                TH0 = TH0code;  //置初值
                TL0 = TL0code; 
                TR0 = 1; //开定时器0
                if(Num == 15) Num = 0;
                Speaker = ~Speaker;
                break;
            }
            case 2:    //播放第二首乐曲
            {
                TH0code = Music2_Tab[Num]/256;
                TL0code = Music2_Tab[Num]%256;
                TH0 = TH0code;  //置初值
                TL0 = TL0code; 
                TR0 = 1; //开定时器0 基于51单片机的电子琴设计
                Num++; 
                if(Num == 15) Num = 0;
                    Speaker = ~Speaker;
                break;
            }
            case 3:    //播放第三首乐曲
            {
                TH0code = Music3_Tab[Num++];
                TL0code = Music3_Tab[Num++];
                TH0 = TH0code;  //置初值
                TL0 = TL0code; 
                TR0 = 1; //开定时器0
                if(Num == 64) Num = 0;
                    Speaker = ~Speaker;
                break;
            }
            default: break;
        }
    }
}
/****************************************
     数码管显示函数
***************************************/
void LED_Display(void)
{
    if(Keycode>0 && Keycode<8)
        P0 = ~table[Keycode];//Do~Si七个音调键分别显示1~7
    else  
        if(Keycode == 8)
             P0 = ~table[Time + 9];//特殊功能键分别显示A、b、C
    TR0 = 0; //关定时器0
}
/****************************************
     键值扫描函数
****************************************/
void Key_Scan(void)
{
    uint key;
    key = P1;
    switch(key) //键值        
    {
        case 0xfe:  //Do
        {
            Delayms(10);  //消抖 基于51单片机的电子琴设计
            if(key == 0xfe)
            {
                Keycode = 1;
                Flag = 0;     
                while(P1 != 0xFF); //等待按键释放
                break;
            }
        }
        case 0xfd:  //Re
        {
            Delayms(10);
            if(key == 0xfd)
            {
                Keycode = 2;
                Flag = 0;     
                while(P1 != 0xFF); //等待按键释放
                break;
            }
        }
        case 0xfb:  //Mi
        {
            Delayms(10);
            if(key == 0xfb)
            {
                Keycode = 3;
                Flag = 0;     
                while(P1 != 0xFF); //等待按键释放
                break;
            }
        }
        case 0xf7:  //Fa
        {
            Delayms(10);
            if(key == 0xf7)
            {
                Keycode = 4;
                Flag = 0;     
                while(P1 != 0xFF); //等待按键释放
                break;
            }
        }
        case 0xef:   //So
        {
            Delayms(10);
            if(key == 0xef)
            {
                Keycode = 5;
                Flag = 0;     
                while(P1 != 0xFF); //等待按键释放
                break;
            }
        }
        case 0xdf:    //La
        {
            Delayms(10);
            if(key == 0xdf)
            {
                Keycode = 6;
                Flag = 0;     
                while(P1 != 0xFF); //等待按键释放
                break; 
            }
        }
        case 0xbf:   //Si
        {
            Delayms(10);
            if(key == 0xbf)
            {
                Keycode = 7;
                Flag = 0;     
                while(P1 != 0xFF); //等待按键释放
                break;
            }
        }
        case 0x7f:   //  播放/下一首
        {
            Delayms(10);
            if(key == 0x7f)
            {
                Keycode = 8;
                Flag = 1;
                Num = 0;     
                if(Time == 4)Time=0;
                    Time++; 
                while(P1 != 0xFF); //等待按键释放
                break;
            } 

        }
        default : break;
    }
}

 

void Delayms(uint z)//延时ms
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--); 
} 

/****************************************
     键盘中断函数
****************************************/
void Key_inter() interrupt 0
{
    Key_Scan();//键值扫描
}
/****************************************
    定时中断函数
****************************************/ 

void T0_inter() interrupt 1
{
    TH0 = TH0code;
    TL0 = TL0code;  
    Speaker = ~Speaker;
} 
搜索更多相关主题的帖子: c语言 数码管 电子琴 单片机编程 歌曲 
2015-06-03 22:14
快速回复:at89c51单片机编程,遇到个问题,望指教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020141 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved