【51单片机数码管+蜂鸣器的使用】2023-6-14

缘由https://ask.csdn.net/questions/7963638

要求数码管从零开始,每隔一秒计数一次,到20号归零,蜂鸣器发出提示音。

cpp 复制代码
#include <reg52.h>
unsigned char code ShuMaGuan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0X80,118,121,56,63};//0~9隐.HELO
sbit fm=P3^4;
void main()
{//缘由https://ask.csdn.net/questions/7963638
	unsigned char w=0,ys=0,sy=0,my=0,sz=0;
	bit k=0;
	while(1)
	{
		if(++my>40){if(k)fm=~fm;my=0;}//第一步调试蜂鸣器频率
		if(++sy==0)//第二步写数码管显示延时
		{
			P2=P1=0;//写数码管段消隐,位关闭。
			if(!w)w=1;else w*=2;P2=255-w;//写2位数码管动态位驱动
			P1=ShuMaGuan[w==1?sz/10:w==2?sz%10:10];//写数码管段驱动,并拆分整数送相应位。
			if(++ys==0)if(++sz>20){k=1;sz=0;}else k=0;//第三步写数码管显示值步进和延时,并控制蜂鸣器。
		}
	}
}

这个应该是投石问路,到其他论坛问看,如果没有就属于空白.

单片机时间片策略当然是有的,荔枝:数码管显示延时的时间片,由于写法不同,则时间片的利用也不同,

如使用if判断延时是这样的char ys=0;while(1){if(++ys==0){数码管显示}else 其他处理时间;}

如使用傻等式是这样的char ys=0;while(1){数码管显示;while(++ys==0);}那么只有傻傻等呆空循环完成后才能作其他事情;

而上面用判断的则不然,只要判断延时还没到的这段时间就可以执行其他事件,这就是2种不同思路产生不同结果。

相关推荐
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(七):<线程同步与互斥>线程同步(下)
java·linux·运维·服务器·c++·学习·操作系统
迷途之人不知返2 小时前
算法类型:双指针类型
算法
c++逐梦人2 小时前
C++ RAII流式日志库实现
开发语言·c++
吴可可1232 小时前
三点绘圆弧的几何实现
算法
t***5442 小时前
还有哪些设计模式适合现代C++
开发语言·c++·设计模式
Wave8452 小时前
C++ 面向对象基础:类、访问权限,构造函数,析构函数
开发语言·c++
t***5442 小时前
如何在现代C++项目中有效应用这些设计模式
开发语言·c++·设计模式
今儿敲了吗2 小时前
ArkTS 声明式 UI 开发
笔记·学习
kyle~2 小时前
导航---LIO(激光雷达-惯性里程计)算法
c++·算法·机器人·ros2·导航