当前位置:文档之家› 蜂鸣器驱动程序设计

蜂鸣器驱动程序设计

蜂鸣器驱动程序设计
蜂鸣器驱动程序设计

.

蜂鸣器驱动

课程设计

专业:xxxxxxxxxxxxxx

班级:xxxxxxxxx

学号:xxxxxxxxx

姓名:xxxx

设计题目:蜂鸣器驱动程序设计

2016年12月

目录

一.任务 (2)

1.目标 (2)

2.环境 (2)

3.需求: (2)

二.总体设计 (2)

1.处理流程 (2)

2.模块介绍 (3)

3.模块接口设计 (3)

4.各个模块设计 (3)

三.PWM蜂鸣器字符设备驱动 (3)

1.模块设计 (3)

1. 模块介绍 (3)

2. 模块结构图 (4)

2.接口设计 (4)

1. 数据结构设计 (4)

2. 驱动程序接口 (4)

3.函数设计 (4)

1.初始化函数 (5)

2. 字符设备打开函数 (6)

3. 字符设备关闭函数 (7)

4. 模块卸载函数......................................................................................... (8)

5. 文件操作接口函数 (8)

四. PWM蜂鸣器字符设备驱动测试 (8)

1.调用系统函数ioctl实现对蜂鸣器的控制 (8)

五.tiny210开发板调试 (9)

六.综合设计总结与思考 (10)

一.任务

1.目标:

编写按键蜂鸣器驱动程序函数与测试文件,实现上位机与tiny210-SDK开发板的连接,利用函数实现对蜂鸣器通过按键来启动与关闭。

2.环境:

①软件环境:windows 7 系统和VMware Workstation 软件

②硬件环境:tiny210开发板,内核部分Linux-3.0.8 ,交叉编译版本arm-linux-gcc-4.5.1-v6-vfp1

Linux系统介绍:

Linux是一种自由开发源码的类Unix操作系统,存在这许多不同的Linux 版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。

Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来说,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。

tiny210开发板中模块介绍:

①PWM蜂鸣器模块

PWM(脉冲宽度调制)简单的讲是一种变频技术之一,是靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。来看看我们实际生活中的例子,我们的电风扇为什么扭一下按扭,风扇的转速就会发生变化;调一下收音机的声

音按钮,声音的大小就会发生变化。这些都是PWM的应用,都是通过PWM输出的频率信号进行控制的。

②蜂鸣器的种类和工作原理

蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。

电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

有源蜂鸣器和无源蜂鸣器的区别:这个“源”字是不是指电源,而是指震荡源,即有源蜂鸣器内有振荡源而无源蜂鸣器内部没有振荡源。有振荡源的通电就可以发声,没有振荡源的需要脉冲信号驱动才能发声。

3.需求:

要实现PC与tiny210开发板的通信,要求在PC机上的VMware Workstation 软件的Red Hat Enterprise Linux环境下编写程序,包含蜂鸣器驱动程序和测试文件。利用交叉编译器arm-linux-gcc-4.5.1-v6-vfp1生成目标文件,最后讲目标文件下载到开发板,并且驱动蜂鸣器根据按键的不同完成启动或者停止的操作。

二.总体设计

1.处理流程:

2.模块介绍:

①按键模块:通过按键来操作蜂鸣器的启动与停止。

②蜂鸣器模块:通过加载蜂鸣器驱动模块到内核,驱动蜂鸣器。

①按键模块:

A.正确驱动主设备号和次设备号

B.实现字符设备驱动程序

C.实现file-operation结构

D.实现初始化函数,注册字符设备

E.实现卸载函数,释放字符设备

F.创建文件节点

②按键模块:

G.正确驱动住设备号和次设备号

H.实现字符设备驱动程序

I.实现file-operation结构

J.实现初始化函数,注册字符设备

K.实现卸载函数,释放字符设备

L.创建文件节点

模块设计:

(1)beep.c

#include

#include

#include

#include

#include

#include

#include

static int beep_major=0;

static dev_t beep_devno;

static struct cdev beep_cdev;

static int *pload=NULL;

#define BEEPNUM 3

static int str_len(char *str)

{

int count=0;

while(*str!='\0')

{

count++;

str++;

}

return count;

}

ssize_t beep_read (struct file *fp, char __user *buff, size_t count, loff_t *fps)

{

char string[20]="HELLO,EVERYONE\n";

int retur=0;

printk("%s\n",__FUNCTION__);

retur=copy_to_user(buff,string,str_len(string)+1);

return retur;

}

ssize_t beep_write (struct file *fp, const char __user *buff, size_t count, loff_t *fps) {

char string[100];

int retur=0;

printk("%s",__FUNCTION__);

retur=copy_from_user(string,buff,count);

printk("kernal----> %s\n",string);

return retur;

}

int beep_open(struct inode *nodep,struct file *fp)

{

unsigned int value=0;

printk("%s\n",__FUNCTION__);

pload=ioremap(0XE02000A0,16);//convert register physical address to virtual address value=ioread32(pload);

value&=~0x1<<3;

value&=~0x1<<2;

value&=~0x1<<1;

value|=0x1<<0;

iowrite32(value,pload);

return 0;

}

int beep_release(struct inode *nodep,struct file *fp)

{

printk("%s\n",__FUNCTION__);

return 0;

}

void beep_start(void)

{

unsigned int value=0;

value=ioread32(pload+1);//read data register

value|=0x1<<0;

iowrite32(value,pload+1);

}

void beep_stop(void)

{

unsigned int value=0;

value=ioread32(pload+1);//read data register

value&=~0x1<<0;

iowrite32(value,pload+1);

}

long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)

{

printk("%s\n",__FUNCTION__);

switch(cmd)

{

case 0://beep stop

beep_stop();

break;

case 1://beep start

beep_start();

break;

}

return 0;

}

static struct file_operations beep_ops=

{

.open=beep_open,

.release=beep_release,

.read=beep_read,

.write=beep_write,

.unlocked_ioctl=beep_unlocked_ioctl

};

static void alloc_beep_dev_num(void)

{

if(beep_major>0)

{

beep_devno=MKDEV(beep_major,0);

register_chrdev_region(beep_devno,BEEPNUM,"beep");

}

else

{

alloc_chrdev_region(&beep_devno,0,BEEPNUM,"beep");

beep_major=MAJOR(beep_devno);

}

printk("beep_major = %d\n",beep_major);

}

static void initial_cdev(void)

{

cdev_init(&beep_cdev,&beep_ops);

beep_cdev.owner=THIS_MODULE;

beep_cdev.ops=&beep_ops;

beep_cdev.dev=beep_devno;

beep_cdev.count=BEEPNUM;

cdev_add(&beep_cdev,beep_devno,BEEPNUM);//register a cdev variable to linux kernel

}

static int __init beep_init(void)

{

printk("%s\n",__FUNCTION__);

alloc_beep_dev_num();//get device number

initial_cdev();//initial and register cdev variable

return 0;

}

static void __exit beep_exit(void)

{

printk("%s\n",__FUNCTION__);

unregister_chrdev_region(beep_devno,BEEPNUM);

cdev_del(&beep_cdev);

return ;

}

module_init(beep_init);

module_exit(beep_exit);

三.PWM蜂鸣器字符设备驱动

1.蜂鸣器模块介绍及结构图

开发板上蜂鸣器原理图分析

由原理图可以得知,蜂鸣器是通过GPD0 IO口使用PWM信号驱动工作的,而GPD0口是一个复用的IO口,要使用它得先把他设置成TOUT0 PWM输出模式。

GPD0参数

要让蜂鸣器发声,需要两大要素:①将蜂鸣器接到正确的端口并且设置为输出口,②将端口设置为高电平

要使蜂鸣器发声,就是要让GPD0作为输出端,同时该端口要设为高电平。也就是说GPD0设置为01为输出,让GPDDAT的最后一位设置为1则该端口就置成了高电平。

2模块代码分析:

2.1打开设备模块

int beep_open(struct inode *nodep,struct file *fp)

{

unsigned int value=0;

printk("%s\n",__FUNCTION__);

pload=ioremap(0XE02000A0,16);//convert register physical address to virtual address

value=ioread32(pload);

value&=~0x1<<3;

value&=~0x1<<2;

value&=~0x1<<1;

value|=0x1<<0;

iowrite32(value,pload);

return 0;

}

此函数实现了怎么去打开设备,在设备文件上的第一个操作,并不要求驱动程序一定要实现这个方法。如果该项为NULL,设备的打开操作永远成功。

Open方法是驱动程序用来为以后的操作完成初始化准备工作的。在大部分驱动程序中,open完成如下工作:初始化设备,标明次设备号。

2.2关闭设备模块

int beep_release(struct inode * fnode,struct file *fs)

{

printk("%s\n",__FUNCTION__);

return 0;

}

当设备文件被关闭时调用这个操作。与open相仿,release也可以没有,此处关闭函数为beep_release。

Release方法的作用正好与open相反,它应该:关闭设备。

本驱动程序要进行读和写。

ssize_t beep_read (struct file *fp, char __user *buff, size_t count, loff_t *fps)

{

char string[20]="HELLO,EVERYONE\n";

int retur=0;

printk("%s\n",__FUNCTION__);

retur=copy_to_user(buff,string,str_len(string)+1);

return retur;

}

ssize_t beep_write (struct file *fp, const char __user *buff, size_t count, loff_t *fps)

{

char string[100];

int retur=0;

printk("%s",__FUNCTION__);

retur=copy_from_user(string,buff,count);

printk("kernal----> %s\n",string);

return retur;

}

2.3 开启蜂鸣器

void beep_start(void)

{

unsigned int value=0;

value=ioread32(pload+1);//read data register

value|=0x1<<0;

iowrite32(value,pload+1);

}

2.4 关闭蜂鸣器

void beep_stop(void)

{

unsigned int value=0;

value=ioread32(pload+1);//read data register

value&=~0x1<<0;

iowrite32(value,pload+1);

}

恢复GPD0口为IO口输出功能,由原理图可知直接给低电平可让蜂鸣器停止工作。

2.5 ioctl控制模块

long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)

{

printk("%s\n",__FUNCTION__);

switch(cmd)

{

case 0://beep stop

beep_stop();

break;

case 1://beep start

beep_start();

break;

}

return 0;

}

应用程序向设备发送命令,设备接受到命令并进行解析,并做相应的设置并启动设备工作或停止工作。如果输入的参数大于0,就让蜂鸣器开始工作,不同的参数,蜂鸣器的频率也不一样。

2.6 重要数据结构模块

在Linux字符设备驱动程序设计中,有3种非常重要的数据结构:

Struct file

Struct inode

Struct file_operations

Struct File代表一个打开的文件。系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建, 在文件关闭后释放。

重要成员:

loff_t * fp/*文件读写位置*/

struct file_operations *fp

Struct Inode用来记录文件的物理上的信息。因此, 它和代表打开文件的file结构是不同的。一个文件可以对应多个file结构, 但只有一个inode 结构。

重要成员:

dev_t:设备号

struct file_operations一个函数指针的集合,定义能在设备上进行的操作。结构中的成员指向驱动中的函数, 这些函数实现一个特别的操作, 对于不支持的操作保留为NULL。

static struct file_operations beep_ops=

{

.open = beep_open,

.release =beep_release,

.read = beep_read,

.write = beep_write,

.unlocked_ioctl =beep_unlocked_ioctl,

}

2.7

在linux 内核中,字符设备使用struct cdev 来描述。

字符设备的注册可分为如下3个步骤:

分配cdev

初始化cdev

添加cdev

Struct cdev的分配可使用cdev_alloc函数来完成。Struct cdev的初始化使用cdev_init函数来完成。

struct cdev的注册使用cdev_add函数来完成。

2.8 设备注销模块

static void __exit beep_exit(void)

{

printk("%s\n",__FUNCTION__);

unregister_chrdev_region(beep_devno,BEEPNUM);

cdev_del(&beep_cdev);

return ;

}

此函数实现该混杂设备的注销。

四.蜂鸣器驱动测试模块和截图

1、模块代码:

#include

#include

#include

#include

int main(void)

{

int fp=0;

int i=0;

fp=open("/dev/beep",O_RDWR,0x777);

if(fp<=0)

{

printf("fail in opening beep device file\n");

return 0;

}

while(i<5)

{

ioctl(fp,1,0);

sleep(1);

ioctl(fp,0,0);

sleep(1);

i++;

}

close(fp);

return 0;

}

测试程序解析:

该测试程序先执行打开设备文件,往设备中写入命令和参数来实现对蜂鸣器的控制。蜂鸣器的开启与关闭间隔及蜂鸣器的频率取决于往设备里写的命令与参数。

运行结果及截图

beep_open蜂鸣器开始工作,beep_release蜂鸣器停止工作五.tiny210开发板调试

1.tiny210开发板测试步骤:

(1)连接开发板电源。

(2)用串口将PC和tiny210开发板相连。

(3)打开SecureCRT软件,点击快速连接,配置端口

协议:Serial

端口:com n(看自己的端口号)

波特率:115200

数据位:8

奇偶校验:none

停止位:1

勾掉RTS/CTS选项

(4)点击连接

(5)打开开发板电源

(6)SecureCRT软件会出现一些选项,选择b,root system

(7)输入指令rz,将beep.ko和pp加载到根文件系统里,再输入指令,将beep 测试程序加载到根文件系统。

(8)在SecureCRT里输入insmod beep.ko,将驱动程序加载到内核模块中。(9)在SecureCRT里输入chmod 777 beep,改变可执行程序的权限。

(10)在SecureCRT里输入./pp。

观看实验现象

六.综合设计总结与思考

这一次易嵌的培训实习,老师给我们安排的设计题目是蜂鸣器驱动程序的设计及开发。第一天培训的时候,老师教我们安装VMware Workstation 软件,由于电脑问题软件装来装去弄了好几遍,虽然花费了不少时间,但也更深刻地记住了软件如何安装和调试的。软件装好后实现虚拟操作环境,首先在虚拟环境中学会编辑简单的C语言(100以内数字输入以及冒泡法排序)及其编译,通过简单的编程,掌握了软件最基本的调试方法和步骤。蜂鸣器设计是最主要也是最难理解的,程序语句相对于基本功没那么扎实的我们来说比较难理解,需要先弄清每个模块的功能,然后再去理解每个模块语句的含义,基础太差语句理解的较困难。经过后两天半老师细心的讲解才有了大致的理解,也初步把学习的课程知识应用到实际操作中,明白课程学习的重要性以及C语言在本专业的重要性,以后学习中还是要多花些时间在编程上,好好提高自己的专业技能。

第一次接触linux操作,会有很多不理解的地方,也是因为对新知识的不了解,通过本次试训自己也在思考自己以后的就业方向以及课程学习的重点,好好利用课余时间多学点知识。

成绩:

蜂鸣器驱动程序设计

合肥师范学院 嵌入式系统开发技术 课程设计 专业:计算机科学与技术(嵌入式) 班级:嵌入式应用技术 学号: 110441034 1110441047 1110441060 姓名:钱鹏鹏汪新妹郭航峰 设计题目:蜂鸣器驱动程序设计 2014年05月

1.绪论_______________________________________________________________ 3 1.1概要 _________________________________________________________________ 3 1.2设计内容 _____________________________________________________________ 4 2.开发环境的搭建_____________________________________________________ 4 2.1Redhat的安装 _________________________________________________________ 4 2.2安装arm-linux-gcc交叉编译器__________________________________________ 9 2.3安装及编译linux-2.6.29-mini2440-20090708内核_________________________ 9 3.字符设备驱动相关知识_______________________________________________ 9 3.1模块机制 _____________________________________________________________ 9 3.2字符设备开发基本步骤_________________________________________________ 10 3.3主设备号和次设备号___________________________________________________ 11 3.4实现字符驱动程序_____________________________________________________ 12 4.蜂鸣器原理________________________________________________________ 14 4.1蜂鸣器的种类和工作原理_______________________________________________ 14 4.2开发板上蜂鸣器原理图分析_____________________________________________ 15 4.3GPB0参数 ____________________________________________________________ 15 5.总体设计__________________________________________________________ 16 5.1设计思路 ____________________________________________________________ 16 5.2设计步骤 ____________________________________________________________ 16 6. 驱动及测试程序___________________________________________________ 17 6.1beep.c _______________________________________________________________ 17 6.2beep_tset.c __________________________________________________________ 21 7.运行结果及截图____________________________________________________ 22综合设计总结与思考__________________________________________________ 25

蜂鸣器歌唱原理以及代码

3.3 蜂鸣器播放歌曲原理 一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。 1)音调的确定 音调就是我们常说的音高。它是由频率来确定的!我们可以查出各个音符所对应的相应的频率,那么现在就需要我们来用51来发出相应频率的声音!我们常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。 2)节拍的确定 一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms 。 3.3 蜂鸣器播放歌曲程序 #include sbit speaker = P1^5; //定义蜂鸣器端口 unsigned char timer0h, timer0l, time; //-------------------------------------- //单片机晶振采用11.0592MHz

// 频率-半周期数据表高八位本软件共保存了四个八度的28个频率数据code unsigned char FREQH[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567 // 频率-半周期数据表低八位 code unsigned char FREQL[] = { 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567 //-------------------------------------- //世上只有妈妈好数据表要想演奏不同的乐曲, 只需要修改这个数据表 code unsigned char sszymmh[] = { 6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。 //6, 2, 3 分别代表:啦, 中音, 3个半拍; //5, 2, 1 分别代表:嗦, 中音, 1个半拍; //3, 2, 2 分别代表:咪, 中音, 2个半拍; //5, 2, 2 分别代表:嗦, 中音, 2个半拍; //1, 3, 2 分别代表:哆, 高音, 2个半拍; 6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1, 6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2, 5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1, 2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0}; //-------------------------------------- void t0int() interrupt 1 //T0中断程序,控制发音的音调 { TR0 = 0; //先关闭T0 speaker = !speaker; //输出方波, 发音 TH0 = timer0h; //下次的中断时间, 这个时间, 控制音调高低 TL0 = timer0l; TR0 = 1; //启动T0 } //-------------------------------------- void delay(unsigned char t) //延时程序,控制发音的时间长度 { unsigned char t1; unsigned long t2;

单片机控制LED及蜂鸣器课程设计报告

单片机设计报告 课程单片机课程设计 设计题目 LED灯及蜂鸣器 设计题目: 一、要求 1.了解LED显示流水灯的原理。 2.能够在LED上显示和控制蜂鸣器的工作。 3.熟悉掌握keil软件的使用。 二、分析 本设计使用AT89C52RC做为主控制模块,利用简单的外围电路来驱动LED蝴蝶。设计分为三个模块:单片机控制模块,输出显示模块和驱动模块,单片机控制模块以单片机为核心,以软件KEIL编程实现信号输出,以驱动LED及蜂鸣器为目的。 三、设计 1、硬件方面 (1)、LED驱动模块 图文显示有静态和动态两种方案,本设计中静动态都用到了。动态扫描的意思简单的说就是轮流点亮。具体就图案来说,把内部同行的发光管的阳极相连在一起,先送出对应行的发光管亮灭的数据并锁存,然后选通其它行使其燃亮相同的时间,然后熄灭。反复循环。 蜂鸣器的控制则是加入三极管接在VCC,单片机的第20引脚和负极上,以此来控制蜂鸣器的工作。 (2)、硬件设计 实验板上设计一个蝴蝶状的LED显示,可用于简单的图形图像。蝴蝶的图案是由74个LED绿灯、8个红灯、10个黄灯拼接而成。 其中绿灯直接接到正负极上,黄灯和红灯接到单片机的P2口,来控制其闪动。 2、软件编程(包括流程图、完整的汇编源程序及其注释) 1.电路图 本软件要求实现如下要求:外圈绿灯亮度明亮,红灯和黄灯都不停地闪动,蜂鸣器自动播放歌曲。 电路图如下:

2.主程序 本设计的系统软件能使系统LED各点亮度均匀,充足,可显示清晰图案,并且闪动。 系统主程序开始后,首先是对系统环境初始化,包括设置串口,中断和端口;然后闪动红黄灯,由于单片机没有停机指令,所以可以设置系统程序不断循环。 3.序代码如下: #include #include #include #include #define uchar unsigned char #define uint unsigned int #define DY_PORT P2 //设置LED连接的I/O组 #define DY_SPEED 100 //设置每一个明亮级的停留时间(值域: 0~65535) struct music_type { uchar tone; uchar delay; }; void delay (unsigned int a){ // 1ms延时程序 unsigned int i; while( --a != 0){

嵌入式- 蜂鸣器控制实验

实验二蜂鸣器控制实验 实验目的:1 了解ARM处理器PWM接口的处理机制 2 掌握在S3C2440A平台下进行PWM接口应用编程实验器材:Sinosys-EA2440实验箱PC机 实验原理:脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。即通过改变方波的占空比表示不同的模拟信号的电平。 在ARM嵌入式实验中,其实是通过微处理器中的计数器,对经过频率变换的输出频率周期进行计数,在PWM中,是通过两个寄存器(TCNTBn和TCMPBn)对输出信号的占空比进行调制,TCNTBn可以设置为TCMPBn+X,当TCNTBn在TCMPBn和TCMPBn+X 之间计数时,TOUTn(即输出信号)输出低电平,当TCNTBn计数下降到TCMPBn时,TOUTn电平反转,变为高电平,直到TCNTBn计数减到0,如果此时开启了重载,则又把预定的值重新装入TCNTBn和TCMPBn中,重复以上过程。 在ARM嵌入式PWM中,会提供一个基准时钟作为输入时钟,PWM调制会对输入的时钟进行分频等操作进入计时器逻辑,其电路图2.1如下:

图2.1 PWM计时器框图 如图2.1,输入的时钟PCLK经过一个8bit预置器和一个分频器,将得到的时钟进入计数器逻辑板块作为驱动时钟,而输出的TOUT则作为蜂鸣器(蜂鸣器控制电路如图2.2)的驱动信号。 图2.2 蜂鸣器控制电路

实验总结:实验的主函数首先设置时钟,端口初始化,并捕捉进入测试函数的指令,与实验一大致相同,在此不在赘述,重点分析测试函数。测试函数如下: void Beep(int freq,int ms) { int div,i rGPBCON&=~0x3; //将GPB0作为输入口rGPBCON|=0X2; // 接入TIMER0 rTCFG0&=~0XFF; // 设置prescaler为32 rTCFG0|=0XF; rTCFG1&=~0XF; //选择mux=1/16 rTCFG1|=0X3; div=plck/32/16/freq 计算TCNTB0的值rTCNTB0=div; rTCMPB0=rTCNTB0>>2; 占空比为4:1 rTCON&=~0X1F; 设置死区自动重载反转人工载入开始rTCON|=0XB; 关闭死区开启重载关反转开人工载入开始rTCON&=~2; 关闭人工载入 for(i=1,i

单片机 利用蜂鸣器演奏音乐

实验三-利用蜂鸣器演奏音乐 一、实验目的 1.了解BlueSkyC51单片机实验板中蜂鸣器的硬件电路 2.学会利用蜂鸣器实现音乐的演奏 3.掌握蜂鸣器实现音乐演奏的编程 二、实验硬件设计及电路 1. BlueSkyC51单片机实验板 ` 2.单片机最小系统

。 3.蜂鸣器电路连接 三极管主要是做驱动用的。因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以

我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。 三、实验原理 1.音调及节拍 用一个口,输出方波,这个方波输入进蜂鸣器就会产生声音,通过控制方波的频率、时间,就能产生简单的音乐。一般说来,单片机演奏音乐基本都是单音频率,因此单片机奏乐只需控制音调和节拍。 (1)音调的确定 音调是由频率来确定的。通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O 口来回取反,从而让蜂鸣器发出不同频率的声音。只需将定时器给以不同的定时值就可实现。通过延时,即可发出所需要的频率。 … (2)节拍的确定 一拍的时长大约为400—500ms,每个音符的时长通过节拍来计算。详细见程序代码。 2.软件设计相关 (1)头文件 #include<> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long sbit beep=P1^4; 译实验相关问题 ; (1)实际发音颤音重 解决方法为修改蜂鸣器的驱动频率. (2)实际节奏过快或者过慢 调整延时 四、C51程序代码(部分来源于网络) #include<> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long ~ sbit beep=P1^4; //蜂鸣器与口连接 uchar th0_f; //中断装载T0高8位 uchar tl0_f; //T0低8位 uchar code freq[36*2]={ //音阶码表 0xf7,0xd8, //440hz , 1 //0 0xf8,0x50, //466hz , 1# //1

单片机课程设计报告(利用蜂鸣器播放音乐)

课程设计:电子设计 题目名称:音乐流水灯 姓名:戴锦超 学号:08123447 班级:信科12-3班 完成时间:2014年10月23日

1设计的任务 设计内容:动手焊接一个51单片机 设计目标:利用单片机上的蜂鸣器以及二极管实现音乐播放以及根据音乐的节奏而规律性闪亮的二极管。并且通过程序调节音乐节奏的快慢。 2 设计的过程 2.1 基本结构 1.STC89C52RC 在本次的试验中采用了STC89C52RC单片机,STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期,工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机),工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz,用户应用程序空间为8K字节。

(STC89C52RC引脚图) STC89C52RC单片机的工作模式: (1)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序 (2)空闲模式:典型功耗2mA (3)正常工作模式:典型功耗4Ma~7mA (4)唤醒,适用于水表、气表等电池供电系统及便携设备 2.蜂鸣器及其工作原理: 蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。本实验采用的是电磁式 蜂鸣器。

蜂鸣器按其是否带有信号源又分为有源和无源两种类型。 有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。无源 蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。本实验采用的是有源蜂鸣器。 (蜂鸣器与单片机连接电路图) 2.2 软件设计过程 1.蜂鸣器发声原理 本实验由于采用有源蜂鸣器,只需将引脚端口P1^4清

51单片机蜂鸣器奏乐实验汇编代码

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 MOVC A,@A+DPTR ;查表取代码 JZ END0 ;是00H,则结束 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 MUSIC5:NOP MOV R6,A INC DPTR MOV A,#0 MOVC A,@A+DPTR MOV R7,A SETB TR0 MUSIC2:NOP CPL P3.2 MOV A,R6 MOV R3,A LCALL DEL MOV A,R7 CJNE A,20H,MUSIC2 MOV 20H,#00H INC DPTR LJMP MUSIC1 MUSIC3:NOP CLR TR0 MOV R2,#0DH

MOV R2,#0FFH LCALL DEL DJNZ R2,MUSIC4 INC DPTR LJMP MUSIC1 END0:NOP MOV R2,#0FFH MUSIC6:MOV R3,#00H LJMP MUSIC0 DEL:NOP DEL3:MOV R4,#02H DEL4:NOP DJNZ R4,DEL4 NOP DJNZ R3,DEL3 RET NOP DAT: DB 18H, 30H, 1CH, 10H DB 20H, 40H, 1CH, 10H DB 18H, 10H, 20H, 10H DB 1CH, 10H, 18H, 40H DB 1CH, 20H, 20H, 20H DB 1CH, 20H, 18H, 20H DB 20H, 80H, 0FFH, 20H DB 30H, 1CH, 10H , 18H DB 20H, 15H, 20H , 1CH DB 20H, 20H, 20H , 26H DB 40H, 20H , 20H , 2BH DB 20H, 26H, 20H , 20H DB 20H, 30H , 80H , 0FFH DB 20H, 20H, 1CH , 10H DB 18H, 10H, 20H , 20H DB 26H, 20H , 2BH , 20H DB 30H, 20H , 2BH , 40H DB 20H, 20H , 1CH , 10H DB 18H, 10H, 20H, 20H DB 26H, 20H , 2BH, 20H DB 30H, 20H, 2BH , 40H DB 20H, 30H, 1CH , 10H DB 18H, 20H , 15H , 20H DB 1CH, 20H , 20H , 20H DB 26H, 40H, 20H , 20H

单片机蜂鸣器奏乐实验大全代码

单片机蜂鸣器奏乐实验大 全代码 This manuscript was revised by the office on December 10, 2020.

O R G0000H 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 MOVC A,@A+DPTR ;查表取代码 JZ END0 ;是00H,则结束 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 MUSIC5:NOP MOV R6,A INC DPTR MOV A,#0 MOVC A,@A+DPTR MOV R7,A SETB TR0 MUSIC2:NOP CPL MOV A,R6 MOV R3,A LCALL DEL MOV A,R7 CJNE A,20H,MUSIC2 MOV 20H,#00H INC DPTR LJMP MUSIC1 MUSIC3:NOP CLR TR0

MOV R2,#0DH MUSIC4:NOP MOV R2,#0FFH LCALL DEL DJNZ R2,MUSIC4 INC DPTR LJMP MUSIC1 END0:NOP MOV R2,#0FFH MUSIC6:MOV R3,#00H LJMP MUSIC0 DEL:NOP DEL3:MOV R4,#02H DEL4:NOP DJNZ R4,DEL4 NOP DJNZ R3,DEL3 RET NOP DAT: DB 18H, 30H, 1CH, 10H DB 20H, 40H, 1CH, 10H DB 18H, 10H, 20H, 10H DB 1CH, 10H, 18H, 40H DB 1CH, 20H, 20H, 20H DB 1CH, 20H, 18H, 20H DB 20H, 80H, 0FFH, 20H DB 30H, 1CH, 10H , 18H DB 20H, 15H, 20H , 1CH DB 20H, 20H, 20H , 26H DB 40H, 20H , 20H , 2BH DB 20H, 26H, 20H , 20H DB 20H, 30H , 80H , 0FFH DB 20H, 20H, 1CH , 10H DB 18H, 10H, 20H , 20H DB 26H, 20H , 2BH , 20H DB 30H, 20H , 2BH , 40H DB 20H, 20H , 1CH , 10H DB 18H, 10H, 20H, 20H DB 26H, 20H , 2BH, 20H DB 30H, 20H, 2BH , 40H DB 20H, 30H, 1CH , 10H DB 18H, 20H , 15H , 20H DB 1CH, 20H , 20H , 20H

单片机实验报告-蜂鸣器驱动实验

本科实验报告 课程名称:单片机原理与接口技术实验项目:蜂鸣器驱动实验 实验地点:电机馆 专业班级:学号: 学生姓名: 指导教师: 2015年 6 月9 日

蜂鸣器驱动实验 一、实验目的 1、学习输入/输出端口控制方法 2、了解音频发声原理 二、实验说明 本实验是利用89C51端口定时器输出控制端口,驱动扬声器发声,声音的频率高低由延时快慢控制。本实验是利用单片机唱歌的声音控制程序,请用户思考如何修改程序,可以让蜂鸣器发出不同频率,不同长短的声音。 三、实验原理 1、通过单片机控制驱动信号使蜂鸣器发出不同音调的声音,驱动方波的频率越高,音调就越高;驱动方波频率越低,音调越低。由此,我们可以根据驱动方波的频率使蜂鸣器凑出各种音调的声音。 2、由于单片机I/O口的输出电流较小,因此需要三极管放大电路驱动蜂鸣器。 四、主要仪器设备 单片机仿真试验箱,THKL-C51型单片机仿真器,计算机 五、实验内容及步骤 INT1输出音频信号接音频驱动电路,使蜂鸣器的发声。 1、使用单片机最小应用系统和蜂鸣器模块。蜂鸣器模块的短路帽J1插到VCC方向,用导线将INT1接到蜂鸣器输入端。 2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。 3、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加“MUSIC.ASM”源程序,进行编译,直到编译无误。 4、全速运行程序,扬声器周期性的发出“八月桂花开”歌曲。(添加“MUSIC1.ASM”程序为“祝你平安”歌曲) 5、也可以把源程序编译成可执行文件,把可执行文件用ISP烧录器烧录到89S52/89S51芯片中运行。(ISP烧录器的使用查看附录二)

蜂鸣器的介绍

蜂鸣器的介绍 推荐 一)蜂鸣器的介绍 1.蜂鸣器的作用蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 2.蜂鸣器的分类蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 3.蜂鸣器的电路图形符号蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。 (二)蜂鸣器的结构原理 1.压电式蜂鸣器压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。 多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。 压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。 2.电磁式蜂鸣器电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。 接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。 一、常规电磁蜂鸣器产品是如何工作的? 无源电磁蜂鸣器工作原理是:交流信号通过绕在支架上的线包在支架的芯柱上产生一交变的磁通,交变的磁通和磁环恒定磁通进行叠加,使钼片以给定的交流信号频率振动并配合共振腔发声。产品的整个频率和声压的响应曲线与间隙值、钼片的固有振动频率(可粗略折射为小钼片的厚度)、外壳(亥姆霍兹共振声腔)频率、磁环的磁强漆包线的线径有直接关系。 二、常规电磁无源蜂鸣器产品由哪些材料组成? 三、常规压电蜂鸣器产品是如何工作的?

vhdl实验报告--蜂鸣器

VHDL 实验报告 一、实验目的 1、掌握蜂鸣器的使用; 2、通过复杂实验,进一步加深对VHDL语言的掌握程度。 二、实验原理乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让蜂鸣器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。 乐曲的12 平均率规定:每2 个八度音(如简谱中的中音1 与高音1)之间的频率相差1 倍。在2个八度音之间,又可分为12个半音。另外,音符A(简谱中的低音6)的频率为440Hz, 音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音I至高音1 之间每个音符的频率,如表所示。 音名频率/Hz 音名频率/Hz 音名频率/Hz 低音1 中音1 高音1 低音2 中音2 高音2 低音3 中音3 高音3 低音4 中音4 高音4 低音5 392 中音5 784 高音5 1568 低音6 440 中音6 880 高音6 1760 低音7 中音7 高音7 表简谱音名与频率的对应关系 产生各音符所需的频率可用一分频器实现, 由于各音符对应的频率多为非整数, 而分频系数又不能为小数, 故必须将计算得到的分频数四舍五入取整。若分频器时钟频率过低, 则由于分频系数过小, 四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但分频数将变大。实际的设计应综合考虑两方面的因素, 在尽量减小频率误差的前提下取合适的时钟频率。实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。 音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此, 要控制音符的音 长,就必须知道乐曲的速度和每个音符所对应的节拍数, 本例所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s 的话,那么一拍所应该持续的时间为秒,则只需要提供一个4HZ的时钟频率即可产生四分音符的时长。 本例设计的音乐电子琴选取40MHZ的系统时钟频率。在数控分频器模块,首先对时钟频率进行40分频,得到1MHZ的输入频率,然后再次分频得到各音符的频率。由于数控分频器 输出的波形是脉宽极窄的脉冲波, 为了更好的驱动蜂鸣器发声, 在到达蜂鸣器之前需要均衡占空比, 从而生成各音符对应频率的对称方波输出。这个过程实际上进行了一次二分频, 频率变为原来的二分之一即。 因此,分频系数的计算可以按照下面的方法进行。以中音1为例,对应的频率值为 523. 3Hz,它的分频系数应该为: 0.375MHZ 0.375 106 716 523.3 523.3

中断定时蜂鸣器实验

中断定时蜂鸣器实验 一.实验目的 1.掌握ARM2131开发环境ADS,熟悉开发环境的常用工具以及相应功能。 2.学习建立ADS的工程文件、编译连接设置、调试操作等。 3.学习对中断向量VTC、GPIO口的设置。 4.学习定时器中断的应用 二.实验设备 PC兼容机一台,操作系统WINDOWS 2000,安装ADS1.2(ARM Developer Suite 的成熟版本) 三.实验原理 随着信息技术技术的飞速发展,ARM技术方案架构作为一种具备低功耗、高性能、以及小体积等特性的32位嵌入式微处理器,得到了众多的知识产权授权用户,其中包括世界顶级的半导体和系统公司。目前已被广泛的用于各类电子产品,汽车、消费娱乐、影像、工业控制、海量存储、网络、安保和无线等领域。被业界人士认为,基于ARM的技术方案是最具市场前景和市场优势的解决方案。LPC2131 Philips LPC2131 是基于ARM7TDMI-S 的高性能32 位RISC 微控制器,它一方面具有ARM处理器的所有优点:低功耗、高性能;同时又具有较为丰富的片上资源,非常适合嵌入式产品的开发。其特点如下: ·集成了Thumb 扩展指令集。 ·32KB可在系统中编程(ISP)的片内Flash和可在应用中编程(IAP)的8KB RAM,具有向量中断控制器。 ·2个UART,2个I2C 串行接口,2 个SPI串行接口,2 个定时器(7 个捕获/ 比较通道),PWM单元可提供多达6个PWM输出,8通道10位ADC,实时时钟RTC,看门狗定时器WDT,48 个通用I/O引脚。 ·CPU时钟高达60MHz,具有片内晶体振荡器和片内PLL。 GPIO:(General Purpose Input Output) GPIO是用来进行输入输出的,那么肯定有寄存器进行控制。对于输入的话,可以通过读取寄存器来确定引脚的高电平还是低电平;对于输出的话,可以通过写某个寄存器来让这个引脚输出高低电平.GPxCON,GPACON每一位对应着一根引脚(23根)0:代表输出;1:相应的引脚为地址线或用于地址控制对于PORT B-PORT J的话,GPxCON中每两位控制一根引脚00:输入;01:输出;10:特殊功能;11:保留。GPxDA T用于读或者写。GPxUP,1:不使用内部的上拉电阻;0:使用内部上拉电阻。 向量控制寄存器VICVectCntl0-15记录了各个通道号及其使能位。 当中断发生时,VICVectAddr0-15中的一个值会被copy到VICVectAddr. 如果是非向量中断则VICdefaultAddr被copy到VICVectAddr. 程序跳转到VICVectorAddr指向的地址。 中断返回时,写0x00到VICVectAddr. 非向量中断是指那些虽然已经打开(允许),但是没有在相应的VICVectorCntl0~15 和VICVectorAddr0~15中设置的中断。 关于中断设置: 1、首先,硬复位后所有的Special Function Registor都有默认值。不必考虑设置的顺序问题。可以先设置好中断,再开通模块功能。

蜂鸣器驱动程序的设计说明

蜂鸣器驱动 课程设计 专业: xxxxxxxxxxxxxx 班级: xxxxxxxxx 学号: xxxxxxxxx 姓名: xxxx 设计题目:蜂鸣器驱动程序设计 2016年12月

目录 一.任务 (2) 1.目标 (2) 2.环境 (2) 3.需求: (2) 二.总体设计 (2) 1.处理流程 (2) 2.模块介绍 (3) 3.模块接口设计 (3) 4.各个模块设计 (3) 三.PWM蜂鸣器字符设备驱动 (3) 1.模块设计 (3) 1. 模块介绍 (3) 2. 模块结构图 (4) 2.接口设计 (4) 1. 数据结构设计 (4) 2. 驱动程序接口 (4) 3.函数设计 (4) 1.初始化函数 (5) 2. 字符设备打开函数 (6) 3. 字符设备关闭函数 (7) 4. 模块卸载函数................................................................... ...................... (8) 5. 文件操作接口函数 (8) 四. PWM蜂鸣器字符设备驱动测试 (8) 1.调用系统函数ioctl实现对蜂鸣器的控制 (8) 五.tiny210开发板调试............................................................................. (9)

六.综合设计总结与思考................................................................... .. (10) 一.任务 1.目标: 编写按键蜂鸣器驱动程序函数与测试文件,实现上位机与tiny210-SDK开发板的连接,利用函数实现对蜂鸣器通过按键来启动与关闭。 2.环境: ①软件环境:windows 7 系统和VMware Workstation 软件 ②硬件环境:tiny210 开发板,核部分 Linux-3.0.8 ,交叉编译版本arm-linux-gcc-4.5.1-v6-vfp1 Linux系统介绍: Linux是一种自由开发源码的类Unix操作系统,存在这许多不同的Linux 版本,但它们都使用了Linux核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。 Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来说,Linux这个词本身只表示Linux核,但实际上人们已经习惯了用Linux来形容整个基于Linux核,并且使用GNU工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。 tiny210开发板中模块介绍: ①PWM蜂鸣器模块

51单片机蜂鸣器播放音乐代码

/*生日快乐歌曲*/ #include <> #define uint unsigned int #define uchar unsigned char sbit beep = P1^5; uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159, 212,212,106,126,159,169,190,119,119,126,159,142,159,0}; uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0}; //延时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } void PlayMusic() { uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG 为拍子长度 for(j=0;j // 这是单片机音乐代码生成器生成的代码 #define uchar unsigned char sbit beepIO=P1^5; // 输出为可以修改成其它 IO 口uchar m,n;

几种驱动蜂鸣器的编程示例

几种驱动蜂鸣器的编程示例 以下介绍几种在S3F9454/9444下驱动蜂鸣器的编程示例,供参考 A.第一种,普通IO高低电平驱动法 ;运行环境: S3F9454,Fosc= 3.2MHz无分频 ;P2.0为蜂鸣输出端口 ;本例输出频率为4KHZ,即每250US一个周期,高低电平时间分别为125US BEEP: LD BTCON,#10100011B ;看门狗禁用 DI PUSH R5 PUSH R6 ;首先配置P2.0为普通推挽输出端口 AND P2CONL,#0FEH OR P2CONL,#02H LD R6,#0FAH ;R6设置输出方波个数,本例为250个(计时62.5MS) ONE_BEEP: LD R5,#27H ;R5为频率发生计时器,本例为近似125US(4KHZ) XOR P2,#01H _LOOP: DEC R5 JR NZ,_LOOP DEC R6 JR NZ,ONE_BEEP LD BTCON,#02H ;恢复看门狗运行 EI POP R6 POP R5 RET ;----------------------------------------------------------- B.利用P2.0配置为T0定时器匹配输出方式产生 ;注: 该方式可用于带多位数码显示扫描的软件中,可有效避免因蜂鸣器 ;输出而造成的数码显示抖动闪烁 ;因定时器T0被分配作为T0匹配输出定时器,所以本例中利用看门狗定时器 ;的实时计时器BTCNT作为数码显示实时扫描计时器 ;R0为蜂鸣时间长短计时器,由主调用程序进行予设置 ;运行环境: S3F9454,Fosc= 3.2MHZ无分频 ;P2.0为蜂鸣输出端口 ;本例输出频率为4KHZ,即每250US一个周期,高低电平时间分别为125US ;----------------------- BEEP: DI PUSH R1 PUSH T 0CON PUSH T0DATA ;在蜂鸣输出前首先扫描一次数码显示 CALL LED_SCAN OR P2CONL,#03H ;set P2.0 as T0 match output/every 12 5us LD T0CON,#10001000B ;set T0 input cLOCk=Fosc/8 LD T0DATA,#32H LD BTCON,#10100011B ;DISAble Watch-dog run, ;but btcnt clk input fxx/4096= 1.280ms NEXT_BEEP: LD R1,#0AH WAIT_CNT: OR BTCON,

蜂鸣器的设计报告

课程设计报告书题目:基于单片机的蜂鸣器音乐播放器设计学院:电子信息科学与技术学院 班级:15级电子一班 姓名:王珍 学号:150807141137 完成日期:2019年 04 月24日

课程设计任务书 班级:15级电子一班 学号:150807141137 姓名:王珍 指导老师:杨磊 设计题目:蜂鸣器放音乐设计 一、设计目的及要求: 1. 熟悉印制电路板设计的步骤和方法,能够按照自己的思想设计出所需的电路功能,并能明白其原理和应用。 2. 熟悉常用电子器件的类别、型号、规格、性能及其使用范围,能查阅有关的电子器件图书。 3. 能够正确识别和选用常用的电子器件,并且能够熟练使用普通万用表和数字万用表。 4. 能够熟练的使用单片机编程软件,实现硬件及软件的紧密结合,并能熟练地调试程序,明白程序的目的和编写步骤。 要求:掌握设计电路和写单片机程序及调试。 二、设计内容和方法: 用STC89C52单片机和电平转换芯片MAX232组成一个简单的控制电路,用以控制蜂鸣器发出各种不同的声音,并利用虚拟仪器控制。通过电脑的串口写入一段程序到单片机中,实现单片机的控制作用。利用按键控制蜂鸣器的发声,经MAX232与电脑相连,用虚拟仪器实现对单片机的控制。 本设计是设计一个单片机控制的蜂鸣器发声系统的设计。近年来随着科技的飞速发展,单片机的应用正在不断的走向深入,同时带动着传统控制检测日新月异更新。本秒表采用89c52为中心器件,将软、硬件有机地结合起来,使得系统能够实现控制蜂鸣器发声。其软件系统采用c语言编写程序,并在keil下调试通过硬件电路通过MAX232与电脑相连,并与软件相结合,调试修改,使达到预期 的目的。 三、硬件部分: 3.1蜂鸣器电路设计 由于蜂鸣器的工作电流一般比较大, 以至于单片机的I/O口是无法直接驱动的, 所以要利用放大短路来驱动,一般使用三

相关主题
文本预览
相关文档 最新文档