微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 单片机经典实验实例精华详解(附源程序)

单片机经典实验实例精华详解(附源程序)

时间:04-23 来源:本站整理 点击:

共阴数码管了。

  以下是用AT89C51实验板的两位数码管显示00~99依次循环的汇编语言程序

  a_bit equ 20h ;数码管个位数存放内存位置

  b_bit equ 21h ;数码管十位数存放内存位置

  temp equ 22h ;计数器数值存放内存位置

  star: mov temp,#0 ;初始化计数器,从0开始

  stlop: acall display;调用显示子程序

  inc temp;对计数器加1

  mov a,temp

  cjne a,#100,next ;判断计数器是否满100?

  mov temp,#0;满100就清零重新开始

  next: ljmp stlop;不满就循环执行

  ;显示子程序

  display: mov a,temp ;将temp中的十六进制数转换成10进制

  mov b,#10 ;10进制/10=10进制

  div ab

  mov b_bit,a ;十位在a

  mov a_bit,b ;个位在b

  mov dptr,#numtab ;指定查表启始地址

  mov r0,#4

  dpl1: mov r1,#250 ;

  dplop: mov a,a_bit ;取个位数

  MOVC A,@A+DPTR ;查个位数的7段代码

  mov p0,a ;送出个位的7段代码

  clr p2.7 ;开个位显示

  acall d1ms ;显示162微秒

  setb p2.7;关闭个位显示,防止鬼影

  mov a,b_bit ;取十位数

  MOVC A,@A+DPTR ;查十位数的7段代码

  mov p0,a ;送出十位的7段代码

  clr p2.6 ;开十位显示

  acall d1ms ;显示162微秒

  setb p2.6;关闭十位显示,防止鬼影

  djnz r1,dplop ;循环执行250次

  djnz r0,dpl1 ;循环执行250X4=1000次

  ret

  ;2+2X80=162微秒,延时按12MHZ计算

  D1MS: MOV R7,#80

  DJNZ R7,$

  RET

  ;实验板上的7段数码管0~9数字的共阴显示代码

  numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH

  end

  ;如果是共阳数码管的显示代码

  numtab: DB 30H,0FCH,0A2H,0A4H,06CH,25H,21H,0BCH,20H,24H

  三、单片机演奏音乐实验

  利用单片机演奏音乐大概是单片机爱好者感兴趣的问题之一。这里我们用网站提供的实验板来做这个实验,并且了解单片机演奏音乐的基本原理,和相关的源程序。

  首先来完成必要的硬件部分,硬件部分比较简单,如下图:

  

  AT89C51单片机的P2.5口控制一个8550的三极管,三极管控制电磁蜂鸣器的电源通断。

  我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的高电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制"高""低"电平的持续时间,就能改变输出频率,从而改变音调。

  例如,要产生200HZ的音频信号,200HZ音频的变化周期为1/200秒,即5ms。这样,当P2.5的高电平或低电平的持续时间为2.5ms时就能发出200HZ的音调。

  乐曲中,每一音符对应着确定的频率,我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。

  此外,结束符和体止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。

  为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符。

  程序框图如图2所示。

  

  下面给出程序序请单,可直接在51实验板上进行演奏。本程序演奏的是民歌"八月桂花遍地开",C调,节奏为94拍/分。网友也可以自行找出一首歌,将乐曲翻译成码表输入机器,而程序不变。本实验方法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。

  ;标题 ‘八月桂花香’发声程序

  ORG 0000H

  LJMP START

  ORG 000BH

  INC 20H ;中断服务,中断计数器加1

  MOV TH0,#0D8H

  MOV TL0,#0EFH ;12M晶振,形成10毫秒中断

  RETI

  START:

  MOV SP,#50H

  MOV TH0,#0D8H

  MOV TL0,#0EFH

  MOV TMOD,#01H

  MOV IE,#82H

  MUSIC0:

  NOP

  MOV DPTR,#DAT ;表头地址送DPTR

  MOV 20H,#00H ;中断计数器清0

  MUSIC1:

  NOP

  CLR A ;A清零

  MOVC A,@A+DPTR ;查表取代码

  JZ END0 ;是00H,则结束

  CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下执行

  LJMP MUSIC3

  MUSIC5:

  NOP

  MOV R6,A ;R6=18H音符的频率

  INC DPTR DPTR加一

  MOV A,#0

  MOVC A,@A+DPTR ;取节拍代码送R7

  MOV R7,A ;R7=30H音符发音的时间

  SETB TR0 ;启动计数

  MUSIC2:

  NOP

  CPL P2.5 ;P2.5是音乐输出引脚

  MOV A,R6

  MOV R3,A ;R3=R6=18H

  LCALL DEL

  MOV A,R7

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

网站地图

Top