注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
liubolz2011的个人空间 https://home.eeworld.com.cn/space-uid-414378.html [收藏] [复制] [分享] [RSS]
日志

基于51单片机设计的数字钟

已有 2455 次阅读2012-5-8 19:28 |

                      基于51单片机设计的数字钟
一:效果图如下
8位LED数码管显示,P3.7做时钟调节,P3.6做分钟调节,P3.5做秒钟调节;
二:原理图如下
 
//源程序代码如下
#include<regx51.h>           //  包含51单片机寄存器定义的头文
unsigned char code disp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; 
unsigned char code bitdisp[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c};
unsigned char buffer[8]={0,0,16,0,0,16,0,0};
unsigned char dispbitcnt;
unsigned int tcnt=0;
unsigned char  second=0;
unsigned char count=0;
unsigned char   minute=0;
unsigned char   hour=12;
void delay10ms(void)
{
 unsigned char i,j;
 for(i=200;i>0;i--)
 for(j=248;j>0;j--)
 ;
}
 void t0(void) interrupt 1 using 0   //中断服务子程序
 {
  TH0=0x06;
  TL0=0x06;
  TR0=1;
  if(count!=8)
   {count++;}
   else
   { count=0;
   
 
     if(dispbitcnt!=8)     //端口显示程序
 {
    P2=bitdisp[dispbitcnt];
 P1=disp[buffer[dispbitcnt]];
 dispbitcnt++;
 }
 else{dispbitcnt=0;}
 if(tcnt!=400)
  {tcnt++;}
 else
 { tcnt=0;
     if(second!=59)
  {
   second++;
  }
   else
    {second=0;
    
  if(minute!=59)
   {
     minute++;
   }
    else
     {
     minute=0;
     if(hour!=23)
       {hour++;}
      else{hour=0;}
       }
      }
     }
  
   }
 }

void initial(void)    //中断初始化程序
{
  TMOD=0x02;
  TH0=0x06;
  TL0=0x06;
  TR0=1;
  ET0=1;
  EA=1;
 }
void main(void)

   initial();
   while(1)
  {
    if((P3&0xe0)!=0xe0)
   {
 
  delay10ms();
   if(P3_7==0)
    {
     if(hour!=23)
  {hour++;}
   else
    {hour=0;}
    }
     else
  {
   if(P3_6==0)
    { 
      if(minute!=59)
    {
     minute++;
    }
    else{minute=0;}
    }
    else
      {delay10ms();
    if(second!=59)
    {
     second++;
    }
     else
      {second=0;}
      }
  }
   }
    buffer[0]=hour/10;
 buffer[1]=hour%10;
 buffer[3]=minute/10;
 buffer[4]=minute%10;
 buffer[6]=second/10;
 buffer[7]=second%10;
    }
}
 
发表评论 评论 (6 个评论)
回复 张无忌1987 2012-5-10 19:16
不错啊,你什么专业?课程设计吧
回复 liubolz2011 2012-5-12 13:39
张无忌1987: 不错啊,你什么专业?课程设计吧
电子专业,不是课程设计。自己写着好玩的!
回复 kdsuntao 2012-5-12 16:27
我想请教一下,我也写了个数字钟的程序。现在问题是秒的十位发暗的段,显示随着个位一起变这是为什么呢?
回复 liubolz2011 2012-5-13 12:02
kdsuntao: 我想请教一下,我也写了个数字钟的程序。现在问题是秒的十位发暗的段,显示随着个位一起变这是为什么呢?
你描述的不很很清晰,这得看你的源代码才知道!
回复 kdsuntao 2012-5-14 07:59
我用的开发板和你的差不多的。
#include<reg52.h>
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//¶¨ÒåÊýÂë¶ÎÏÔʾÊý×é
unsigned char dispbitcode[]={0xE3,0xE7,0xEB,0xEF,0xF3,0xf7,0xfb,0xff};//¶¨ÒåÊýÂëλѡÊý×é
unsigned char dispbuf[8]={0x01,0x02,0xff,0x00,0x00,0xff,0x00,0x00}; //¸øλÊý×é³õʼ»¯
unsigned char dispbitcnt;

unsigned char second=0;
unsigned char minite=0;
unsigned char hour=12;
unsigned int  tcnt=0;
unsigned char mstcnt;

unsigned char i,j;

sbit  k1=P0^0;//±Ø&ETH;ë붨Òå·ñÔòµ¥&AElig;¬»úÎ&THORN;·¨Ö±½ÓÖ´&ETH;&ETH;P0^0
sbit  k2=P0^1;
sbit  k3=P0^2;

void main()
{
TMOD=0x02;  //Ñ¡Ôñ¶¨Ê±&AElig;÷¹¤×÷·½Ê½
TH0=0x06;   //¸ø¶¨Ê±&AElig;÷¸³³õÖµ
TL0=0x06;
TR0=1;  //¶¨Ê±&AElig;÷0ÔË&ETH;&ETH;¿ØÖ&AElig;λ
ET0=1;
EA=1;
while(1)
{
  if(k1==0)
  {
   for(i=5;i>0;i--)
   for(j=248;j>0;j--);
   if(k1==0)
   {
           second++;
        if(second==60)
        {
         second=0;
        }
        while(k1==0);
   }
  }
  if(k2==0)
  {
   for(i=5;i>0;i--)
   for(j=248;j>0;j--);
   if(k2==0)
   {
           minite++;
        if(minite==60)
        {
         minite=0;
        }
        while(k2==0);
   }
  }
  if(k3==0)
  {
   for(i=5;i>0;i--)
   for(j=248;j>0;j--);
   if(k3==0)
   {
           hour++;
        if(hour==24)
        {
         hour=0;
        }
        while(k3==0);
   }
  }

}
}

void t0()interrupt 1 using 0
{
mstcnt++;    //ÑÓʱ
if(mstcnt==8)
{
  mstcnt=0;
  P1=dispcode[dispbuf[dispbitcnt]];         //ÏÔʾ³öÀ´   //Öµ              //n    //µÚnλÊýµÄÖµÏÔʾ³öÀ´
  P2=dispbitcode[dispbitcnt];            //λѡ             //n   //µÚnλÊý&ETH;èÒªÏÔʾ
  dispbitcnt++;
  if(dispbitcnt==8)
  {
   dispbitcnt=0;
  }
}
tcnt++; //ÑÓʱ
if(tcnt==4000)
{
  tcnt=0;
  second++;
  if(second==60)
  {
   second=0;
   minite++;
   if(minite==60)
   {
           minite=0;
    hour++;
        if(hour==24)
        {
         hour=0;
        }
   }
  }
  dispbuf[0]=hour/10;
  dispbuf[1]=hour%10;
   dispbuf[3]=minite/10;
   dispbuf[4]=minite%10;
   dispbuf[6]=second/10;
   dispbuf[7]=second%10;
  }
}
回复 botom 2012-5-15 15:00
单片机读写SD卡 模块 支持FAT32 UART接口 .TXT文件
单片机串口读写SD卡 模块 支持FAT32 UART接口 .TXT文件
51单片机读写SD卡 模块 支持FAT32 UART接口 .TXT文件



随着电子技术的发展,SD卡作为大容量数据存储器越来越受到广大电子爱好者和客户的衷爱。但是由于SD卡FAT操作的编程复杂,很多电子爱好者望而却步,现在好了,我们推出了这块小巧玲珑的SD卡读卡模块,将复杂的FAT操作集成其内,单片机只需简单的串口操作就能将数据存到SD卡中去,而且支持FAT32。


功能简介:
1. 电源输入范围宽:5~9V,支持3.3V和5V的UART接口。
2. 和单片机的接口简单 UART(串口)接口 可以直接和单片机的UART接口连接
3. 集成FAT32格式系统
4. 文件的读写支持两种模式,一种顺序读写,用以连续的大量数据的读写.一种为给定起始地址的读写,用来随即读写的少量数据的情况,这个功能是的文件的读写非常灵活
5. 波特率可以用拨码开关选择,支持从1200~115200bps
6. 一次性发送数据贞可以长达256字节,有效字节数250
7. 支持<=8G容量的SD卡
8. 读写SD卡模块的速度快
9. 命令结构简单,方便发送
10.能动态监测SD状态有错就会提示
11.模块尺寸小,便于安装与使用。





那个带SD卡的是个模块,带处理器,整合了FAT32,接口是串口(UART)
51单片机串口115200bps读写,写入后文件样子如下:



说明书下载地址:http://www.prog430.com/files/SDV6.pdf

测试软件下载地址:http://www.prog430.com/files/SDV6_test.rar

说明书下载地址:http://www.prog430.com/files/SDV7.pdf

测试软件下载地址:http://www.prog430.com/files/SDV7_test.rar

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章