找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2502|回复: 4
打印 上一主题 下一主题
收起左侧

想实现数码管30秒倒计时,可是数码管一直显示30。是怎么回事?

[复制链接]
跳转到指定楼层
楼主
ID:677928 发表于 2020-4-12 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

找不出原因,请求教。
代码如下:
  1. #include <reg52.h>

  2. #define DIG_PORT P0
  3. #define unchar unsigned char
  4. #define uint unsignde int

  5. sbit gA = P2^2;        // 38译码器输入口A
  6. sbit gB = P2^3;        // 38译码器输入口B
  7. sbit gC = P2^4;        // 38译码器输入口C

  8. int t,seccnt,msta,tzsta;
  9. int m=0,n,t;
  10. char shi,ge,s=30;

  11. unsigned char code gDuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  12. 0x7f,0x6f};

  13. void ini()//定时器
  14. {
  15. seccnt=0;        
  16. msta=tzsta=0;
  17. TMOD=0x01;
  18. TH0=0xFF;
  19. TL0=0x9C;
  20. TR0=1; //开启定时器0

  21. }

  22. void delay(int p)
  23. {
  24. while(p--);
  25. }

  26. void DigDisplayTest(t,n)
  27. {
  28. switch (t)        //位选,选择点亮哪个数码管
  29. {
  30. case 0:
  31. gA = 1; gB = 1; gC = 1;
  32. break;        //显示第0位
  33. case 1:
  34. gA = 0; gB = 1; gC = 1;
  35. break;        //显示第1位
  36. case 2:
  37. gA = 1; gB = 0; gC = 1;
  38. break;        //显示第2位
  39. case 3:
  40. gA = 0; gB = 0; gC = 1;
  41. break;        //显示第3位
  42. case 4:
  43. gA = 1; gB = 1; gC = 0;
  44. break;        //显示第4位
  45. case 5:
  46. gA = 0; gB = 1; gC = 0;
  47. break;        //显示第5位
  48. case 6:
  49. gA = 1; gB = 0; gC = 0;
  50. break;        //显示第6位
  51. case 7:
  52. gA = 0; gB = 0; gC = 0;
  53. break;        //显示第7位
  54. default:
  55. break;        
  56. }
  57. DIG_PORT = gDuanMa[n];        // 发送段码
  58. delay(1000); // 间隔一段显示时间
  59. DIG_PORT = 0x00;        // 消隐,注意不要漏掉了
  60. }

  61. void work0()
  62. {        
  63. shi=s/10;
  64. ge=s%10;
  65. if(m==10000)
  66. {        
  67. s--;
  68. m=0;
  69. }
  70. DigDisplayTest(6,shi);
  71. DigDisplayTest(7,ge);
  72. }

  73. void main()
  74. {
  75. ini();//初始化

  76. while(1)//闭环
  77. {        
  78. while(TF0==0);//启动主循环        
  79. TL0=0x9C;
  80. TH0=0xFF;
  81. TF0=0;
  82. m++;
  83. work0();
  84. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:70069 发表于 2020-4-12 22:32 | 只看该作者
void interruptTimer0() interrupt 1
{
        TL0 = 0x9C;                //设置定时初值
        TH0 = 0xFF;                //设置定时初值
        m++;
}

void main()
{
ini();//初始化

while(1)//闭环
{        

work0();
}
这样试试
回复

使用道具 举报

板凳
ID:213173 发表于 2020-4-13 06:58 | 只看该作者
错误比较多,逐条语句对比会有收获。
  1. #include <reg52.h>

  2. #define DIG_PORT P0
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit gA = P2^2;        // 38译码器输入口A
  6. sbit gB = P2^3;        // 38译码器输入口B
  7. sbit gC = P2^4;        // 38译码器输入口C

  8. //int t,seccnt,msta,tzsta;
  9. uint m=0,n,t;
  10. uchar shi,ge,s=30;
  11. bit i=0;
  12. unsigned char code gDuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  13. 0x7f,0x6f};

  14. void ini()//定时器
  15. {
  16. //seccnt=0;        
  17. //msta=tzsta=0;
  18. TMOD=0x01;
  19. TL0 = 0x18;                //设置定时初值1ms
  20. TH0 = 0xFC;                //设置定时初值1ms
  21. TR0=1; //开启定时器0
  22. }

  23. void delay(int p)
  24. {
  25. while(p--);
  26. }

  27. void DigDisplayTest(t,n)
  28. {
  29. switch (t)        //位选,选择点亮哪个数码管
  30. {
  31. case 0:
  32. gA = 1; gB = 1; gC = 1;
  33. break;        //显示第0位
  34. case 1:
  35. gA = 0; gB = 1; gC = 1;
  36. break;        //显示第1位
  37. case 2:
  38. gA = 1; gB = 0; gC = 1;
  39. break;        //显示第2位
  40. case 3:
  41. gA = 0; gB = 0; gC = 1;
  42. break;        //显示第3位
  43. case 4:
  44. gA = 1; gB = 1; gC = 0;
  45. break;        //显示第4位
  46. case 5:
  47. gA = 0; gB = 1; gC = 0;
  48. break;        //显示第5位
  49. case 6:
  50. gA = 1; gB = 0; gC = 0;
  51. break;        //显示第6位
  52. case 7:
  53. gA = 0; gB = 0; gC = 0;
  54. break;        //显示第7位
  55. default:
  56. break;        
  57. }
  58. DIG_PORT = gDuanMa[n];        // 发送段码
  59. delay(100); // 间隔一段显示时间
  60. DIG_PORT = 0x00;        // 消隐,注意不要漏掉了
  61. }

  62. void work0()
  63. {        
  64. shi=s/10;
  65. ge=s%10;
  66. if(m==1000)
  67. {        
  68. m=0;
  69. if(s>0)//约束至0
  70. s--;
  71. }
  72. }

  73. void main()
  74. {
  75.         ini();//初始化
  76.         while(1)//闭环
  77.         {        
  78.                 if(TF0);//查询TF0     
  79.                 {
  80.                         TL0 = 0x18;                //设置定时初值1ms
  81.                         TH0 = 0xFC;                //设置定时初值1ms
  82.                         TF0=0;
  83.                         m++;
  84.                         work0();
  85.                 }
  86.                 i=~i;
  87.                 if(i)
  88.                 DigDisplayTest(6,shi);
  89.                 else
  90.                 DigDisplayTest(7,ge);
  91.         }
  92. }
复制代码
回复

使用道具 举报

地板
ID:677928 发表于 2020-4-13 19:56 | 只看该作者
wulin 发表于 2020-4-13 06:58
错误比较多,逐条语句对比会有收获。

谢谢,我昨天自己找到出错的地方了
我将消影放到函数前面,然后发现可以显示,但是数码管光暗淡
然后在work0里的函数前调整了一下语句的位置
就可以实现了,猜可能是切到下一个函数的时候太快,给它一个语句的缓冲时间就好了
  1. void DigDisplayTest(t,n)
  2. {
  3. DIG_PORT = 0x00;        // 消隐提前
  4. switch (t)        //位选,选择点亮哪个数码管
  5. {
  6. case 0:
  7. gA = 1; gB = 1; gC = 1;
  8. break;        //显示第0位
  9. case 1:
  10. gA = 0; gB = 1; gC = 1;
  11. break;        //显示第1位
  12. case 2:
  13. gA = 1; gB = 0; gC = 1;
  14. break;        //显示第2位
  15. case 3:
  16. gA = 0; gB = 0; gC = 1;
  17. break;        //显示第3位
  18. case 4:
  19. gA = 1; gB = 1; gC = 0;
  20. break;        //显示第4位
  21. case 5:
  22. gA = 0; gB = 1; gC = 0;
  23. break;        //显示第5位
  24. case 6:
  25. gA = 1; gB = 0; gC = 0;
  26. break;        //显示第6位
  27. case 7:
  28. gA = 0; gB = 0; gC = 0;
  29. break;        //显示第7位
  30. default:
  31. break;        
  32. }
  33. DIG_PORT = gDuanMa[n];        // 发送段码
  34. delay(1000); // 间隔一段显示时间

  35. }

  36. void work0()
  37. {        
  38. if(m==10000)
  39. {        
  40. s--;
  41. m=0;
  42. }
  43. shi=s/10;
  44. DigDisplayTest(6,shi);
  45. ge=s%10;
  46. DigDisplayTest(7,ge);
  47. }
复制代码
回复

使用道具 举报

5#
ID:677928 发表于 2020-4-13 20:02 | 只看该作者
wulin 发表于 2020-4-13 06:58
错误比较多,逐条语句对比会有收获。

同时也修改了delay函数,因为影响到定时器了,将delay改成定时器计时了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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