找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13181|回复: 11
收起左侧

单片机秒表电路+仿真+原理图+PCB+源代码 显示乱码求帮助

  [复制链接]
ID:231693 发表于 2017-9-7 16:15 | 显示全部楼层 |阅读模式
分享一个51单片机做的秒表,有错误 如图:
51hei.png
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

0.png

单片机源程序如下:
  1. #include        "reg51.h"
  2. //******************************************
  3. //开始定义各个数字的字模
  4. char        code        cDISP_NumMod[16]        =        
  5. {
  6.         0x3F,0x06,0x5B,0x4F,        0x66,0x6D,0x7D,0x07,
  7.         0x7F,0x6F,0x77,0x40,        0x39,0x00,0x79,0x71
  8. };
  9. //定义各个数字位的位控制模型
  10. char        code        cDISP_BitMode[4]        =        
  11. {0xEF,0xDF,0xBF,0x7F};
  12. //开始定义全局变量
  13. char        vDISP_Index ;                        //当前在显示哪一位?在中断服务中改变和使用
  14. char        vDISP_SegValue[4];                //当前显示数字对应的字模,该变量在BitNum,Integer,Low,High等函数中进行设置 ,在中断服务程序中进行使用
  15. //char        vDISP_Blink[4];                         //控制哪些位需要闪烁。1:闪烁 0:正常显示。 是在SetBlink函数中进行设置,在中断服务中使用。
  16. //unsigned char        vDISP_BlinkCount;                //闪烁所需要的计数,0~255。<128时隐藏,>128时显示。是在中断服务程序中改变,每次中断+1。

  17. //******************************************



  18. //*******************************************
  19. //初始化函数,初始化全局变量
  20. //*******************************************

  21. void        DISP_Init(void)
  22. {
  23.         TH0        =        0x3C;
  24.         TL0        =        0xBA;

  25.         ET0                =        1;
  26.         EA                =        1;
  27.         TR0                =        1;
  28.         vDISP_Index        =        0;
  29.         vDISP_SegValue[0]        =        cDISP_NumMod[0];
  30.         vDISP_SegValue[1]        =        cDISP_NumMod[0];        
  31.         vDISP_SegValue[2]        =        cDISP_NumMod[0];
  32.         vDISP_SegValue[3]        =        cDISP_NumMod[0];
  33.         //初始化定时器T0,中断频率位200Hz,初始化相关寄存器
  34.         //初始化全局变量
  35. }

  36. //*******************************************
  37. //设置四位数码管上分别需要显示什么数字
  38. //D0 数码0上需要显示的数字,取值范围0~F
  39. //D1 数码0上需要显示的数字,取值范围0~F
  40. //D2 数码0上需要显示的数字,取值范围0~F
  41. //D3 数码0上需要显示的数字,取值范围0~F
  42. //*******************************************
  43. void        DISP_BitNum(char D3,char D2,char D1,char D0,char dp)  //分别改变四位
  44. {
  45.         //根据入口参数D0的值,设定全局变量vDISP_SegValue[3]的值
  46.         //如果D0>0x0F,则不改变当前显示的数字
  47.         //否则使用D0去访问cDISP_NumMod常量,送入vDISP_SegValue[3]         D0-> vDISP_SegValue[3]
  48.   if(D0>0x0F)
  49.    {}
  50.    else           
  51.      vDISP_SegValue[3]        =        cDISP_NumMod[D0];
  52.         //根据入口参数D1的值,设定全局变量vDISP_SegValue[2]的值                 D1-> vDISP_SegValue[2]
  53.     if(D1>0x0F)
  54.    {}
  55.    else         
  56.      vDISP_SegValue[2]        =        cDISP_NumMod[D1];
  57.         //根据入口参数D2的值,设定全局变量vDISP_SegValue[1]的值                 D2-> vDISP_SegValue[1]
  58.    if(D2>0x0F)
  59.    {}
  60.    else         
  61.      vDISP_SegValue[1]        =        cDISP_NumMod[D2];
  62.         //根据入口参数D3的值,设定全局变量vDISP_SegValue[0]的值                 D3-> vDISP_SegValue[0]
  63.    if(D3>0x0F)
  64.    {}
  65.    else         
  66.      vDISP_SegValue[0]        =        cDISP_NumMod[D3];
  67.         switch        (dp)
  68.         {
  69.                 case 0:        break;
  70.                 case 1:        vDISP_SegValue[2]        =        vDISP_SegValue[2]|0x80;break;
  71.                 case 2:        vDISP_SegValue[1]        =        vDISP_SegValue[1]|0x80;break;
  72.                 case 3:        vDISP_SegValue[0]        =        vDISP_SegValue[0]|0x80;break;

  73.         }
  74. }

  75. //*******************************************
  76. //设置4位数码管上需要显示的整数,同时设置4位
  77. //value        需要显示的整数数值,取值范围0~9999
  78. //*******************************************
  79. void        DISP_Integer(long Value,char dp)                                   // 同时改变四位
  80. {
  81.         //如果Value<0,就让其等于0。
  82.         //提取Value的千位存入局部变量D0,提取Value的百位存入D1,提取Value的十位存入D2,提取Value的个位存入D3
  83.         //调用BitNum函数。
  84.         char        D3, D2, D1, D0;
  85.         if        (Value        <        0)
  86.                 Value        =        0;
  87.         if        (Value        >        9999)
  88.         {
  89.                 D0        =        Value        /        1000000;
  90.                 Value        %=        1000000;
  91.                 D1        =        Value        /        10000;
  92.                 Value        %=        10000;
  93.                 D2        =        Value        /        100;
  94.                 D3        =        Value        %        100;        
  95.         }
  96.         else
  97.         {
  98.                 D0        =        Value        /        1000;
  99.                 Value        %=        1000;
  100.                 D1        =        Value        /        100;
  101.                 Value        %=        100;
  102.                 D2        =        Value        /        10;
  103.                 D3        =        Value        %        10;
  104.         }

  105.         DISP_BitNum(D0, D1, D2, D3,dp);

  106. }



  107. //*******************************************
  108. //定时器
  109. //*******************************************
  110. void        DISP_T0_ISR(void)        interrupt        1
  111. {
  112.         //给T0重新载入计数初值
  113.         TH0        = 0x3C;
  114.         TL0        = 0xBA;
  115.         //设置段的控制端口
  116.         P3        =        cDISP_BitMode[vDISP_Index];
  117.          //输出位的控制端口
  118.         P2        =        vDISP_SegValue[vDISP_Index];   //对这句话改变一下就可以实现闪烁


  119.         //改变Index的值,并使其在0~3之间变化。

  120.         vDISP_Index++;
  121.         vDISP_Index        &=        3;

  122.                
  123. }

复制代码

错误程序:
秒表.7z (14.29 MB, 下载次数: 392)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:273227 发表于 2018-1-8 15:16 | 显示全部楼层
汇编的代码

演示代码.rar

14.19 MB, 下载次数: 47, 下载积分: 黑币 -5

回复

使用道具 举报

ID:235240 发表于 2018-1-9 13:21 | 显示全部楼层
谢谢分享,很有用
回复

使用道具 举报

ID:250878 发表于 2018-4-7 13:24 | 显示全部楼层
很有用,谢谢
回复

使用道具 举报

ID:313477 发表于 2018-4-22 01:43 | 显示全部楼层
请问在显示中有问题,不能正常显示秒表
回复

使用道具 举报

ID:305620 发表于 2018-4-25 09:28 | 显示全部楼层
你这显示不了阿
回复

使用道具 举报

ID:426717 发表于 2018-11-15 10:28 | 显示全部楼层
很有用,谢谢
回复

使用道具 举报

ID:457305 发表于 2018-12-29 10:06 | 显示全部楼层
为什么下载不了
回复

使用道具 举报

ID:371538 发表于 2019-1-1 20:40 | 显示全部楼层
为什么显示不出来?
回复

使用道具 举报

ID:371538 发表于 2019-1-1 20:47 | 显示全部楼层
显示出来的数字不对呀,是乱码的。。。
回复

使用道具 举报

ID:298008 发表于 2019-12-27 08:44 | 显示全部楼层
谢谢楼主分享!!!
回复

使用道具 举报

ID:871007 发表于 2021-6-5 00:04 来自手机 | 显示全部楼层
你这个东西连显示的数字都不全
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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