📄 main.c
字号:
//main.c
#include <reg51.h>
//定义端口寄存器
sfr P0M0 = 0X93;
sfr P0M1 = 0X94;
sfr P1M0 = 0X91;
sfr P1M1 = 0X92;
sfr P2M0 = 0X95;
sfr P2M1 = 0X96;
sfr P3M0 = 0Xb1;
sfr P3M1 = 0Xb2;
#define fosc 11059200L
#define T0_50ms (65536 - 50000 * ( fosc / 12000000L)) //50ms定时参数
//以下是各音符对应的T1初值
unsigned char th1[7] = {0xDD,0xE0,0xE4,0xE6,0xE9,0xEB,0xED};
unsigned char tl1[7] = {0x9A,0xE0,0xB2,0x3A,0x0A,0x8C,0xC7};
unsigned char cnt_int0;//拍子定时计数
unsigned char current_pitch;//当前输出的音调
sbit voice=P0^0; //蜂鸣器发声
void init_port()
{
//配置P0.0模式为开漏输出
P0M1 = 0x01;
P0M0 = 0x01;
}
void init_timer()
{
TMOD = 0X01; //定时器0模式1,16bit
TH0 = T0_50ms >> 8; //TH0 = T0_50ms / 256
TL0 = T0_50ms; //TL0 = T0_50ms % 256
ET0 = 1; //允许T0中断
TMOD |= 0X10; //定时器1模式1,16bit
TH1 = th1[0]; //do的频率
TL1 = tl1[0];
ET1 = 1; //允许T1中断
}
//定义延时函数
void ms_delay(unsigned int t)
{
unsigned int i;
for (t; t > 0; t--) //外层循环t次
for (i = 110;i > 0; i--) //内层循环110次
;
}
void Timer0_interrupt() interrupt 1
{
TH0 = T0_50ms >> 8; //重装初值
TL0 = T0_50ms;
cnt_int0++;
if (cnt_int0 >=12) //600ms到
{
cnt_int0=0;
current_pitch++;//音调 +1
if (current_pitch >=7) //1~7循环
current_pitch = 1;
}
}
void Timer1_interrupt() interrupt 3
{
TH1 = th1[current_pitch-1]; //装载音调的频率
TL1 = tl1[current_pitch-1];
voice =~voice;
}
main()
{
ms_delay(100);
cnt_int0 = 0;
current_pitch=1;
voice=0;
init_port();
init_timer();
EA = 1;//开总中断
TR0 = 1;//启动T0
TR1 = 1;//启动T1
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -