本篇文章将介绍一个基于51单片机的电子贺卡,本作品可用于课程设计、毕业设计的参考。其所用到的外设硬件以及程序的代码量都是相对较少的,对于51单片机的初学者,通过本设计熟悉51单片机的使用是非常好的选择。
目录
一、实现功能
二、硬件准备
三、项目设计
(一)基本原理
(二)原理图
(三)程序设计
四、图片展示
五、总结
资料下载: 基于51单片机的电子贺卡设计,课程设计,毕业设计
一、实现功能
- 通过喇叭播放《世上只有妈妈好》音乐曲调;
- 通过0.96寸的OLED显示图片;
- 通过按键切换图片
二、硬件准备
- 主控芯片:STC89C52(安装在最小系统板上)
- 显示装置:0.96寸4针OLED显示屏(IIC接口)
- 播放装置:喇叭、三极管
- 其他:杜邦线、电阻若干、按键*1
三、项目设计
(一)基本原理
图片的显示是通过0.96寸的OLED显示屏实现的,这个显示屏虽然小,但是显示内容相对较多,而且使用方便,连接非常简单,资料例程较为全面。通过IIC进行通信,本设计中时钟线定义为P1^0,数据线定义为P1^1。
音乐的播放是通过一个三极管放大电路驱动一个喇叭实现的,当我们改变IO口的高低电平切换频率喇叭就会播放不同的曲调。本设计中喇叭控制端口我们定义为了P1^7,不同的音乐网上会有不同的数据,这个读者可自行参考。
切换图片用一个按键即可。
(二)原理图
- 51单片机最小系统基本原理图
- 三极管放大电路
- 显示电路
(三)程序设计
- 定义必要的变量的数组
#define uchar unsigned char
unsigned char a, i, j, k;
int b;
int key = 0;
sbit speaker = P1 ^ 7;
unsigned char timer0h, timer01, time;
code unsigned char sszymmh1[] = {6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2,1, 5, 2, 1, 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
};
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, 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, 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
};
code unsigned char FREQH[] = {0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xF9,0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0XFF
};code unsigned char FREQL[] = { 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, 0x21, 0xE1, 0x8C,0xD8, 0x68, 0xE9, 0x5B, 0x8F, 0xEE, 0x44, 0x6B, 0xB4, 0xF4,0x2D, 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16
};
- 延时函数
void delay(unsigned char t)
{unsigned char t1;unsigned long t2;for (t1 = 0; t1 < t; t1++)for (t2 = 0; t2 < 8000; t2++);
}
void lcddelay(unsigned char c)
{unsigned char a, b;for (; c > 0; c--)for (b = 142; b > 0; b--)for (a = 2; a > 0; a--);
}
- 音乐播放函数
void t0int() interrupt 1
{TR0 = 0;speaker = !speaker;TH0 = timer0h;TL0 = timer01;TR0 = 1;
}
void song()
{TH0 = timer0h;TL0 = timer01;TR0 = 1;delay(time);
}
- 按键中断函数
void int0() interrupt 0
{EX0 = 0;lcddelay(40);EX0 = 1;key = !key;
}
- 主函数
int main(void)
{ unsigned char k, i;OLED_Init(); //初始化OLEDOLED_DrawBMP(0,0,128,8,BMP2); //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)Delay_1ms(3000);OLED_Clear();TMOD = 1; ET0 = 1;EA = 1;EX0 = 1;IT0 = 1; while(1) {if (key == 0){OLED_Clear();OLED_DrawBMP(0,0,128,8,BMP2); //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)i = 0;while (i < 100 && key == 0){k = sszymmh[i] + 7 * sszymmh[i + 1] - 1;timer0h = FREQH[k];timer01 = FREQL[k];time = sszymmh[i + 2];i = i + 3;song();}}else{OLED_Clear();OLED_DrawBMP(0,0,128,8,BMP1); //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)i = 0;while (i < 100 && key == 1){k = sszymmh1[i] + 7 * sszymmh1[i + 1] - 1;timer0h = FREQH[k];timer01 = FREQL[k];time = sszymmh1[i + 2];i = i + 3;song();}}}
}
四、图片展示
五、总结
笔者水平有限,必定有错误不当之处,希望大家不吝指正,共同进步,共同学习!博客到这里完成了~
如果此文章对你有帮助,欢迎点赞
关注
收藏
转发
.