Linux下的51单片机蜂鸣器模拟出玩具枪声音

2019-04-15 16:05发布

1、 实验目的
了解单片机定时器中断原理
学会单片机定时器中断和蜂鸣器结合的用法;
2、 实验设备
装有sdcc交叉编译环境,Python烧写工具,装有Linux的系统;
51单片机开发板 1 个,USB 数据线 1 根,跳线帽 1 个
3、 实验内容
了解单片机定时器原理说明
编写程序实现单片机定时器中断;
烧写单片机定时器和蜂鸣器结合程序。
4、 实验原理
关于内部定时/计数器的编程主要是定时常数的设置和有关控制寄存器的设置。内部定
时/计数器在单片机中主要有定时器和计数器两个功能。本实验用的是定时器。内部定时/计
数器用作定时器时,是对机器周期计数。每个机器周期的长度是 12 个振荡器周期。因为实
验系统的晶振是 11.0592MHz,所以定时常数的设置可按以下方法计算:
机器周期=12÷11.0592MHz=1.08507μs
(65536-定时常数)*1.08507μs =50ms(50ms 中断一次)
定时常数=4C00H。
定时器的有关的寄存器有工作方式寄存器 TMOD 和控制寄存器 TCON。TMOD 用于设置定时器/计数器的工作方式 0~3,并确定用于定时还是用于计数。 TCON 主要功能是为定时
器在溢出时设定标志位,并控制定时器的运行或停止等。在例程的中断服务程序中,因为中
断定时常数的设置对中断程序的运行起到关键作用,置数前先关定时器,置数完再打定时器。
**蜂鸣器模拟枪声实质就是利用定时器产生不同频率的值来导通蜂鸣器产生不同的声音。
通过改变定时器初值,来设置中断时间的长短,改变蜂鸣器发声频率,从而改变声音。**
5,实验相应寄存器
这里写图片描述
GATE—-门控制位;
GATE=0,定时器启动与停止仅受 TCON 寄存器中 TRX(X=0,1)来控制;
GATE=1,定时器启动与停止受 TCON 寄存器中 TRX(X=0,1)和外部中断引
脚(INT0 或 INT1)的电平状态共同控制; C/T —定时器模式和计数器模式选择位; C/T =1,为计数器模式;C/T =0,为定时器模式;
这里写图片描述
TF1-定时器 1 溢出标志位;(定时器 1 计满溢出,TF=1)
TR1-定时器 1 运行控制位(TR1=1,开启定时器,TR1=0 关闭定时器);
TF0-定时器 0 溢出标志位;
TR0-定时器 0 运行控制位;
IE1-外部中断 1 请求标志;
IT1-外部中断 1 触发方式选择位;
IE0-外部中断 0 请求请求标志位;
IE1-外部中断 0 触发方式选择位;
实验电路图
这里写图片描述
蜂鸣器模拟枪声实验程序: #include <8051.h> //声明头文件 #define uchar unsigned char #define uint unsigned int //sbit BEEP= P0^7; //蜂鸣器端口定义 //sbit Key1 = P3^3; //按键端口定义 uchar H_count,L_count; //定义变量 /*********************************************************/ void main() { TMOD=0x01; //定义定时器 0 TH0=0xff; //高位赋初值 TL0=0xa0; //低位赋初值 H_count=0xff; L_count=0xa0; EA=1; //打开总中断 ET0=1; //打开定时器中断 while(1) { while(P3_3); TR0=1; } } /********************************************************* Time0 中断函数 **********************************************************/ void time0(void)__interrupt(1)__using(1) { P0_7=!P0_7; //蜂鸣器状态改变 if( L_count!=0x00 ) { L_count--; TH0=H_count; TL0=L_count; return; }else H_count--; if( H_count!=0xfc ) { L_count--; TH0=H_count; TL0=L_count; return; } else { H_count=0xff; L_count=0xa0; TH0=H_count; TL0=L_count; P0_7=1; TR0=0; } } 8、 实验结果 按下Key1,蜂鸣器模拟出玩具枪的声音