本篇文章将介绍一个基于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(); //初始化OLED
OLED_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();
}
}
}
}
四、图片展示
五、总结
笔者水平有限,必定有错误不当之处,希望大家不吝指正,共同进步,共同学习!博客到这里完成了~
如果此文章对你有帮助,欢迎点赞
关注
收藏
转发
.