㈠ 51單片機C語言里 怎樣將16進制 直接化成 10進制
我這兒有一個進制轉換的程序,你可以參考一下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int count=0;
void *tentoBOH(int a,int n)
{
int t,i=0,j,str[50],*p;
char str1[50],*q,temp;
while(a!=0)
{
t=a%n;
if(n==16)
{
if(t<=9&&t>=0)str1[i++]=(char)('0'+t);
if(t>9&&t<16)str1[i++]=(char)('A'-10+t);
}
else
str[i++]=t;
a=a/n;
count++;
}
for(i=0,j=count-1;i<count/2;i++,j--)
{
t=str[i];
str[i]=str[j];
str[j]=t;
temp=str1[i];
str1[i]=str1[j];
str1[j]=temp;
}
if(n==16)
return q=str1;
else
return p=str;
}
int BOHtoTen(char str[],int n)
{
int len,i,a=0;
char t;
len=(int)strlen(str);
for(i=0;i<len/2;i++)
{
t=str[i];
str[i]=str[len-1-i];
str[len-1-i]=t;
}
i=0;
while(str[i]!='\0')
{
if(str[i]>='0'&&str[i]<='9')
a+=(str[i]-'0')*(int)pow(n,i);
if(str[i]>='a'&&str[i]<='f')
a+=(str[i]-'a'+10)*(int)pow(n,i);
if(str[i]>='A'&&str[i]<='F')
a+=(str[i]-'A'+10)*(int)pow(n,i);
i++;
}
return a;
}
void main()
{
int a,i,n,m,*p;
char *q,str[20];
printf("請輸入一個十進制數a= ");
scanf("%d",&a);
printf("請輸入一個進制數n= ");
scanf("%d",&n);
if(n==16)q=tentoBOH(a,n);
else p=tentoBOH(a,n);
printf("輸出正整數%d的%d進制為:",a,n);
if(n==16)
for(i=0;i<count;i++)
printf("%c",*(q+i));
else
for(i=0;i<count;i++)
printf("%d",*(p+i));
printf("\n請輸入字元串str= ");
scanf("%s",str);
printf("\n請輸入該字元串的進制m= ");
scanf("%d",&m);
printf("\n該%d進制數%s轉換成十進制數為:%d\n",m,str,BOHtoTen(str,m));
}
㈡ 單片機C51課程設計 16進制轉為10進制
轉換當然用除10000得到萬位再減去萬位,同理利用上面的數得到千位,百位十位最後的余數就是個位。
抽取後四位難道不是與下0XFFFF搞定嗎
延遲兩秒的話可以用每次按鍵啟動或刷新一個定時器來搞定,至於是在中斷服務程序內搞還是僅僅做個標記就看情
現在情況是你能顯示數字了,那麼你就應該能得到輸入的數字了吧。(方便起見就不用輸入來觸發中斷了)程序主循環結構是:1、定時掃描輸入I/O狀態,定時的作用就是用來做防顫處理的,在間隔幾毫秒的過程後,如果按鍵狀態還是變化了,才表示實際按動過了。2、上面如果檢測到有變化,則將定時器的數字清零,在這個定時器的服務程序里執行將一個標志置位。然後再執行內存中輸入數字的變化,和顯示的內容。3、判斷是否有定時器中斷觸發的標志,有的話就執行將數轉換成BCD碼(就是轉換成10進制數)的過程,並顯示出來。如此就完成了。
至於定時器中斷怎樣搞,和匯編相比,更簡單了,直接初始化定時器的特殊定時器,再在程序里定義中斷服務程序就好了。我估計你的輸入數字還沒能整理,那樣的話在上面的第2步里,的第二個操作中先將原數乘16,再加上後來添的數就OK了,顯示的話直接對這個數進行處理就好了。
㈢ 51單片機c語言十六進制數轉化成十進制數
先轉化為二進制數,再轉換為十進制數。你的Ox0a是寫法上有錯誤,Ox可能是代表8進制數,或是8421BCD碼。具體請查找相應碼表。
㈣ c語言16進制與10進制的轉換
這個函數的int HtoD(char *a);就是將16進制的數用字元數組保存,把數組首地址作為參數傳遞給函數,函數返回轉換後的10進制整型數值。
詳細說明,我寫在備注里了,你看以參考。
#include<stdio.h>
#include<string.h>
intHtoD(char*a)//將16進制的數字用字元串保存,並將字元串首地址作為參數傳遞
{
intnum=0,i;
for(i=0;i<strlen(a);i++)//迭代迭代次數為a數組的長度形參a是指針,初值是指向字元數組的首地址,也就是指向16進制數字的左邊第1位
{
//每次迭代取指針指向的地址值進行判斷,同時指針不斷往右移動
if(*(a+i)>='0'&&*(a+i)<='9')//如果當前位是0~9的數字,那麼總數值num累加同時前值*16(因為左邊是高位,從高位往低位數,每多1位高位就*16)
num=num*16+*(a+i)-'0';
elseif(*(a+i)>='A'&&*(a+i)<='Z')//如果當前位是大寫字母A~Z,轉換成10進制數值,再累加
num=num*16+*(a+i)-'A'+10;
elseif(*(a+i)>='a'&&*(a+i)<='z')//如果當前位是小寫字母a~z,轉換成10進制數值,再累加
num=num*16+*(a+i)-'a'+10;
else
return-1;//表示輸入錯誤的數
}
returnnum;
}
intmain()
{
chara[]="1F";
printf("1F=%d",HtoD(a));//這里我寫了簡單的調用,列印結果:1F=31
return0;
}
㈤ c語言中16進制轉換為十進制
最簡單的使用scanf()函數和printf()函數進行格式轉換,以16進制格式輸入,再以10進制格式輸出。
程序代碼如下:
#include<stdio.h>
int main()
{
int a=0;
int i=0;
scanf("%x",&a);
printf("%d",a);
return 0;
}
運行結果:
(5)單片機c語言16進制轉10進制擴展閱讀:
scanf函數與printf函數的用法很像,都是以格式化的形式進行操作,例如上述程序中scanf("%x", &a);就是將輸入數據以十六進制格式存儲到變數a中。
"%x"是將字元串A23CD以十六進制形式輸入a中,如果將"%x"換成為"%d"的話,就是將字元串A23CD以十進制形式輸入a中,這顯然是錯誤的,因為將A23CD轉換為十進制的時候,無法解析A,CD等字元,所以得出的結果就是錯誤的。
㈥ 單片機C語言 十六進制轉換為十進制
8位的十六進制數temp(0~255)
百位 =temp/100;
temp=temp%100;//取余數
shi=temp/10;
ge=temp%10;
16位的也是一樣,只是先除以10000
㈦ 在單片機C語言怎麼把16進制數變成10進制發到串口
串口都是用16進制發送的,有兩種辦法,
在接收到數據之後你把16進制轉為10進制就可以了,比如你發送的十進制10,傳送的時是十六進制0x0A,接收到數據後轉成10進制 0AH = 10。
在發送時把數據轉換成BCD碼,發送十進制10,轉成BCD碼十六進制就是0x10,接收到數據時顯示的就是10H。
BCD碼轉換網路一下可以。
㈧ 的51單片機中c語言中如何將十六進制數轉化為十進制
如果你僅僅是使用轉換結果的話,那麼賦值語句可以自動轉換。比如:
unsigned
char
x,y;
y=0x5a;
x=y;
你輸出格式是10進制,那麼變數表示的就是十進制數。
㈨ c語言十六進制轉十進制方法
可以用<stdlib.h> 中的char*_itoa(intvalue,char*string,intradix);把整型轉換為其他進制的字元串參考代碼:
int main(){int a=110;char p;_itoa(110,p,16); //16表示16進制,還可以用2、8、10printf("%s",p);return 0;}
GCC,GNU組織開發的開源免費的編譯器,MinGW,Windows操作系統下的GCC,Clang,開源的BSD協議的基於LLVM的編譯器。
(9)單片機c語言16進制轉10進制擴展閱讀:
運算符號:
比較特別的是,比特右移(>>)運算符可以是算術(左端補最高有效位)或是邏輯(左端補 0)位移。例如,將 11100011 右移 3 比特,算術右移後成為 11111100,邏輯右移則為 00011100。因算術比特右移較適於處理帶負號整數,所以幾乎所有的編譯器都是算術比特右移。
運算符的優先順序從高到低大致是:單目運算符、算術運算符、關系運算符、邏輯運算符、條件運算符、賦值運算符(=)和逗號運算符。