如何让接在AT89C51 P1.5 口上的蜂鸣器发出指定频率和延时的声音??

jyd30 2003-12-03 03:21:52
以下是汇编实现的程序,如何改写为C51 程序??

关键是如何用C语言让接在AT89C51 P1.5 口上的蜂鸣器发出指定频率和延时的声音??


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
MOV B,#00H ;表序号清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代码
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
SETB TR0 ;启动计数
MUSIC2:
NOP
CPL P1.5
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲结束,延时1秒后继续
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H

END
...全文
596 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhizhengtanwei 2003-12-06
  • 打赏
  • 举报
回复
别急,程序我已经记下了,可 以帮你看一看。
CrazyGentleman 2003-12-06
  • 打赏
  • 举报
回复
自己写的汇编吗?

抄的就麻烦了!难
zhizhengtanwei 2003-12-05
  • 打赏
  • 举报
回复
可以在C语言中用asm之类的语句嵌套汇编
如果有C51的编译器,不就直接编译装载了,

当然你要是非要用C语言,而自己又不是很在行,还是好好学一下吧
Hermit 2003-12-04
  • 打赏
  • 举报
回复
汇编都写出来了,C应该更简单啊
ppcust 2003-12-04
  • 打赏
  • 举报
回复
把它翻译成c就行了
HEROP 2003-12-04
  • 打赏
  • 举报
回复
嵌套汇编或用C编写都可以啊
888yifeng 2003-12-03
  • 打赏
  • 举报
回复
在C中嵌入汇编不就可以了。
01-LedTest -- 实现LED按照一定频率闪烁。主要用来测试LED工作是否正常。P10要通。 02-CrossLed -- 实现花灯显示。主要学习对软件延时的使用。P10要通。 03-FlowRight -- 实现流水灯,方向是从左向右。主要学习在C语言里如何实现准确的位操作。P10要通。 04-FlowLeft -- 实现流水灯,方向是从右向左。主要学习在C语言里如何实现准确的位操作。P10要通。 05-button -- 独立按键测试,实现按哪个按键然后使用对应LED显示。实现按键的检测和LED的控制。拨码开关要打到OFF位置。 06-boma -- 用LED显示拨码状态。不可以按按键。 07-Relay -- 继电器测试程序,并有LED指示同时伴有蜂鸣器声音。P8纵向连上面2个。 08-music -- 用C语言演奏生日快乐歌,使用软件定时。使用软件定时演奏生日快乐歌。P8纵向连上面2个。 09-musicasm -- 用汇编语言演奏一首民歌,使用硬件定时。主要学习51定时器汇编语言编写中断功能,和如何编写中断服务程序。P8纵向连上面2个。 10-music2 -- 用C语言中断演奏。主要学习在C语言中定义51内部定时器中断服务程序。P8纵向连上面2个。 11-disp1234 -- 采用软件延时在数码管上显示1234ABCD。这是比较普遍的数码管显示。P14通 12-disp1234int -- 采用硬件延时在数码管上显示1234ABCD。利用中断可以节约资源,这个程序比10更好。P14通 13-adddec -- 使用两个按键S22,S23控制数码管上显示的数加减,具有去抖动功能。主要讲如何进行数码管动态显示并且怎样对键盘去抖动。P14通。 14-time -- 15-alarm -- 综合实验,实现倒计时结束时使用蜂鸣器报警,编程技巧的组合。P8纵向连上面2个。 16-uart -- UART发送和收,实现从PC发送到单片机任何字母和数字,单片机立即向PC发送同样的字母数字可以由超级终端或者串口调试助手调试。 17-uartint -- UART收采用不占用资源的中断收,其余同16。推荐使用串口中断方式,使用查询方式太占用资源。 18-18b20 -- 使用温度传感器18B20测温度,并用数码管显示。P14通。 19-1602 -- 使用LCD1602显示字符。LCD1602到P4,方向和板子方向相反。 20-24c08 -- 对24c08进行写读操作。并把写进和读到的数用LED显示。P8纵向连下面2个。 21-matrix -- 调试矩阵键盘,对应LED亮。注意,本程序执行需要把拨码开关打到OFF状态,程序只有矩阵键盘前两行显示,后两行请自行添加代码。 22-DS1302 -- 使用DS1302时钟芯片对预制的时间进行计时。P9横向连左边两个。 23-chibang -- 演奏《飞舞翅膀的女孩》等音乐的综合程序。 24-wannianli -- 综合程序,用DS1302,LCD1602,温度传感器等板上设备做一个万年历。LCD1602要正确连,P9横向连左边两个。使能DS1302。独立按键从左到右功能为,选择设置/加/减/确定,由于去抖动功能和LCD响应时间问题,所以要按时间稍微长一点。 25-demo -- 使用RS-232实现PC与51之间通信,详细操作方法请见相关教程。 26-remote -- 红外功能测试程序,使用普通遥控器和红外收头协同工作,用板上LED显示收状态,LED_EN跳线必须通,否则观察不到LED状态。 27-1602-scroll -- LCD1602动态字幕显示,方便用户理解1602的用户指令集。有时程序不正常,则为LCD1602的RAM没有清空所致,必须给板子重新上电,并按一次复位键。 28-12864 -- LCD12864显示程序。AT89S5x系列单片机需要摘掉LCD下载程序,下载完毕后插上LCD,并按复位键才可以正常显示,带着LCD下载程序会失败。STC单片机则无此问题。 29-12864-pic -- LCD12864的汉字,图形,半屏,反白及动态显示测试程序。注意事项同28。 30-adc0832 -- 扩展ADC0832调试程序,具体扩展口请见程序内说明。
单片机课程设计报告 学生姓名: 学 号: 教学院系: 专业年级: 指导教师: 完成日期: 2011年6月21日 目录 第一章 基础设计实验 - 2 - 1.1 实验内容 - 2 - 1.2 实验原理 - 2 - 1.3实验流程图 - 2 - 1.4实验模拟电路 - 3 - 1.5 实验程序编译 - 4 - 1.6 实验程序 - 6 - 1.7实验结果 - 7 - 1.8基础实验总结 - 7 - 第二章 基础拓展 - 8 - 2.1 实验内容及要求 - 8 - 2.2 实验流程图 - 8 - 2.3 实验原理简述 - 9 - 2.4实验模拟电路图 - 9 - 2.5 实验程序设计及原理 - 10 - 2.6 实验结果及误差分析 - 12 - 2.6.1 实验结果 - 12 - 2.6.2误差分析 - 15 - 第三章 提高设计报告任务说明书 - 16 - 3.1 小组成员及学号 - 16 - 3.2 本人工作任务详细说明 - 16 - 第四章 实验心得 - 18 - 参考文献: - 18 - 第一章 基础设计实验 1.1 实验内容 用单片机设计一款流水灯 1.2 实验原理 本次实验基于AT89C51单片机来设计一款简单的流水灯。结合Uvision3和 ISIS 7 Professional这两款软件来设计和模拟。利用51 单片机来控制发光二极管的点亮和熄灭,主要实现延时控制和循环移位。本次实验程序 是通过软件的软定时实现延时的。 1.3实验流程图 图1.3 实验流程图 1.4实验模拟电路 此为在ISIS 7 Professional上设计的模拟电路 图1.4 实验模拟电路图 1.5 实验程序编译 1:打开Keil程序,选择工程菜单。 图1.51 Keil程序 2:选择新建uVision工程,保存为工程名称。 图1.52 新建uVision工程 3:选择Atmel公司的AT89C51设备。 图1.53 选择AT89C51设备 4:添加程序文本。 图1.54 添加程序文本 5:编译程序之前,在闪存菜单设置选项中选择输出选项,在产生HEX文件前打钩即可。 图1.54 产生HEX文件 1.6 实验程序 ORG 00H LOOP: MOV A,#0FEH MOV R2,#8 OUTPUT: MOV P1,A RL A ACALL DELAY DJNZ R2,OUTPUT LJMP LOOP DELAY: MOV R6,#0 //利用指令执行时间来进行延时设计 MOV R7,#0 DELAYLOOP: DJNZ R6,DELAYLOOP DJNZ R7,DELAYLOOP RET END 1.7实验结果 将Keil产生的HEX文件导入到模拟电路的51芯片中,得到仿真结果如下 图1.7 实验结果图 1.8基础实验总结 本次实验难度不是很大,做起来也较轻松。硬件部分由ISIS7 仿真可通过对电阻值的调整从而来调整LED的亮度,软件部分则可以通过对实验初值的设 计来控制流水灯的流行速度。如果对流行的速度有更高一步的要求则需要利用51单片机 本身的定时/计数器来进行精准中断定时。 第二章 基础拓展 2.1 实验内容及要求 利用AT89C51单片机设计电子门铃。要求按下开关使蜂鸣器发出不同频率声音。 2.2 实验流程图 图2.2 实验流程图 2.3 实验原理简述 要使无源蜂鸣器发出声音并且频率不一样,就得提供不同频率的脉冲对其进行驱动。我 们通过对51单片机的输出端口不断的取反达到输出130~550HZ的脉冲,所以要通过程序在 其中加入延时(软延时)来控制脉冲频率的变化。本次设计我们准备发出四种不同频率声音。 2.4实验模拟电路图 图2.4 实验模拟电路 2.5 实验程序设计及原理 #include #include int count; sbit in=P1^7; sbit out=P1^0; void delayms(int xms) { int i,j; for(i=xms;i>0;i--) for(j=200;j>0;j--); } void delay500() { int i; for(i=100;i>0;i--) { _nop_(); } } void main() { out=1; while(1) { if(in==0) { for(count=400;count>0;count--) //count值控制响铃时间 { out=~out ; // 取反以形成脉冲 delay500(); // 形成频率1 } for(count=300;count>0;count--) { out=~out ; delay500(); delay500(); //形成频率2 } delayms(500
目 录 第1章 绪 论 1 1.1 例题的仿真 1.2 选题背景、意义 3 1.3 八路抢答器的功能简介 4 第2章 系统硬件设计 5 2.1 芯片的选择 5 2.1.1 控制器的选择 5 2.1.2 显示模块的选择 5 2.1.3 键盘的选择 6 2.2.4 芯片最终选择方案 6 2.2 AT89C51单片机简单概述 7 2.2.1 51系列单片机的功能特性 7 2.2.2 AT89C51单片机结构说明 8 2.3 硬件的构成及功能 10 2.3.1 抢答器的硬件图 11 2.3.2 时钟频率控制电路 11 2.3.3 复位电路的设计 12 2.3.4 报警电路的设计 13 2.3.5 显示电路的设计 13 2.3.6 键盘扫描电路的设计 14 第3章 系统软件设计 16 3.1 系统主程序设计 16 3.2 键盘扫描程序设计 17 3.3 显示程序设计 18 第4章 系统调试与软件仿真 19 4.1 硬件调试 19 4.2 Keil uVision2软件调试 19 4.3 Proteus仿真 20 第5章 总 结 23 附 录 23 附录一 主程序清单 23 附录二 单片机八路智能抢答器原理图 37 参 考 文 献 38 第一章 绪 论 1.2 课本例题仿真 例题 4-6 在Keil uVision2软件中调试程序程序如下: 例题 5-1 在Keil uVision2软件中调试程序程序如下: 1.2 选题背景、意义 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传 统的分立元件或数字逻辑电路构成的控制系统,正以前所未有的速度被单片机智能化控 制所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说智能化控制 与自动控制的核心就是单片机。 目前,抢答器已经作为一种必不可少的工具广泛应用于各种智力和知识竞赛场合,但 一般的抢答器可靠性低,使用寿命短,介于这些不方便因素,此次设计提出了用AT89C5 1单片机为核心控制元件,设计一个简易的八路抢答器。 本方案以AT89C51单片机作为主控核心,与晶振、数码管、蜂鸣器等通过外围口实 现的八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时器/计数器 等,设计的八路抢答器不仅具有实时显示抢答选手的号码和抢答时间的功能,同时还利 用汇编语言编程,使其实现复位、定时和报警的功能。本次设计的系统实用性强、判断 精确、操作简单、扩展功能强。 1.3 八路抢答器的功能简介 此次设计的抢答器具有同步显示的功能,并且有蜂鸣器的辅助,使得整个设计更加完 整。 在每次竞赛开始前,主持人读完比赛规则,可以对抢答器进行的时间进行预设。时间 设定按键组共有4个按键,其中一个键为抢答时间修改键,一个为回答时间按键,剩下的 两个按键为加一和减一按键。 比赛开始,主持人读完题之后按下"开始键",即抢答开始,蜂鸣器提示一次,此时数 码管开始显示30s的倒计时;直到有一个选手按下抢答键,对应的会在数码管上显示出该 选手的编号和回答剩余的时间,同时蜂鸣器也会发出一次提示音,以示有人抢答本题; 如果在规定的30s时间内没有人做出抢答,则此题作废,开始新一轮的抢答。在抢答和回 答时间的最后5s,蜂鸣器都会给予报警提示。在倒计时过程中,主持人可以随时按"停止 键"结束本次回答或者抢答。 在主持未按下开始键,若果有人按下抢答键,则属于犯规抢答,此时,数码管上会显 示违规选手的编号,同时蜂鸣器会以1s一次的频率发出警告。在每次抢答前后,主持人 都可以按下复位键让系统清零,此时数码管上会显示"FFF"。 第2章 系统硬件设计 硬件电路部分是一个完整电路的关键部分,硬件性能的好坏关系到整个系统的性能。 本章节主要介绍了八路抢答器的硬件的选择及电路的设计。 2.1 芯片的选择 芯片选择的原则是经济、寿命长、设计简单。对此我们作了详细的论证。 2.1.1 控制器的选择 控制器主要用于对显示、抢答、音乐、计分等模块进行控制。控制器的选择有以下两 种方案。 方案一:采用FPGA(现场可编程门列阵)作为系统的控制器。FPGA可以实现各种复杂 的逻辑功能,规模大,密度高,它将所有器件集成在一块芯片上,减小了体积,提高了 稳定性,并且可以应用EDA软件仿真、调试,易于进行功能扩展。FPGA采用并行的输入输 出方式,提高了系统的处理速度,适合作为大规模实时系统的控制核心。但由于本设计 对数据处理的速度要求不高,FPGA的高速处理的优势得不到充分体现,并且由于其集成 度高,使其成本偏高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电 路设计和实际焊的工作。 方案二:采用AT89C51作为系统控制器的CPU方案。单片机算术运算功能强、软件编程 灵活、自由度大,可以用软件编程实现各种算法和逻辑
这是DS小龙哥编写的(STC)51单片机开发手册,适合51单片机入门初学者,大学生等当做工具书使用。实验的平台采用的是普中科技单片机平台,文章中的知识点详细,代码清晰,注释清楚,可以复制粘贴,配套代码详细。目前写了4个大章节,后续会持续更新,更新后重新下载即可。 每个例子的完整的工程源码在PDF里有百度云盘的下载链。失效了可以私信发送。 目前PDF里包含的目录如下: 51单片机开发手册 1 一、 单片机开发入门知识介绍 1 1.1 51单片机介绍 1 1.2 市场上的主流单片机种类 1 1.3 FPGA与单片机区别 2 1.4 DSP和单片机区别 3 二、搭建开发环境 4 2.1 STC单片机命名介绍 4 2.2 安装keil软件 4 2.3 新建工程 5 2.4 下载程序 8 2.5 使用辅助工具计算延时时间 12 2.6 STC90C51系列单片机引脚图 13 三、 基础入门学习 14 3.1 LED灯模块 14 3.2 蜂鸣器模块 17 3.5 独立按键 18 3.6 矩阵键盘 22 3.7 独立数码管(静态数码管) 26 3.8 动态数码管 29 3.9 LED 16*16点阵 33 3.10 采用38译码器驱动8位数码管 48 四、单片机提高篇 53 4.1 定时器 53 4.2 中断 60 4.3 串口通信 71 4.4 NEC红外线遥控器解码 80 4.5 DS18B20温度传感器 87 4.6 EEPROM存储芯片(AT24C02) 96 4.7 DS1302 实时时钟芯片 107 4.8 PCF8591(ADC/DAC)转换芯片 119 4.9 (HC-SR04)超声波测距模块 130 4.10 使用计数器测量NE555脉冲频率 134 4.11 LCD1602显示屏 139 四、 单片机项目篇 146 5.1 16x16点阵滚动显示 146

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧