IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【蓝桥杯单片机进阶强化-04】PWM信号控制呼吸流水灯 -> 正文阅读

[嵌入式]【蓝桥杯单片机进阶强化-04】PWM信号控制呼吸流水灯

【蓝桥杯单片机进阶强化-04】PWM信号控制呼吸流水灯

内容来自小蜜蜂老师
小蜜蜂老师博客链接
老师在这个案例中是用MM模式写的 我用IO方式写的 在进行S7按键操作时不知道为什么没有反应 检查了一下和老师写的差不多 望大佬指出错误

在这里插入图片描述

#include "reg52.h"

sbit S4 = P3^3;
sbit S7 = P3^0;

unsigned char pwm = 0; //周期数
unsigned char pwm_duty = 0; //占空比
unsigned char times = 0; //0.5s变化
unsigned char key_value = 0;//键值记录
unsigned char led_start = 0; //led pwm
unsigned char status = 0;
unsigned char status_go = 0;


unsigned char code SMG_duanma[18]=
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
		 0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

//-----------------------------------简单延时------------------------
void Delay(unsigned int t)
{
 	while(t--);
}


//---------------------------74hc138---------------------------------
void Init_74HC138(unsigned char n)
{
 	switch(n)
	{
	 	case 4:P2 = (P2 | 0x1f) & 0x80;break;
		case 5:P2 = (P2 | 0x1f) & 0xa0;break;
		case 6:P2 = (P2 | 0x1f) & 0xc0;break;
		case 7:P2 = (P2 | 0x1f) & 0xe0;break;
	}

}


//-------------------------------系统初始化----------------------------
void Init_System(void)
{
 	Init_74HC138(4);
	P0 = 0xff;   //关闭所有Led
	Init_74HC138(5);
	P0 = 0x00;   //关闭继电器和蜂鸣器
}


//----------------------------------数码管相关函数-----------------------
//安位显示
void SMG_DisplayBit(unsigned char pos,unsigned char dat)
{
 	Init_74HC138(6);
	P0 = (0x01 << pos);
	Init_74HC138(7);
	P0 = dat;
}

//关闭所有数码管
void SMG_Close(unsigned char dat)
{
 	Init_74HC138(6);
	P0 = 0xff;
	Init_74HC138(7);
	P0 = dat;
}


//数码管数据显示
void SMG_Display_Data(unsigned char status,unsigned char duty)
{
 	 SMG_DisplayBit(0,SMG_duanma[status]);
	 Delay(200);
	 SMG_DisplayBit(1,0xff);
	 Delay(200);
	 SMG_DisplayBit(2,0xff);
	 Delay(200);
	 SMG_DisplayBit(3,0xff);
	 Delay(200);
	 SMG_DisplayBit(4,0xff);
	 Delay(200);
	 SMG_DisplayBit(5,0xff);
	 Delay(200);
	 SMG_DisplayBit(6,SMG_duanma[duty/10]);
	 Delay(200);
	 SMG_DisplayBit(7,SMG_duanma[duty%10]);
	 Delay(200);
	 
	 SMG_DisplayBit(0,0xff);
	 Delay(200);
	 SMG_DisplayBit(6,0xff);
	 Delay(200);
	 SMG_DisplayBit(7,0xff);
	 Delay(200);

}


 

//------------------------------------定时器初始化-------------------------
void Init_Timer0(void)
{
	TMOD = 0x01;
	TH0 = (65535-1000)/256;
	TL0 = (65535-1000)%256;
	ET0 = 1;
	TR0 = 1;
	EA  = 1;
}



//------------------------------Led控制---------------------------
void Led_Control(void)
{
 	if(times == 5)
	{
	 	times = 0;
		if(led_start == 0)
		{
		 	//增大占空比
			pwm_duty += 1;
			if(pwm_duty == 11) //最大为1个周期10
			{
			 	pwm_duty = 10;
				led_start = 1; //状态翻转
			}
		}
		else if(led_start == 1)
		{
		 	//减小占空比
			pwm_duty -= 1;
			if(pwm_duty == 255)	 //减到最小值了
			{
			 	pwm_duty = 0;
				led_start = 0; //状态在翻转
				if(status_go == 1)	//从左到右
				{
				 	status ++;
					if(status == 8)
					{
					 	status = 0;
					}
				}
				else if(status_go == 2)//从右到左
				{
					 status--;
					 if(status == 255)
					 {
							status = 7;
					 }
				}
			}
		}
	}
}


//-----------------------------按键处理函数-------------------------
void Key_Tackle(void)
{
 	 if(S4 == 0)
	 {
			Delay(20);
			if(S4 == 0)
			{
			 	while(S4 == 0)
				{
				 	key_value = 1;
				}
					key_value = 0;
					status_go++;
					if(status_go == 3)
					{
					 		status_go = 1;
					}
			}
	 }

	 if(S7 == 0)
	 {
			Delay(20);
			if(S7 == 0)
			{
			 	while(S7 == 0)
				{
				 	key_value = 1;
					SMG_Display_Data(status+1,pwm_duty*10);
				}
				key_value = 0;				

			}
	 }
}

//-----------------------------------主函数-------------------------------
void main(void)
{
	Init_System();
	Init_Timer0();
 	while(1)
	{
		 Led_Control();
		 Key_Tackle();
	}

}

//---------------------------------中断服务函数------------------------------
void Server_Timer0() interrupt 1
{
	TH0 = (65535-1000)/256;
	TL0 = (65535-1000)%256;
	if(status_go == 0)
	{
	 	//默认Led状态L4 L5亮其余熄灭
		Init_74HC138(4);
		P0 = 0xe7;  //1110 0111 
	}
	pwm++;
	if(pwm < pwm_duty)	 //小于为低电平亮
	{
			Init_74HC138(4);
			P0 = ~(0x01 << status);	  //0000 0001 -》1111 1110
	}
	else if(pwm <= 10)	  //周期为10
	{
		Init_74HC138(4);
		P0 = 0xff;  //熄灭
	}
	else		 //pwm > 10 --->重新开始
	{
			pwm = 0;
			Init_74HC138(4);
			P0 = ~(0x01 << status);
			if(key_value == 0)
			{
			 	 times++;
			}
	}
}


  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:38:55  更:2022-01-17 11:39:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:26:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码