欣欣学习网,老工程师带你学习单片机技术,欢迎来坐坐。
首  页 | 学习NIOSII | 学习C51 | 学习CPLD | 51+CPLD实验板 | | | MY-RTOS

本栏目的实验需在 WinXp 上操作。建议在 Virtual Box 虚机上安装WinXp系统,使用更方便。

 学习板概述
 安装keil C51软件
 在线烧写程序
 keil C51使用入门
 使用keil C51仿真调试
 使用标准输入输出设备
 点灯程序
 跑马灯程序
 LED数码管扫描显示程序
 键盘扫描程序
 键盘数码管联合扫描
 计时秒表程序
 蜂鸣器发声程序
 产生音阶程序
 字符LCD控制程序
 Flash读写程序
 使用ADC检测模拟量程序
 相关软件与文档


单片机/C51学习板

产生音阶程序


这是一个根据按键输入来发出音阶的程序。按键1~7,分别对应7个音阶。

1.

点击 这里 下载示例工程,保存并解压到 D: 盘根目录下。

2.

启动 ISP 软件,将 D:\ring 下的 mon51.hex 文件烧写到实验板上,关闭 ISP 软件。如果实验板上已有调试代理程序,可略过这一步。ISP 软件的使用方法参见:在线烧写程序

3.

启动 Keil uVision2 集成开发软件,打开 D:\ring 下的 ring.Uv2 工程,重新编译。Keil uVision2 软件的使用方法见:keil C51使用入门

4.

设置好 Monitor-51 Driver 所使用的串口号后,在 Debug 菜单下,点击 Start/Stop Debug session 命令,启动调试界面。如何设置串口号,请参阅:使用keil C51仿真调试

5.

在命令行窗口里,输入 pc = 0x2000 命令,然后按 F5 键,执行该程序。

程序代码如下:

#include <reg52.h>       /* special function register declarations   */
#include <absacc.h>      /* for the intended 8051 derivative         */

#include <stdio.h>       /* prototype declarations for I/O functions */

/***************************************************
 * A型板,定义 model 为 1,B型板,定义 model 为 2。*
 ***************************************************/

#define model 2

#if model == 1
sbit SCC=P3^2;
#else
sbit SCC=P1^7;
#endif

sbit SCR=P3^3;
sbit SCI0=P3^5;
sbit SCI1=P3^4;

sbit BP=P1^3;

unsigned int i;

unsigned char timer1;

unsigned char keyin;

bit BPgate = 1;

unsigned char TL0INIT = 0x00;

unsigned char const xchgtab[]={ 0x01, 0x02, 0x04, 0x05, 0x07, 0x08, 0x00, 0x0f, 
                                0x03, 0x0a, 0x06, 0x0b, 0x09, 0x0c, 0x0e, 0x0d };


/***************************************************
 * 主程序入口。                                    *
 ***************************************************/
void main (void)  
{ 

/***************************************************
 * 设置 T0 定时器工作在模式3,将其分成 TL0、TH0 两 *
 * 定时器。                                        *
 ***************************************************/
  TMOD |= 0x03;

/***************************************************
 * 起动 TL0 定时器。                                *
 ***************************************************/
  TR0 = 1; 

/***************************************************
 * 起动 TH0 定时器。                               *
 ***************************************************/
  TR1 = 1;
  
  
/***************************************************
 * 设定 T0 定时器的中断优先级为高,避免被其它中断打*
 * 断,造成计时不准。                              *
 ***************************************************/
  IP |= 0x02;

/***************************************************
 * 允许 TL0、TH0 定时器中断,并将全局中断控制位置  *
 * 为允许。                                        *
 ***************************************************/
  IE |= 0x8a; 

  while(1){
/***************************************************
 * 等待按键按下。在按键放开期间,延续发声一段时间。*
 ***************************************************/
    i=0;
    timer1=0;
    while(keyin==0){
      if(timer1>100){
        timer1=0;
        i++;
      }        
      if(i>10) BPgate = 1;
    }

/***************************************************
 * 根据按键的值,设定发声频率,允许蜂鸣器发声。    *
 ***************************************************/
    switch(xchgtab[keyin-1]){
      case 1:{
        TL0INIT = 0x24;
        BPgate = 0;
        break;
      }
      case 2:{
        TL0INIT = 0x3c;
        BPgate = 0;
        break;
      }
      case 3:{
        TL0INIT = 0x52;
        BPgate = 0;
        break;
      }
      case 4:{
        TL0INIT = 0x5c;
        BPgate = 0;
        break;
      }
      case 5:{
        TL0INIT = 0x6e;
        BPgate = 0;
        break;
      }
      case 6:{
        TL0INIT = 0x7e;
        BPgate = 0;
        break;
      }
      case 7:{
        TL0INIT = 0x8c;
        BPgate = 0;
        break;
      }
      default:{
        break;
      }

/***************************************************
 * 等待按键放开。                                  *
 ***************************************************/
      while(keyin!=0){}

/***************************************************
 * 延时。                                          *
 ***************************************************/
      i=0;
      timer1=0;
      while(i<10){
        if(timer1>20){
          timer1=0;
          i++;
        }
      }
    }    
  } 
}                               

/***************************************************
 * TL0 的中断处理程序,用来产生一定频率的方波。    *
 ***************************************************/

dirTL0() interrupt 1
{
  static bit i=0;

  TL0 = TL0INIT;
/***************************************************
 * 每次中断,i都取反一次,用以产生方波。           *
 ***************************************************/
  i=~i;

/***************************************************
 * 用 BPgate 来控制,是否把方波送到蜂鸣器的控制脚  *
 * 上。                                            *
 ***************************************************/
  BP = i|BPgate;

}

/***************************************************
 * TH0的中断处理程序,用来给时间变量加1及键盘扫描。*
 ***************************************************/

dirTH0() interrupt 3
{
  static unsigned char i,k;

  i++;

  if(i>7){
    i=0;
    SCR=1;
    SCR=0;
    keyin=k;
    k=0;
  }else{
    SCC=1;
    SCC=0;
  }

  if(SCI0){
    if(k==0){
      k=i+1;
    }
  }

  if(SCI1){
    if(k==0){
      k=i+9;
    }
  }

  timer1++;
}




管理员信箱: stonewayqi@hotmail.com

欣 欣 学 习 网

粤ICP备2023138008号