一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2160|回复: 13
收起左侧

[51单片机] 求助,请大家帮忙改个时钟

[复制链接]
发表于 2016-3-19 14:03 | 显示全部楼层 |阅读模式
本帖最后由 blueruby 于 2016-3-22 09:29 编辑

很久以前从坛友处买的一块板子,上面有6位数码管,最近翻出来,想改个时钟。先上原理图(由于是干机械的,对电子不熟悉,下了proteus装上,可有些元件真不知道怎么找,算了,还是用CAD画个吧)P0口少画了1K的上拉排阻

clou.png

一直在断断续续学51,下面这个是我用的开发板上的数码管原理图
51smg.png

开始学的是杜洋老师的教程
但不知道怎么总是通不过(可能是杜洋老师用的是STC的推挽输出,开发板用的是普通io口+三极管)
后来在隔壁论坛找个个程序
比较简单,改了改,通过了
就是以下这段程序:
#include <reg51.h>          //头文件包含

#define uchar unsigned char       //宏定义
#define uint  unsigned int

#define ON  0              //定义0为打开
#define OFF 1              //定义1为关闭
#define LEDBus P0            //定义p1口为数码管段码口

sbit MIAO =P0^5;             //秒点
sbit HOU_S=P2^1;            //时十位位选
sbit HOU_G=P2^2;            //时个位位选
sbit MIN_S=P2^3;            //分十位位选
sbit MIN_G=P2^4;            //分个位位选
sbit SEC_S=P2^5;            //秒十位位选
sbit SEC_G=P2^6;            //秒个位位选
sbit H_KEY=P3^4;            //时调整键
sbit M_KEY=P3^5;            //分调整键
bit  SHAN;                  //闪烁标志位

uchar second,minute,hour;        //定义秒、分、时寄存器

uchar code LEDTab[]={0x28,0x7e,0xa2,0x62,0x74,
0x61,0x21,0x7a,0x20,0x60};

void delay(uchar t);          //延时函数
void init();              //初始化函数
void display();             //显示函数
void min_tiao();            //分调整函数
void hou_tiao();            //时调整函数
/***************************************
函 数 名:main
功    能:主函数
说    明:
入口参数:无
返 回 值:无
****************************************/
void main()
{
init();                //调用初始化函数
while(1)               //主程序循环
{
  if(!H_KEY) hou_tiao();       //如果时调整键按下(为0),调用时调整函数
  if(!M_KEY) min_tiao();       //如果分调整键按下(为0),调用分调整函数
  display();             //调用显示函数
}
}
/***************************************
函 数 名:init
功    能:初始化函数
说    明:初始化定时器及中断
入口参数:无
返 回 值:无
***************************************/
void init()
{
TMOD=1;TH0=0X3C;TL0=0XB0;       //定时器0模式1,50毫秒
ET0=1;TR0=1;EA=1;           //开定时器0中断、启动定时器0、开总中断
}
/***************************************
函 数 名:display
功    能:显示函数
说    明:
入口参数:无
返 回 值:无
***************************************/
void display()
{

LEDBus=LEDTab[second%10];       //秒个位送数码管显示
SEC_G=ON;               //打开秒个位位选
delay(1);               //显示1毫秒
SEC_G=OFF;              //关闭分个位位选

LEDBus=LEDTab[second/10];       //秒十位送数码管显示
SEC_S=ON;               //打开秒十位位选
delay(1);               //显示1毫秒
SEC_S=OFF;              //关闭分十位位选


LEDBus=LEDTab[minute%10];       //分个位送数码管显示
MIAO=SHAN;              //秒点闪烁
MIN_G=ON;               //打开分个位位选
delay(1);               //显示1毫秒
MIN_G=OFF;              //关闭分个位位选

LEDBus=LEDTab[minute/10];       //分十位送数码管显示
MIN_S=ON;               //打开分十位位选
delay(1);               //显示1毫秒
MIN_S=OFF;              //关闭分十位位选


LEDBus=LEDTab[hour%10];        //时个位送数码管显示
HOU_G=ON;               //打开时个位位选
delay(1);               //显示1毫秒
HOU_G=OFF;              //关闭时个位位选
if(hour/10)              //如果时十位为0,不显示十位数字
{
  LEDBus=LEDTab[hour/10];       //时十位送数码管显示
  HOU_S=ON;              //打开时十位位选
  delay(1);              //显示1毫秒
  HOU_S=OFF;             //关闭时十位位选
}
}
/***************************************
函 数 名:min_tiao
功    能:分调整
说    明:
入口参数:无
返 回 值:无
***************************************/
void min_tiao()
{
while(!M_KEY) display();       //等待分调整键松开
second=0;minute++;          //秒清零、分加1
if(minute==60) minute=0;       //如果分等于60,分变0
}
/***************************************
函 数 名:hou_tiao
功    能:时调整
说    明:
入口参数:无
返 回 值:无
***************************************/
void hou_tiao()
{
while(!H_KEY) display();       //等待时调整键松开
second=0;hour++;           //秒清零,时加1
if(hour==24) hour=0;         //如果时等于24,时变0
}
/***************************************
函 数 名:delay
功    能:延时函数
说    明:
入口参数:t:延时时间长短
返 回 值:无
***************************************/
void delay(uchar t)
{
uchar i;               //定义变量

for(;t>0;t--)             //如果t大于0,t减1(外层循环)
  for(i=124;i>0;i--);         //i等于124,如果i大于0,i减1
}

/***************************************
函 数 名:timer0
功    能:定时器0中断函数
说    明:
入口参数:无
返 回 值:无
***************************************/
void timer0() interrupt 1        //定时器0(中断1)
{
uchar tim1,tim2;           //定义临时变量

TL0=TL0+0XB0;TH0=0X3C;        //重装定时器初值
tim1++;                //每中断一次tim1加1
if(tim1==10)             //中断10(0.5秒)
{                  
  SHAN=!SHAN;             //闪烁标志取反
  tim1=0;tim2++;           //tim1清零,tim2加1
  if(tim2==2)             //到了1秒
  {
   tim2=0;second++;         //tim2清零,秒加1
   if(second==60)          //如果秒到60
   {                 
    second=0;minute++;       //秒变0,分加1
    if(minute==60)         //如果分到60
    {
     minute=0;hour++;       //分变0,时加1
     if(hour==24) hour=0;     //如果时到24,时变0
    }
   }
  }
}
}


 楼主| 发表于 2016-3-19 14:07 | 显示全部楼层
上面这个程序比较简单
我能看懂
希望坛友在这个基础上修改一下
适应第一个原理图
这样我也可以对比上面的程序
学习一下

为啥我没改出来呢?
因为学艺不精
共阳极的会改,这个是共阴极的就不会了
还加了个hc245的收发器
不知道该怎么改了
改了改,显示乱码
 楼主| 发表于 2016-3-19 14:26 | 显示全部楼层
数码管是4301AH,共阴的(应该是想要那个段亮就是1吧),
自己写了代码表(不加小数点)0-9
0x77,0x24,0x5d,0x6d,0x2e,0x6b,0x7b,0x25,0x7f,0x6f
坛友有时间的给看看对不对
 楼主| 发表于 2016-3-19 20:18 | 显示全部楼层
共阳极换成共阴极
把显示函数里的开关调换了一下
好多了
但是还是有乱码
代码表应该没错
发表于 2016-3-19 21:23 | 显示全部楼层
DIR是不是应该直接VCC   试试段码直接00或者 FF 看看能不能正常显示关闭所有段 本菜鸟也就这个办法了
听说把本站有此功能,为了支持站长,求打赏,哈哈
 楼主| 发表于 2016-3-20 08:24 | 显示全部楼层
yjfxue 发表于 2016-3-19 21:23
DIR是不是应该直接VCC   试试段码直接00或者 FF 看看能不能正常显示关闭所有段 本菜鸟也就这个办法了

原电路板的接线就是这样的不是接线的问题
还是程序的问题
发表于 2016-3-20 11:24 | 显示全部楼层
blueruby 发表于 2016-3-20 08:24
原电路板的接线就是这样的不是接线的问题
还是程序的问题

但是你在程序里 好像并没有操作P4.6  是不是这里的问题
你说原板子就是这样,那你找出原板子的程序,修改修改不是方便多了

听说把本站有此功能,为了支持站长,求打赏,哈哈
发表于 2016-3-22 08:07 | 显示全部楼层
DIR直接VCC,你自己的代码表0x77,0x24,0x5d,0x6d,0x2e,0x6b,0x7b,0x25,0x7f,0x6f要代换原来的代码表0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60
再个显示乱码有2个原因:1如果每个数码管都同步显示乱码,原因是位选反向。2如果每个数码管显示不同的乱码,原因是代码表没代换。
 楼主| 发表于 2016-3-22 09:11 | 显示全部楼层
本帖最后由 blueruby 于 2016-3-22 11:10 编辑
sdxrly 发表于 2016-3-22 08:07
DIR直接VCC,你自己的代码表0x77,0x24,0x5d,0x6d,0x2e,0x6b,0x7b,0x25,0x7f,0x6f要代换原来的代码表0x28,0x7 ...

每个数码管都同步显示乱码,原因是位选反向
是这个现象
位选反向不太明白
不知道怎么改


改了改void display程序里的
on和off
不是同步显示了
但还是乱码
能帮我看看是不是代码表写错了么?
对应的段码是
P0.0  a    P0.1  f    P0.2  b    P0.3  g   
P0.4  e    P0.5  c   P0.6  d    P0.7  dp
发表于 2016-3-22 11:22 | 显示全部楼层
对应的段码是
P0.0  a    P0.1  f    P0.2  b    P0.3  g   
P0.4  e    P0.5  c   P0.6  d    P0.7  dp 没错
我在数码那边跟据你的仿真改了代码和仿真你去看一下

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-8 15:07 , Processed in 0.060361 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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