C51单片机的电子时钟(数码管显示)

这篇具有很好参考价值的文章主要介绍了C51单片机的电子时钟(数码管显示)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

硬件环境:

普中科技51单片机开发板STC89C52

相关开发板原理图解析

C51单片机的电子时钟(数码管显示)C51单片机的电子时钟(数码管显示)查看这两个原理图,我们可以发现控制这8个数码管由P22、P23、P24这三个控制,就相当于三个二进制数来控制数码管,三个二进制数(000-111)总共有8个,每一个二进制代表控制一个数码管。而控制数码管的发光二极管P0-P7控制,例如要想数码管显示数字0,则需要发光的只有abcdef,我们用十六进制来0x3F表示,因为四位二进制代表一位十六进制,我们把它转为二进制为:00111111,这每一个二进制数分别表示dp g f e d c b a,需要它发光则表示为1,在举一个例子,显示数字7,我们只需要abc发光,转为对应的二进制为:00000111 对应的十六进制为:0x07

正式代码:

#include<reg51.h>
//这里定义了3个端口位,分别命名为A、_B、C,分别代表P2口的2、3、4位。
sbit A=P2^2;
sbit _B=P2^3;
sbit C=P2^4;
//这里定义了一个宏定义,P0代表的是单片机的一个8位数据总线口
#define zixin P0
//这里定义了一个10个元素的只读数组zxCode,用于存放0~9的数码管显示码。
code unsigned char zxCode[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//这里定义了一个10个元素的只读数组_zxCode,用于存放0~9的数码管带点显示码。
code unsigned char _zxCode[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
//这里定义了一个延时函数,用于延时一段时间,用于稳定数码管的显示效果。
void delay(){
	char i;
for(i=-100;i<100;i++);
}
//这里定义了一个长度为8的数组DsBuf,用于存放需要显示的数码管数据,数组的每一个元素代表数码管的一个位置。
unsigned char DsBuf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

/*控制数码管显示的函数。在该代码中,使用P0口来控制8个数码管的段选信号,同时使用P2口的3个引脚(即A、B、C)来控制数码管的位选信号。通过display函数,可以将DsBuf数组中存储的数值依次显示在8个数码管上,实现时分秒的动态显示。该函数中使用了一个静态变量n来循环控制位选信号A、B、C的输出,从而实现了数码管显示的循环刷新。*/
void display(){
	static unsigned char n=0;
	zixin=0x00;
	if(n&0x01)  A=1;
	else 				A=0;
	if(n&0x02)  _B=1;
	else 				_B=0;	
	if(n&0x04)  C=1;
	else 				C=0;	
	zixin=DsBuf[n];
	n++;
	n%=8;
}
/*filldisbuf函数的作用是将传入的时分秒的值按照一定的格式进行转换,并将转换后的结果存储在DsBuf数组中,以便后续的数码管显示*/
void filldisbuf(unsigned int n,unsigned int m,unsigned int h){
	DsBuf[0]=zxCode[n%10];
	n /=10;
	DsBuf[1]=zxCode[n%10];
	
	DsBuf[2]=_zxCode[m%10];
	m /=10;
	DsBuf[3]=zxCode[m%10];
	
	DsBuf[4]=_zxCode[h%10];
	h /=10;
	DsBuf[5]=zxCode[h%10];
}

int main(){
//这里定义了3个unsigned int类型的变量,分别代表秒、分、时
	unsigned int s=0;
	unsigned int m=0;
	unsigned int h=0;
	//这里定义了一个unsigned char类型的变量i,用于计数
	unsigned char i=0;
	filldisbuf(s,m,h);
	while(1){
	display();
		delay();
		i++;
		if(i>=200){
			i=0;
			s = (++s) % 60;
			if (s == 0) {
				m = (++m) % 60;
				if (m == 0) {
					h = (++h) % 24;
				}
			}
			filldisbuf(s, m, h);
		}
	}
}

效果预览图

C51单片机的电子时钟(数码管显示)文章来源地址https://www.toymoban.com/news/detail-512044.html

到了这里,关于C51单片机的电子时钟(数码管显示)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包