找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1099|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

C語(yǔ)言程序怎樣知道另一變量加1并跟隨加1

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:965189 發(fā)表于 2025-5-8 12:33 來(lái)自觸屏版 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
51單片機(jī)C程序,怎樣知道另一個(gè)變量a在加一。如果a加1,b也加1。如果a停止加1,b也停止并退出。怎樣寫(xiě)?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:332444 發(fā)表于 2025-5-8 13:33 | 只看該作者
用狀態(tài),+1同時(shí)賦值狀態(tài),跟隨后狀態(tài)取消.
回復(fù)

使用道具 舉報(bào)

板凳
ID:1121801 發(fā)表于 2025-5-8 13:43 | 只看該作者
定義變量x,x=a,然后在后面需要b+1的程序之前用a-x==1作為條件,再在b+1語(yǔ)句后加一條x=a,納入a-x==1條件中.
回復(fù)

使用道具 舉報(bào)

地板
ID:68189 發(fā)表于 2025-5-8 13:43 | 只看該作者
常規(guī)思維: 定時(shí)器中斷函數(shù)中添加:   if(b!=a)  b=a;  這樣變量b的值永遠(yuǎn)追隨a  
回復(fù)

使用道具 舉報(bào)

5#
ID:1109793 發(fā)表于 2025-5-8 14:36 | 只看該作者
在加一,說(shuō)的是多久?
比如1秒,那么先TMP=A,每秒鐘IF(A==TMP+1){B++;TMP = A;}ELSE IF(A==TMP)RETURN;
如果一秒內(nèi)沒(méi)變化或者加了大于1,就退出,退出就是啥也不做,意思就是B沒(méi)有變化。
周期很重要,可以0.1秒,也能1天。
回復(fù)

使用道具 舉報(bào)

6#
ID:583948 發(fā)表于 2025-5-8 15:04 | 只看該作者
volatile unsigned char a = 0; // 使用volatile防止優(yōu)化
unsigned char b = 0;
unsigned char last_a = 0;

void main() {
    while(1) {
        if (a != last_a) { // 檢測(cè)a是否變化
            b++; // 同步增加b
            last_a = a; // 更新舊值
        }
    }
}
回復(fù)

使用道具 舉報(bào)

7#
ID:69038 發(fā)表于 2025-5-8 15:46 | 只看該作者
char A,B;
char OA;

  //外部引入
回復(fù)

使用道具 舉報(bào)

8#
ID:69038 發(fā)表于 2025-5-8 15:49 | 只看該作者
if (OA !=A)
  {
    if (OA=A+1){OA=A;B++;}
    if(OA!=A+1){OA=A;}
}
回復(fù)

使用道具 舉報(bào)

9#
ID:1130698 發(fā)表于 2025-5-8 21:06 | 只看該作者
你這個(gè)需求是怎么來(lái)的?不可以直接使用變量a嗎?
回復(fù)

使用道具 舉報(bào)

10#
ID:1149928 發(fā)表于 2025-5-8 21:25 | 只看該作者
C語(yǔ)言不太好做,要么利用中斷檢測(cè),檢測(cè)到a的值變化就觸發(fā)一次中斷然后b+1;要么使用輪詢的方法,一直循環(huán)查詢a是否加一。如果你是用FPGA就好辦很多,將a作為always的邊沿觸發(fā)條件,里面b+1。
回復(fù)

使用道具 舉報(bào)

11#
無(wú)效樓層,該帖已經(jīng)被刪除
12#
ID:1149962 發(fā)表于 2025-5-9 10:03 | 只看該作者
int a = 0; int a_pre = 0; int b;  void test() {     while(1)     {         if(a_pre != a)         {             break;         }         else             b++;         a_pre++;      // 定義一個(gè)變量和a同時(shí)自加         a++;          // 模擬a自加的操作,如果這里a不自加了,a_pre和a就不相等了。     }     return ; }
回復(fù)

使用道具 舉報(bào)

13#
ID:965189 發(fā)表于 2025-5-12 22:09 | 只看該作者
多謝上面各位的回復(fù)和指導(dǎo)。還是用了原來(lái):if(b!=a)b=a;之前使用達(dá)不到要求,是因?yàn)楹罄m(xù)配套部分不合理,修改后達(dá)到了要求的效果。
回復(fù)

使用道具 舉報(bào)

14#
ID:1109793 發(fā)表于 2025-5-13 08:40 | 只看該作者
君工創(chuàng) 發(fā)表于 2025-5-12 22:09
多謝上面各位的回復(fù)和指導(dǎo)。還是用了原來(lái):if(b!=a)b=a;之前使用達(dá)不到要求,是因?yàn)楹罄m(xù)配套部分不合理,修 ...

B==A,不用動(dòng)
否則B=A,那不就是直接B=A就行了?
回復(fù)

使用道具 舉報(bào)

15#
ID:1150350 發(fā)表于 2025-5-13 15:26 | 只看該作者
下面是一個(gè) 51 單片機(jī) C 程序,它可以檢測(cè)變量a是否在加 1,并相應(yīng)地控制變量b的變化。程序通過(guò)定時(shí)器定期采樣a的值,比較兩次采樣的結(jié)果來(lái)判斷a是否在持續(xù)加 1。
#include <reg51.h>

// 定義全局變量
unsigned int a = 0;        // 被監(jiān)測(cè)的變量
unsigned int b = 0;        // 跟隨變化的變量
unsigned int a_prev = 0;   // 存儲(chǔ)a的上一次采樣值
bit a_increasing
= 0;      // 標(biāo)記a是否在增加

// 定時(shí)器0初始化函數(shù)
void Timer0_Init() {
    TMOD
|= 0x01;          // 設(shè)置定時(shí)器0為模式1(16位定時(shí)器)
    TH0
= 0xFC;           // 定時(shí)初值設(shè)置,定時(shí)約1ms
    TL0
= 0x66;
    ET0
= 1;              // 使能定時(shí)器0中斷
    EA
= 1;               // 開(kāi)總中斷
    TR0
= 1;              // 啟動(dòng)定時(shí)器0
}

// 定時(shí)器0中斷服務(wù)函數(shù)
void Timer0_ISR() interrupt 1 {
    TH0
= 0xFC;           // 重新加載定時(shí)初值
    TL0
= 0x66;
   
    // 檢測(cè)a是否增加
    if (a > a_prev) {
        if (a == a_prev + 1) {
            // a增加了1
            a_increasing
= 1;
            b
++;          // b跟隨a加1
        } else {
            // a增加了超過(guò)1,可能是重置或其他操作
            a_increasing
= 0;
        }
    } else {
        // a沒(méi)有增加
        a_increasing
= 0;
    }
   
    a_prev
= a;           // 更新a的上一次采樣值
}

// 主函數(shù)
void main() {
    Timer0_Init();        // 初始化定時(shí)器0
   
    while(1) {
        // 主循環(huán)可以執(zhí)行其他任務(wù)
        // 當(dāng)a_increasing變?yōu)?時(shí),b將停止增加
        // 可以在這里添加退出條件的處理
        if (!a_increasing && b > 0) {
            // b已經(jīng)停止增加,可以執(zhí)行退出操作
            // 例如關(guān)閉外設(shè)、保存數(shù)據(jù)等
            // 這里只是簡(jiǎn)單示例,實(shí)際應(yīng)用中可能需要更復(fù)雜的處理
            break;        // 退出主循環(huán)
        }
    }
   
    // 程序結(jié)束后的處理
    while(1);             // 進(jìn)入死循環(huán),保持程序在此處
}

這個(gè)程序的工作原理如下:
1. 使用定時(shí)器 0 每 1ms 產(chǎn)生一次中斷,在中斷服務(wù)函數(shù)中檢測(cè)變量a的變化。
2. 每次中斷時(shí),將當(dāng)前的a值與上一次保存的值比較:
◦ 如果a增加了 1,則b也加 1,并設(shè)置a_increasing標(biāo)志為 1。
◦ 如果a沒(méi)有增加或增加超過(guò) 1,則設(shè)置a_increasing標(biāo)志為 0。
3. 主循環(huán)中檢查a_increasing標(biāo)志,當(dāng)標(biāo)志變?yōu)?0 且b已經(jīng)開(kāi)始增加時(shí),程序可以執(zhí)行退出操作。
回復(fù)

使用道具 舉報(bào)

16#
ID:1138534 發(fā)表于 2025-5-13 18:16 | 只看該作者
在 51 單片機(jī) C 語(yǔ)言編程中,如果你想讓變量 b 跟隨變量 a 的自增(即只有在 a 增加時(shí),b 才增加),并且當(dāng) a 停止增加時(shí) b 停止并退出循環(huán),關(guān)鍵在于檢測(cè)變量 a 是否發(fā)生變化。  說(shuō)明了如何實(shí)現(xiàn)這個(gè)邏輯: #include <reg51.h>  void main() {     unsigned int a = 0;     unsigned int b = 0;     unsigned int last_a = 0;      while (1) {         if (a != last_a) {  // 說(shuō)明a發(fā)生了變化             b++;            // b 跟著加 1             last_a = a;     // 更新上一次的 a 值         } else {             break;          // a 沒(méi)有變化,退出循環(huán)         }          // 在這里模擬 a 的自增,比如:         // a++;  // 如果不模擬自增,可以用外部中斷或串口輸入來(lái)控制     }      // 循環(huán)結(jié)束,程序可以繼續(xù)做其他事情     while (1);  // 停在這里 }
回復(fù)

使用道具 舉報(bào)

17#
ID:965189 發(fā)表于 2025-5-13 21:02 | 只看該作者
xiaobendan001 發(fā)表于 2025-5-13 08:40
B==A,不用動(dòng)
否則B=A,那不就是直接B=A就行了?

我不是要它相等,我要知道它是加1了。
回復(fù)

使用道具 舉報(bào)

18#
ID:1109793 發(fā)表于 2025-5-14 07:27 | 只看該作者
君工創(chuàng) 發(fā)表于 2025-5-13 21:02
我不是要它相等,我要知道它是加1了。

那萬(wàn)一加了2呢
回復(fù)

使用道具 舉報(bào)

19#
ID:879809 發(fā)表于 2025-5-14 22:40 | 只看該作者
李曉楠 發(fā)表于 2025-5-13 15:26
下面是一個(gè) 51 單片機(jī) C 程序,它可以檢測(cè)變量a是否在加 1,并相應(yīng)地控制變量b的變化。程序通過(guò)定時(shí)器定期 ...

你的代碼有很大的隱患,8位單片機(jī)int是16位的,所以a++不是原子操作,舉例來(lái)說(shuō)a=255,a++分兩步,1)低位++產(chǎn)生carry,2)高位+carry。如果在兩步中間發(fā)生中斷,你讀到的a的值是0,會(huì)引發(fā)程序行為異常。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表