❶ 51單片機程序修改
現在,你顯示的是num1,其范圍是0~60。
可以把它的上限,改為30,這就符合你的要求了。
另外再增加一個變數num2,其范圍是0~60。
用它來控制紅綠黃的交替變化,即可。
voiddisplay(ucharge,ucharshi)
{
if(num2<=25){P1=0xfe;}
elseif(num2<=30){P1=0xff;delay(2);P1=0xfd;}
elseif(num2<=60){P1=0xfb;}
……
}
……
voidtime0()interrupt1
{
TH1=(65536-5000)/256;//--應該是TH0=...
TL1=(65536-5000)%256;//--應該是TL0=...
num++;
if(num==10){
num=0;
num1++;
if(num1==30)num1=0;//用於顯示秒數
shi=num1/10;
ge=num1%10;
num2++;
if(num2==60)num2=0;//用於控制變換
}
}
❷ 單片機定時器中斷改變全局變數
int h1,m1,s1; //時分秒全局變數
int tt; //定時器0進入中斷的次數
void main()
{
init(); //初始化
while(1)
{
display(h1,m1,s1);
}
}
void dingshi0() interrupt 1 //定時器0中斷
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
s1++; //秒數+1
if(s1==60){ s1=0; m1++;}//計滿60秒分位進1,秒位清0
if(m1==60){ m1=0; h1++; }//計滿60分時位進1
if(h1==24){ h1=0; }//計滿24小時時位清0
}
}
在中斷內,你可以直接寫成這樣
只用全局變數更方便
再有,你苦惱的問題是因為函數每次調用的時候
都是以0為數據傳遞的,錯誤在串口初始化部分以及你調用函數的時候
你的變數S,沒有全局變數聲明,切也沒有局部變數聲明
所以每次調用函數的時候,S都是以0開始,最多加到1,之後又從0開始遞增
❸ 單片機中有一個整型變數,如何給它賦值。
嘿嘿 俺來幫你解答
1 先在片內RAM中定義一個字變數(裝整型數據 16位數) 再傳送數據(先傳送低8位 再傳送高8位)
2 參考程序:
IN16 DATA 40H ;在片內RAM中定義一個整型變數 40H單元為低旅宴8位 41H單元為高做數8位
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV IN16,#12H ;將數據1234H傳送拆胡銀給整型變數
MOV IN16+1,#34H
呵呵 滿意就給 滿意回答吧
❹ 51單片機如何設置數組變數
因為,51單片機的位地址,只能直接定址,不能間接定址。
所以,51單片機的位地址,就不能用數組來進行操作。
不過,可以利用邏輯運算,進行位操作。
先定義一個數組:a[8] = [128, 64,...8, 4, 2, 1];
然後:P1 |= a[3]; ,這就是令 P1.3 置一。
其實,採用數組的方法,並非是最簡單的。
直接:P1 |= (1 << 3); ,就可以了。
❺ 在單片機C語言中如何對變數的某一位進行操作或賦值。
在C語言中,一般有兩種方法來操作位,一種是使用C語言提供的位運算操作符,一種是使用位域。
1、使用位域
在C語言中定義位域的一般格式如下:
struct位域結構名
{位域列表};
struct:在C語言中定義位域所使用的關鍵字是struct。
位域結構名:是一個C語言中的標識符,有字母、數字、下劃線組成,而且第一個字元必須是字母或者下劃線。
位域列表:組其中位域列表的形式為: 類型說明符 位域名:位域長度
下面的示例代碼,通過位域來計算IEEE754浮點數編碼中單精度數的最大值 、最小值和最小弱規范數。
#include<stdio.h>
typedefstructFP_SINGLE
{
unsigned__int32fraction:23;
unsigned__int32exp:8;
unsigned__int32sign:1;
}fp_single;
intmain()
{
floatx;
fp_single*fp_s=(fp_single*)&x;
fp_s->sign=0;
fp_s->exp=0xfe;
fp_s->fraction=0x7fffff;
printf("float最大數:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0x1;
fp_s->fraction=0x0;
printf("float最小數:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0;
fp_s->fraction=0x1;
printf("float最小弱規范數:%le ",(double)x);
return0;
}
2、使用位運算符
C語言中的位運算符有一個基本的常識,即只能操作整數,不能操作浮點數,因為浮點數是使用IEEE754編碼的,使用位操作數沒有任何意義。
C語言提供的位運算符列表:
&按位與如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0
|按位或兩個相應的二進制位中只要有一個為1,該位的結果值為1
^按位異或若參加運算的兩個二進制位值相同則為0,否則為1
~取反~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1變0
<<左移用來將一個數的各二進制位全部左移N位,右補0
>>右移將一個數的各二進制位右移N位,移到右端的低位被舍棄,對於無符號數,高位補0
❻ 怎麼從單片機外部改變單片機中程序的變數
直接修改程序中的變數,危謹兆險性很清櫻大呢,要是改錯了位元組讓指令變成非法的,那程序就亂祥正租套了。最好是把那些變數分離出來單獨放在一個地方,比如24C02存儲器,這樣修改方便。