久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2773|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产中的精品av涩差av | 欧美成人免费在线 | 国产亚洲精品久久久久久牛牛 | 日韩精品亚洲专区在线观看 | 久久网一区二区三区 | 亚洲精品一区二区在线观看 | 91成人在线| 91精品国产综合久久久久久漫画 | 欧美日韩一区在线 | 美女三区| 成人精品鲁一区一区二区 | 国产一级淫片免费视频 | 久久综合久 | 亚州精品天堂中文字幕 | 国产高清视频在线观看播放 | 免费毛片www com cn | 亚洲日本乱码在线观看 | 久久精品国产v日韩v亚洲 | 午夜天堂精品久久久久 | 久久网国产 | 国产精品久久久久久久久 | 成人欧美一区二区三区色青冈 | 99综合| 综合一区二区三区 | 国产精品中文字幕在线观看 | 亚洲精品自拍 | 一区二区伦理电影 | 中文字幕一区在线观看视频 | 国产亚洲www| 成人毛片视频免费 | 国产农村妇女毛片精品久久麻豆 | 殴美成人在线视频 | 国产精品一区网站 | 狠狠操av | 日韩和的一区二区 | 久久99精品久久久久久 | 国产视频2021 | 麻豆一区一区三区四区 | 亚洲高清av在线 | 精品欧美黑人一区二区三区 | 日韩一二区 |