两位计数器显示
- 设计思路
电路设计
- 使用AT89C51单片机,外部引出两个管脚P3^3和P3^4当作按钮分别作为start和stop,对计时状态进行控制,由于是两位计数器,引出两个管脚P3^0和P3^1作为两个数码管的片选信号,工作时快速交替利用人眼视觉暂留效应实现不间断显示。
- 显示屏选用共阳极7段两位数码管7seg-mpx2-ca-blue,将其A至G引脚接至单片机AT89C51单片机的P2组引脚,工作时单片机向显示屏发出数据,进行计数值的显示。
代码设计
- 根据共阳极数码管特性,提前在函数内部定义一个arr[10]数组,以16进制形式包含了0-9数值的数据,使用时直接调用数组中的一个就可以。
- 定义了一个时间延时函数delay(int d),用于作为计数器两位数值高位和低位的交替时间。
- 利用整型变量i从0-99自增作为时间,将i/10就可以得到高位的值,i%10就得到低位的值,从而完成计数。
- 原理图
- 测试过程及结果说明
-
1.在keil端进行代码编写,将实验代码进行编译,结果正确无任何错误。
-
2.打开Proteus软件,绘制原理图,放置元件,双击AT89C51单片机芯片,将keil端编译之后生成的HEX文件加载到芯片内。
-
启动仿真
按下第一个按钮,即P3^3对应的start按钮,电路开始计数,显示屏开始显示数字并自增,如下图
-
-
然后按下第二个按钮,即P3^4对应的stop按钮,电路暂停计数,显示屏数字保持不变,如下图
-
最后按下第一个按钮start,电路从0开始计数
-
#include<reg51.h>
sbit S1 = P3^0; // Select line 1 for Display 1
sbit S2 = P3^1; // Select Line 2 for Display 2
sbit START = P3^3; //START
sbit STOP = P3^4; //STOP
void delay(int d)
{
int i,j;
for(i=0;i<d;i++)
for(j=0;j<255;j++);
}
void main()
{
//DP?′á??ó£?×?????è?òa
int arr[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90}; // ******Your codes is required here!!!
int i,on,off;
static int num1,num2,temp1,temp2;
while(1){
if ((START==0)&&(STOP==1))
{
on = 1;
off = 0;
}
else
{
on = 0;
off = 1;
}
while(on && !off)
{
for(i=0;i<100;i++)
{
num1 = i/10; //First Digit Separated
temp1 = num1;
S1 = 1; //Select Line 1
S2 = 0;
P2 = arr[num1]; //Display 1 will indicate number
delay(45);
num2 = i%10; //Second Digit Separated
// *****Your codes is required here!!!
temp2 = num2;
S1 = 0;
S2 = 1;
P2 = arr[num2];
delay(45);
if(STOP==0)
{
off = 1;
on = 0;
break;
}
}
while(off && !on)
{
S1=1;
S2=0;
P2 = arr[temp1];
delay(10);
S1=0;
S2=1;
P2 = arr[temp2];
delay(30);
if (START==0)
{
off = 0;
on = 1;
break;
}
}
}
}
}
#include<reg51.h> sbit S1 = P3^0; // Select line 1 for Display 1 sbit S2 = P3^1; // Select Line 2 for Display 2 sbit START = P3^3; //START sbit STOP = P3^4; //STOP void delay(int d) { int i,j; for(i=0;i<d;i++) for(j=0;j<255;j++); } void main() { //DP?′á??ó£?×?????è?òa int arr[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90}; // ******Your codes is required here!!! int i,on,off; static int num1,num2,temp1,temp2; while(1){ if ((START==0)&&(STOP==1)) { on = 1; off = 0; } else { on = 0; off = 1; } while(on && !off) { for(i=0;i<100;i++) { num1 = i/10; //First Digit Separated temp1 = num1; S1 = 1; //Select Line 1 S2 = 0; P2 = arr[num1]; //Display 1 will indicate number delay(45); num2 = i%10; //Second Digit Separated // *****Your codes is required here!!! temp2 = num2; S1 = 0; S2 = 1; P2 = arr[num2]; delay(45); if(STOP==0) { off = 1; on = 0; break; } } while(off && !on) { S1=1; S2=0; P2 = arr[temp1]; delay(10); S1=0; S2=1; P2 = arr[temp2]; delay(30); if (START==0) { off = 0; on = 1; break; } } } } }
可私信获取项目文件