【51单片机Keil+Proteus8.9】AT89C51+7段数码管两位计数器

  两位计数器显示

  • 设计思路

电路设计

  1. 使用AT89C51单片机,外部引出两个管脚P3^3和P3^4当作按钮分别作为start和stop,对计时状态进行控制,由于是两位计数器,引出两个管脚P3^0和P3^1作为两个数码管的片选信号,工作时快速交替利用人眼视觉暂留效应实现不间断显示。
  2. 显示屏选用共阳极7段两位数码管7seg-mpx2-ca-blue,将其A至G引脚接至单片机AT89C51单片机的P2组引脚,工作时单片机向显示屏发出数据,进行计数值的显示。

代码设计

  1. 根据共阳极数码管特性,提前在函数内部定义一个arr[10]数组,以16进制形式包含了0-9数值的数据,使用时直接调用数组中的一个就可以。
  2. 定义了一个时间延时函数delay(int d),用于作为计数器两位数值高位和低位的交替时间。
  3. 利用整型变量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δÁ¬½Ó£¬×î¸ßλÈÎÒâ

    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δÁ¬½Ó£¬×î¸ßλÈÎÒâ
    	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;
    			}
    		}
    	}
    	
    }
    }

    可私信获取项目文件

  • 27
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是51秒表计数器倒计时(数码管两位数)的代码实现: ```c #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示0-9的编码 void delay(uint x) //延时函数 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void main() { uchar count=60; //倒计时的初始值为60秒 uchar ten,unit; //ten表示十位数字,unit表示个位数字 while(1) { ten=count/10; //计算十位数字 unit=count%10; //计算个位数字 P2=0x00; //清空数码管显示 P1=0xfe; //第一位数码管显示 P0=table[ten]; //显示十位数字 delay(5); //5ms延时 P2=0x00; //清空数码管显示 P1=0xfd; //第二位数码管显示 P0=table[unit]; //显示个位数字 delay(5); //5ms延时 count--; //倒计时的秒数减1 if(count==0) //倒计时结束 { while(1); //程序停在此处,不再执行 } } } ``` 注:本程序使用了定时器来实现延时,因此需要在Keil中设置定时器。具体方法如下: 1. 点击菜单栏“Project” -> “Options for Target...”。 2. 在弹出的窗口中选择“C51” -> “C Compiler”选项卡,在“Preprocessor Symbols”中添加宏定义“FOSC=11059200L”(如果单片机的晶振频率不是11.0592MHz,请将该宏定义修改为相应的值)。 3. 选择“C51” -> “Target”选项卡,在“C51 Settings”中选择“Timers”选项卡。 4. 选择“Timer 0”或“Timer 1”,根据自己的需要进行设置。例如,设置定时器1为1ms定时器,需要将“Mode”设置为“2”,“Value”设置为“65536-11059”,“Clock”设置为“Fsys/12”。其中,“11059”是“1ms/(1/11.0592MHz)”的计算结果。 5. 设置完成后点击“OK”按钮保存设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值