帮我给这个代码注释:#include <at89x52.h> #define uchar unsigned char bit flag; uchar ptr = 0x00; uchar high; uchar low; uchar code music[] = { 0xFC,0x44,0x7F, 0xFC,0x44,0x7F, 0xFC,0x44,0xFF, 0xFA,0x68,0xFF, 0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF, 0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFD,0x82,0xFF, 0xFD,0x82,0xFF, 0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFF,0xFF,0xFF, 0xFC,0xAC,0x7F, 0xFD,0x23,0x7F, 0xFD,0x34,0xFF, 0xFD,0x34,0xFF, 0xFD,0x23,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF, 0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFA,0x68,0xFF, 0xFC,0x0C,0x7F, 0xFC,0xAC,0x7F, 0xFC,0x44,0xFF, 0xFF,0xFF,0xFF,}; void Init(void); void DelayMs(unsigned int time); void main() { uchar time; Init(); TH0 = high; TL0 = low; while (1) { if (music[ptr] != 0xFF && music[ptr] != 0x00) { TR0 = 0; P2_3 = 1; DelayMs(10); TR0 = 1; high = music[ptr]; low = music[ptr + 1]; time = music[ptr + 2]; DelayMs(time); ptr += 3; } else if (music[ptr] == 0xFF) { time = music[ptr + 2]; DelayMs(time); ptr += 3; } else { TR0 = 0; P2_3 = 1; DelayMs(2000); ptr = 0; } } } void Count1(void) interrupt 1 { TH0 = high; TL0 = low; if (flag == 0) { P2_3 = 0; flag = 1; } else { P2_3 = 1; flag = 0; } } void Init() { TMOD = 0x01; EA = 1; ET0 = 1; } void DelayMs(unsigned int time) { unsigned int i; unsigned int j; for (j =0; j < time; j++) { for (i =0; i < 363; i++) {;} } }

时间: 2023-09-27 20:12:48 浏览: 173
这是一段使用AT89X52单片机控制蜂鸣器播放音乐的代码。具体注释如下: ```c #include <at89x52.h> // 包含AT89X52单片机的头文件 #define uchar unsigned char // 定义无符号字符类型uchar bit flag; // 定义变量flag,类型为位(bit) uchar ptr = 0x00; // 定义变量ptr,类型为uchar,初始值为0x00 uchar high; // 定义变量high,类型为uchar uchar low; // 定义变量low,类型为uchar // 音乐数组,每三个元素代表一个音符,第一个元素为高八位,第二个元素为低八位,第三个元素为音符持续的时间 uchar code music[] = { 0xFC,0x44,0x7F, 0xFC,0x44,0x7F, 0xFC,0x44,0xFF, 0xFA,0x68,0xFF, 0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF, 0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFD,0x82,0xFF, 0xFD,0x82,0xFF, 0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFF,0xFF,0xFF, 0xFC,0xAC,0x7F, 0xFD,0x23,0x7F, 0xFD,0x34,0xFF, 0xFD,0x34,0xFF, 0xFD,0x23,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF, 0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFA,0x68,0xFF, 0xFC,0x0C,0x7F, 0xFC,0xAC,0x7F, 0xFC,0x44,0xFF, 0xFF,0xFF,0xFF,}; void Init(void); // 函数声明:初始化函数 void DelayMs(unsigned int time); // 函数声明:延时函数 void main() { // 主函数 uchar time; // 定义变量time,类型为uchar Init(); // 调用初始化函数 TH0 = high; // 定时器高8位赋初值 TL0 = low; // 定时器低8位赋初值 while (1) // 无限循环 { if (music[ptr] != 0xFF && music[ptr] != 0x00) // 如果当前音符不是结束符且不是空音符 { TR0 = 0; // 关闭定时器 P2_3 = 1; // 设置P2_3引脚为高电平,控制蜂鸣器不响 DelayMs(10); // 延时10ms TR0 = 1; // 打开定时器 high = music[ptr]; // 从音乐数组中读取音符的高八位 low = music[ptr + 1]; // 从音乐数组中读取音符的低八位 time = music[ptr + 2]; // 从音乐数组中读取音符持续的时间 DelayMs(time); // 按照音符持续的时间延时 ptr += 3; // 指针指向下一个音符 } else if (music[ptr] == 0xFF) // 如果当前音符是结束符 { time = music[ptr + 2]; // 从音乐数组中读取音符持续的时间 DelayMs(time); // 按照音符持续的时间延时 ptr += 3; // 指针指向下一个音符 } else // 如果当前音符是空音符 { TR0 = 0; // 关闭定时器 P2_3 = 1; // 设置P2_3引脚为高电平,控制蜂鸣器不响 DelayMs(2000); // 延时2秒 ptr = 0; // 指针指向音乐数组的第一个音符 } } } void Count1(void) interrupt 1 { // 定时器中断处理函数 TH0 = high; // 定时器高8位赋初值 TL0 = low; // 定时器低8位赋初值 if (flag == 0) // 如果flag为0 { P2_3 = 0; // 设置P2_3引脚为低电平,控制蜂鸣器响起 flag = 1; // 将flag设置为1 } else // 如果flag为1 { P2_3 = 1; // 设置P2_3引脚为高电平,控制蜂鸣器不响 flag = 0; // 将flag设置为0 } } void Init() { // 初始化函数 TMOD = 0x01; // 定时器0工作在模式1下 EA = 1; // 开启总中断 ET0 = 1; // 开启定时器0中断 } void DelayMs(unsigned int time) { // 延时函数 unsigned int i; // 定义变量i,类型为unsigned int unsigned int j; // 定义变量j,类型为unsigned int for (j =0; j < time; j++) // 循环time次 { for (i =0; i < 363; i++) // 循环363次 {;} // 空语句,用于延时 } } ```
阅读全文

相关推荐

#include <AT89X52.h> #include <system.h> // #include <reg51.h> //#define BEEP P3_6 sbit speaker = P3^6; #define PWMOUT P3_7 unsigned char count=0; //定义变量“count”为定时器计数中间值 unsigned char pwm_level=10; //定义“pwm_level”为亮度等级,0-20。值越大,灯越暗 unsigned int i; //计数值 unsigned char timer0h, timer0l, time; /*---定时器T0初始化---*/ void T0_INT(void) { TMOD=0x11; TL0=(65535-50)%256; //设定T0初值,50个计数值,时间是50*2us=0.1ms TH0=(65535-50)/256; //设定T0初值,50个计数值,时间是50*2us=0.1ms IE=0x8A; //开启定时器中断 TR0=1; //TR0=1开启定时器,TR0=0关闭定时器 } /*---T0中断,约0.1ms/次,用于产生PWM波形---*/ void time0() interrupt 1 { TL0=(65535-50)%256; TH0=(65535-50)/256; count++; if(count>20) { count=0; } if((count<(pwm_level+1))&&(count<21)) { PWMOUT=1; } else { PWMOUT=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; for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍 for(t2 = 0; t2 < 4000; t2++); //延时期间, 可进入T0中断去发音 TR0 = 0; //关闭T0, 停止发音 } //-------------------------------------- void song() //演奏一个音符 { TH0 = timer0h; //控制音调 TL0 = timer0l; TR0 = 1; //启动T0, 由T0输出方波去发音 delay(time); //控制时间长度 } // 频率-半周期数据表 高八位 本软件共保存了四个八度的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, //低音1 改变此代码 使灯亮的同时 音乐发出