查看: 1157|回复: 0
打印 上一主题 下一主题

单片机驱动数码管显示参考程序

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-25 13:15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x00,0x90};      //数码管显示0-9的字节
uchar postion [6]={0x01,0x02,0x04,0x08,0x10,0x20};                                        // 数码管的为控制字节
uchar timer[3];                                                                                                //时间的数组
uchar disbruff[6];                                                                                                   //保存每个数码管要显示的字节
/****************************************************************************
                             延时函数
****************************************************************************/
void delay_ms(uchar n)   
{
       unsignedint i,j,k;
       for(i=0;i<n;i++)
       {                          
              for(k=0;k<4;k++)
              {  
                     for(j=0;j<10;j++);  
              }
       }
}
/**************************************************************************
     将要显示的时间数据经过timer——to——disbruff转换到disbruff[]
**************************************************************************/
void timer_to_disbruff()
{
   uchar i,A=0;                                   //A=0importment
   for(i=0;i<3;i++)
    {
       disbruff[A++]=timer%10;                   //取数据的各位                  
      disbruff[A++]=timer/10 ;                  // 取数据的十位
    }
}
/**************************************************************************
                               DS1302专用
**************************************************************************/
sbit    sclk      = P1^2;   /*实时时钟时钟线引脚 */
sbit    io       = P1^1;   /*实时时钟数据线引脚 */
sbit    rst      = P1^0;   /*实时时钟复位线引脚 */
bdata uchar date_bruff;
sbit flag0=date_bruff^0;                                                                              
sbit flag7=date_bruff^7;
uchar bcd_bruff[8];
/***************************************************************************
          字节传送
                 功能:上升沿传送一个数据位的最低位
                 用途:用于字节的传送
****************************************************************************/
void inputbety (uchar ucdate)
{
  uchar i;
  date_bruff=ucdate; //  将要传送的数据赋值给date_bruff
  for(i=0;i<8;i++)          //       循环8次按位传送一个字节
    {
     io=flag0;                   //  将最低位赋值给io
         sclk=1;                       //  触发上升沿传送一个位
         sclk=0;                            //      sclk变低准备下一个上升沿
         date_bruff=date_bruff>>1;//数据移位将依次右移一位,依次传送01234567
    }
}
/***************************************************************************
            字节的读取
                      功能:上升沿读取一个数据的最低位
                      用途:用于读取字节
***************************************************************************/
uchar outputbety()
{
uchar j;
for(j=0;j<8;j++)
   {
       date_bruff=date_bruff>>1;    //先右移一位准备接受读取的数据位
    flag7=io;                            //把读取的数据赋值给date_bruff的第7
        sclk=1;                                //触发上升沿肚脐眼一个位
        sclk=0;                                // 变低准备下一个上升沿
    }                                                        
       returndate_bruff;                //返回读取的数据            
}
/****************************************************************************
                                      地址字节和数据的传送
                                      功能:调用inputbety();先写地址,紧接着写地址内的数据
                                      用途:配置DS1302的内部寄存器
****************************************************************************/
void wdate(uchar addr, uchar date)
{
   rst=0;                 //变低为sclk变低允许
       sclk=0;              // 变低准备上升沿
       rst=1;                    //      使能对ds1302进行操作
       inputbety(addr);//写入地址
       inputbety(date);//写入数据  
   sclk=1;                     
       rst=0;                             
}                                          
/***************************************************************************
                            数据的读取
                            功能:写写入要读取数据的地址和指令;然后调用output()
                            用途:用于读取ds1302的实时时间
***************************************************************************/
uchar rdate(uchar addrx)
{
   uchar readdate;
   rst=0;
       sclk=0;
       rst=1;
       inputbety(addrx);//写入控制命令的字节和数据
       readdate=outputbety();// 读取数据
   sclk=1;
       rst=0;
       returnreaddate;         //  返回数据
}
void initial_ds1302(void)   //时钟芯片初始化
{   
       unsignedchar second=rdate(0x80);
       if(second&0x80)             //判断时钟芯片是否关闭   
    {
         wdate(0x8e,0x00);      //写入允许
         wdate(0x8c,0x07);      //以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:56
         wdate(0x88,0x07);
         wdate(0x86,0x15);
         wdate(0x8a,0x07);
         wdate(0x84,0x15);
         wdate(0x82,0x52);
         wdate(0x80,0x55);
        wdate(0x8e,0x80);    //禁止写入
       }                              
}     
void readds1302() //读取数据的BCD
{
uchar i;
for(i=0;i<7;i++)
{
  bcd_bruff=rdate(0x81+2*i);// 依次读取数据存储在bcd_bruff数组内
}
}
/**********************************************************************************
               将读取的BCD吗转换成能在数码管上显示的数据
******************************************************************************/
void bcd_to_timer()
{
uchar k;
for(k=0;k<3;k++)
   {
     timer[k]=((bcd_bruff[k]&0xf0)>>4)*10 + (bcd_bruff[k]&0x0f);   
    }
}
/*******************************************************************************
                      数码管的动态显示函数
*******************************************************************************/
void display()
{
uchar i;
for(i=0;i<6;i++)
  {
   P2=led[disbruff];
   P3=postion;
   delay_ms(5);
  }  
}
/********************************************************************************
                                        主函数     
  
*******************************************************************************/
voidmain()
{
timer[0]=0;
timer[1]=0;
timer[2]=0;
  timer_to_disbruff();
  initial_ds1302();
while(1)
  {  
        readds1302();
        bcd_to_timer();
        timer_to_disbruff();
    display();
   };
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表