⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 从零开始学51单片机源代码
💻 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 + -