伊莉討論區

標題: 電子存錢筒89S51程式 計數器 [打印本頁]

作者: 打發時間拉    時間: 2010-10-20 09:27 PM     標題: 電子存錢筒89S51程式 計數器

我要做一個電子存錢筒 89S51程式  

我的電子存錢筒有4孔 然後用微動 投入該孔就自動累積加1

目前我有一個程式是只有1個PORT加一個微動開關及兩個7447兩個七段顯示器 計數 最多到99個

我目前還需要有3個PORT 及三個微動開關  請問一下這樣程式怎麼打  有誰可以幫我修改

[attach]46497863[/attach] 這個是我們的電路圖



[attach]46497867[/attach]



這程式碼只有1個PROT 然後他的微動開關是接在P3_7  我目前要有4個微動開關及4個分別的計數器 這計數器是要分開計數的 辦推 單晶高手 可幫我修改   我聽我同學說 不能複製P1那個而修改PORT的名稱 因為 while(1)他裡面有設定  所以如果用複製更改P 這樣會中斷 會卡住
希望高手能幫忙


程式碼

#include <AT89X51.H>
void delayms(unsigned int time);
unsigned char hextobcd(unsigned char hex);
main()
{

unsigned char k=0;
P1=0;

while(1)
{
delayms(20);
while(P3_7==1);

k++;
if(k==100) k=0;

P1=hextobcd(k);


delayms(20);
while(P3_7==0);
}
}


unsigned char hextobcd(unsigned char hex)
{
unsigned char n10;
unsigned char n1;
unsigned char bcd;

n10=hex / 10;
n1=hex % 10;
bcd= (n10<<=4) | n1;
return bcd;
}


void delayms(unsigned int time)
{
unsigned int n;
while(time>0)
{
n=120;
while(n>0) n--;
time--;
}
}
作者: 滄浪水    時間: 2010-10-20 11:07 PM

本帖最後由 滄浪水 於 2010-10-20 11:18 PM 編輯

因為你的原程式看來就有點怪
程式一進入while(1) loop, 就會一直累加k, 等於100後歸零, 然後把 k 送到 p1 輸出
除了 p3.7 on 時程式會 while(P3_7==1); 這一行, 直到 p3.7 off
所以上一篇我才要你把功能再弄清楚

下面的程式可能比較接近你附上的流程圖
  1. while(1)
  2. {
  3.      delayms(20);
  4.      if(P3_7==0) continue;
  5.      k++;
  6.      if(k==100) k=0;
  7.      P1=hextobcd(k);
  8.      delayms(20);
  9.      while(P3_7==0);
  10. }
複製代碼

作者: Force[TW]    時間: 2010-10-21 12:29 AM

本帖最後由 Force[TW] 於 2010-10-21 01:54 PM 編輯
我要做一個電子存錢筒 89S51程式  

我的電子存錢筒有4孔 然後用微動 投入該孔就自動累積加1

目前我有 ...
打發時間拉 發表於 2010-10-20 09:27 PM


【相關文章】:[作業]89s51(兩位計數器)有1個PORT 還要在3個 修改 拜託(我說明詳細)
【規格書】:AT89C51(datasheetcatalog.com)
【原始碼說明】:由於我手邊沒有硬體設備,所以下方原始碼沒有實測過,請自行實測以下原始碼,並依需求進行修改。還有,累計用的變數有四個,即 k1 k0 k2 k3,這意思是七段必須再加六個,假如你只維持使用原先的兩個七段,而且沒有更改七段接的埠(PORT),那麼請把以下的 k1 k0 k2 k3 這四個變數名稱全都改為 k 一個變數即可,當你改為 k 一個變數時,要注意 hextobcd 設定的埠(PORT)也必須是同一個,也就是原先的 P1。
  1. main()
  2. {
  3. //
  4. // 它是利用變數去累計
  5. unsigned char k1 = 0;
  6. unsigned char k0 = 0;
  7. unsigned char k2 = 0;
  8. unsigned char k3 = 0;
  9. //
  10. // 四個埠全部設零
  11. P1 = 0;
  12. P0 = 0;
  13. P2 = 0;
  14. P3 = 0;
  15. //
  16. // 以下四個埠是分開的
  17. // 必須等到其中一個微動放開
  18. // 才會掃描所有的按鍵
  19. while(1)
  20. {
  21.   //
  22.   // 避開接點反彈跳
  23.   delayms(20);
  24.   //
  25.   // 新增 if 判斷式
  26.   if ( P3_7 != 0 )
  27.   {
  28.    k1 ++;
  29.    if( k1 == 100 )
  30.    {
  31.     k1 = 0;
  32.    }
  33.    P1 = hextobcd(k1);
  34.    delayms(20);
  35.    while( P3_7 != 1 );
  36.   }
  37.   //
  38.   // 以下是其他三個埠
  39.   // 以下三個判斷式同上
  40.   if ( P3_6 != 0 )
  41.   {
  42.    k0 ++;
  43.    if( k0 == 100 )
  44.    {
  45.     k0 = 0;
  46.    }
  47.    P0 = hextobcd(k0);
  48.    delayms(20);
  49.    while( P3_6 != 1 );
  50.   }
  51.   if ( P3_5 != 0 )
  52.   {
  53.    k2 ++;
  54.    if( k2 == 100 )
  55.    {
  56.     k2 = 0;
  57.    }
  58.    P2 = hextobcd(k2);
  59.    delayms(20);
  60.    while( P3_5 != 1 );
  61.   }
  62.   if ( P3_4 != 0 )
  63.   {
  64.    k3 ++;
  65.    if( k3 == 100 )
  66.    {
  67.     k3 = 0;
  68.    }
  69.    P3 = hextobcd(k3);
  70.    delayms(20);
  71.    while( P3_4 != 1 );
  72.   }
  73. }
  74. }
複製代碼

作者: 打發時間拉    時間: 2010-10-25 06:12 PM

回復 3# Force[TW]


   阿那麼請問你一下 !!  你那是一部分程式?  所有程式是否如下
#include <AT89X51.H>
void delayms(unsigned int time);
unsigned char hextobcd(unsigned char hex);
main()

{

//

// 它是利用變數去累計

unsigned char k1 = 0;

unsigned char k0 = 0;

unsigned char k2 = 0;

unsigned char k3 = 0;

//

// 四個埠全部設零

P1 = 0;

P0 = 0;

P2 = 0;

P3 = 0;

//

// 以下四個埠是分開的

// 必須等到其中一個微動放開

// 才會掃描所有的按鍵

while(1)

{

  //

  // 避開接點反彈跳

  delayms(20);

  //

  // 新增 if 判斷式

  if ( P3_7 != 0 )

  {

   k1 ++;

   if( k1 == 100 )

   {

    k1 = 0;

   }

   P1 = hextobcd(k1);

   delayms(20);

   while( P3_7 != 1 );

  }

  //

  // 以下是其他三個埠

  // 以下三個判斷式同上

  if ( P3_6 != 0 )

  {

   k0 ++;

   if( k0 == 100 )

   {

    k0 = 0;

   }

   P0 = hextobcd(k0);

   delayms(20);

   while( P3_6 != 1 );

  }

  if ( P3_5 != 0 )

  {

   k2 ++;

   if( k2 == 100 )

   {

    k2 = 0;

   }

   P2 = hextobcd(k2);

   delayms(20);

   while( P3_5 != 1 );

  }

  if ( P3_4 != 0 )

  {

   k3 ++;

   if( k3 == 100 )

   {

    k3 = 0;

   }

   P3 = hextobcd(k3);

   delayms(20);

   while( P3_4 != 1 );

  }

}

}

unsigned char hextobcd(unsigned char hex)
{
unsigned char n10;
unsigned char n1;
unsigned char bcd;

n10=hex / 10;
n1=hex % 10;
bcd= (n10<<=4) | n1;
return bcd;
}


void delayms(unsigned int time)
{
unsigned int n;
while(time>0)
{
n=120;
while(n>0) n--;
time--;
}
}



再問你一下 !! 要怎麼在那程式軟體裡測試 是否有功能??  可請教我一下嗎?
作者: Force[TW]    時間: 2010-10-25 08:45 PM

回復  Force[TW]


   阿那麼請問你一下 !!  你那是一部分程式?  所有程式是否如下
#include
void d ...
打發時間拉 發表於 2010-10-25 06:12 PM


對啊!就是一部分程式呀!我就是只改 main 函式而已。
你們應該有上 C/C++ 的課程吧!你怎麼會不知道那是一部分程式碼?
作者: kc172880    時間: 2012-5-5 01:04 PM

提示: 作者被禁止或刪除 內容自動屏蔽




歡迎光臨 伊莉討論區 (http://a17.eyny.com/) Powered by Discuz!