在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