基于51单片机的课程设计(毕业设计)——电子贺卡

        本篇文章将介绍一个基于51单片机的电子贺卡,本作品可用于课程设计、毕业设计的参考。其所用到的外设硬件以及程序的代码量都是相对较少的,对于51单片机的初学者,通过本设计熟悉51单片机的使用是非常好的选择。

目录

一、实现功能

二、硬件准备

三、项目设计

 (一)基本原理

  (二)原理图

  (三)程序设计

四、图片展示

五、总结

资料下载: 基于51单片机的电子贺卡设计,课程设计,毕业设计


一、实现功能

  1. 通过喇叭播放《世上只有妈妈好》音乐曲调;
  2. 通过0.96寸的OLED显示图片;
  3. 通过按键切换图片

二、硬件准备

  1. 主控芯片:STC89C52(安装在最小系统板上)
  2. 显示装置:0.96寸4针OLED显示屏(IIC接口)
  3. 播放装置:喇叭、三极管
  4.  其他:杜邦线、电阻若干、按键*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();
			}
		}
	}	  	
}

四、图片展示

五、总结

        笔者水平有限,必定有错误不当之处,希望大家不吝指正,共同进步,共同学习!博客到这里完成了~

如果此文章对你有帮助,欢迎点赞 关注 收藏 转发.

资源下载:基于51单片机的电子贺卡设计,课程设计,毕业设计_基于单片机的电子贺卡设计资源-CSDN文库 

  • 16
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Cui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值