单片机定时器计数器程序设计

如何制作一个程序,让前2个数码管显示显示,后两个数码管显示分钟?怎么才可以做到呢,求指点

  • 这篇博客: 单片机蓝桥杯——定时中断实现数码管显示、按键判断中的 (2)关于数码管显示: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •         数码管段码:

                    segCode[0]~segCode[9]为0~9的段码(不带小数点);

                    segCode[10]~segCode[19]为0~9的段码(带小数点);

                    segCode[20]为数码管全灭的代码。

    uchar segCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,       //0~9的段码(不带小数点)
                                     0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff}; //0.~9.的段码(带小数点) 以及0xff全灭
    
    

            数码管显示数组:

                    uchar segVal[] = {1,2,3,4,11,12,13,14};  //数码管初始化显示1 2 3 4 1. 2. 3. 4.

                    直接更改数组里面的值便可以控制数码管显示,例如

                    让数码管的第0位显示数字8:

     segVal[0]= 8;

            让数码管的第1位显示数字8(带小数点):

    segVal[1] = 18;

             总代码如下:

    #include "reg51.h"
    #include "intrins.h"
    #define uchar unsigned char
    #define uint unsigned int
    sfr AUXR = 0x8e;	
    uchar segCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,       //0~9的段码(不带小数点)
    								 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff}; //0.~9.的段码(带小数点) 以及0xff全灭
    uchar segVal[]={1,2,3,4,11,12,13,14};  //数码管初始化显示1 2 3 4 1. 2. 3. 4.
    
    void SelectHC573(uchar val) 
    {
    	switch(val)
    	{
    		case 4 : P2 = (P2 & 0x1f) | 0x80; break;
    		case 5 : P2 = (P2 & 0x1f) | 0xa0; break;
    		case 6 : P2 = (P2 & 0x1f) | 0xc0; break;
    		case 7 : P2 = (P2 & 0x1f) | 0xe0; break;
    		default: P2 = (P2 & 0x1f); break;		
    	}
    }
    void InitSystem()//系统初始化关闭蜂鸣器、继电器、LED
    {
    	SelectHC573(5);
    	P0 = 0xbf;      //由于不同板子的引脚接法不同,此时的初始值也不同
    	SelectHC573(4);	
    	P0 = 0xff;     //LED全灭
    }
    
    
    void Timer0Init(void)		//1毫秒@12.000MHz
    {
    	AUXR &= 0x7F;		//定时器时钟12T模式
    	TMOD &= 0xF0;		//设置定时器模式
    	TL0 = 0x18;		//设置定时初值
    	TH0 = 0xFC;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	ET0 = 1;
    	EA = 1;
    }
    uchar segFlag = 0;
    void ServiceTimer0() interrupt 1
    {
    	uchar pushp0,pushp2;
    	pushp0 = P0;
    	pushp2 = P2;//入栈
    	SelectHC573(6);
    	P0 = (0x01<<segFlag);
    	SelectHC573(7);	
    	P0 = segCode[segVal[segFlag]];
    	segFlag++;
    	if(segFlag == 8) segFlag = 0;
    	P2 = pushp2;//出栈
    	P0 = pushp0;
    }
    void main()
    {
    	InitSystem();
    	Timer0Init();
    	while(1)
    	{
    		;
    	}
    }