C语言:51单片机实现数码管依次循环显示【1~F】课堂练习
在51单片机上实现数码管依次循环显示【1~F】的功能,可以通过以下步骤完成。假设使用的是共阴极数码管,并且数码管的段选和位选分别连接到单片机的P0口和P2口。
硬件连接
- 数码管的段选(a, b, c, d, e, f, g, dp)连接到P0口。
- 数码管的位选(选择哪个数码管显示)连接到P2口。
以下编程都是基于C语言的模块化编程实现的,1秒钟依次循环显示【1~F】课堂练习
步骤:
1,首先先定义一个用于存储段码的数组
2,然后定义一个用于控制灯变动的位码
3,初始化定时中断函数
4,定义定时中断服务函数为1秒
具体代码如下:
main.c
#include <REGX52.H>
#include <timer.h>
unsigned int count = 0;unsigned char NixieTable[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71, 0x00}; //首先先用数组定义一个段码void seg_dis(unsigned char Location,Number)
{switch(Location){case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];
}void main()
{Time0_Init();while(1){}}
unsigned int number = 1;
unsigned int i = 0;//Ö´ÐÐÖжϵÄÖжϳÌÐò
void Timer0_ISR() interrupt 1
{TL0 = 0xCD; //ÖØÐ¼ÓÔØ³õÖµ TH0 = 0xD4; if(++count == 100){seg_dis(number,i);i+=1;count = 0;if(i == 16){ //ÀÛ¼Ó1ÂÖºóÍùÓÒÒÆ¶¯Ò»Î»number+=1;i = 0;}
}if(number == 8){number = 0;}}
tiemr.c (初始化定时器)
#include <REGX51.H>
void Time0_Init()
{ TMOD &= 0xF0; TMOD |= 0x01; TL0 = 0xCD; TH0 = 0xD4; TF0 = 0; TR0 = 1; //Æô¶¯ÖÐ¶Ï EA = 1 ; //×Ü¿ª¹ØET0 = 1;}
timer.h
#ifndef _TIMER_H_
#define _TIMER_H_void Time0_Init();#endif