1. 基於msp430單片機的ADC0809模數轉換的c語言程序
今天看了一上午的ADC,原理好像理清楚了,但是一到編程的時候,犯蒙了....這是我寫的程序,總感覺哪裡不對勁,但又說不上來...拿出來,但願能給你啟示,也希望要是你想明白了,回頭給我點提示,呵呵...先謝謝了。(我是研究MSP430的新手,希望多多向大家學習!)
#include <msp430x20x3.h>
void int_clk() //系統時鍾初始化
{
unsigned int i;
BCSCTL1&=~XT2OFF; //打開XT振盪器
BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M
do
{
IFG1 &= ~OFIFG; //清除振盪錯誤標志
for(i = 0; i < 100; i++)
_NOP(); //延時等待
}
while ((IFG1 & OFIFG) != 0); //如果標志為1繼續循環等待
IFG1&=~OFIFG;
}
void delay(unsigned int itimelenFirst,unsigned int itimelenSecond) //延時程序
{
unsigned int i,j;
for(i=0;i<itimelenFirst;i++)
{
for(j=0;j<itimelenSecond;j++);
}
}
void main()
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |=0xfd;
//初始化adc
P1OUT &=~ 0x01; //START 復位
P1OUT &=~ 0x04; //0E 復位
P1OUT &=~ 0x08; //CLOCK 復位
P1OUT &=~ 0x10; //ALE 復位,關閉地址選擇
while(1)
{
P1OUT |= 0x01; //START 上升沿
P1OUT |= 0x10; //打開地址選擇
delay(10,1000); //延時以清空逐次逼近寄存器SAR,並將轉換結束信號EOC變為低電平
P1OUT &=~ 0x01; //START 下降沿,啟動ADC開始轉換
P1OUT &=~ 0x10; //關閉地址選擇
for(int i=0;i<8;i++) //P1.3為ADC提供CLOCK脈沖信號
{
delay(60;1000);
P1OUT ^= 0x08;
}
do
{
P1OUT &=~ 0x04;
}
while((P1IN &0x02)==0) //判斷轉換是否結束
//轉換結束後
P1OUT |= 0x04; //轉換所得數據出現在輸出端
}
}
2. 求大神把下面ADC0808A/D模數轉換匯編改成C語言
首先你沒有給電路連接圖,僅憑匯編中的地址很難想像,下面只有使用偽代碼表示,控制介面自行定義了。假設可以位定址。
int seg_table[]={0x3F,0x06,...};//數碼管的表
GPIO(start) = 0;//啟動,低電平有效
while(!EOC);//等待轉換完成
LED = DATA;//讀入數據,LED顯示
int temp = DATA;
delay_ms();
int i =0;
while(temp)
{
an = temp&0x0f;
temp >>= 4;
GPIO(an) = 0;
GPIO(an) = seg_table[an];
GPIO(an) = 0;
wei = i++;
GPIO(wei) = 0;
GPIO(wei) = wei;
delay_ms();
}
對於串列發送很簡單,
for(i= 0;i<8;i++)
{
GPIO_BITx = DATA&0x01;
ATA >>= 1;
}
3. C語言中的數學符號如何表示(大全)
abs(計算整型數的絕對值)
相關函數 labs, fabs
表頭文件 #include<stdlib.h>
定義函數 int abs (int j)
函數說明 abs()用來計算參數j的絕對值,然後將結果返回。
返回值 返回參數j的絕對值結果。
範例 #ingclude <stdlib.h>
main(){
int ansert;
answer = abs(-12);
printf("|-12| = %d\n", answer);
}
執行 |-12| = 12
/*---------------------------------*/
exp(計算指數)
相關函數 log,log10,pow
表頭文件 #include<math.h>
定義函數 double exp(double x);
函數說明 exp()用來計算以e為底的x次方值,即ex值,然後將結果返回。
返回值 返回e的x次方計算結果。
附加說明 使用GCC編譯時請加入-lm。
範例 #include<math.h>
main()
{
double answer;
answer = exp (10);
printf("e^10 =%f\n", answer);
}
執行 e^10 = 22026.465795
/*-----------------------------------*/
sqrt(計算平方根值)
相關函數 hypotq
表頭文件 #include<math.h>
定義函數 double sqrt(double x);
函數說明 sqrt()用來計算參數x的平方根,然後將結果返回。參數x必須為正數。
返回值 返回參數x的平方根值。
錯誤代碼 EDOM 參數x為負數。
附加說明 使用GCC編譯時請加入-lm。
範例 /* 計算200的平方根值*/
#include<math.h>
main()
{
double root;
root = sqrt (200);
printf("answer is %f\n",root);
}
執行 answer is 14.142136
/*--------------------------------*/
fabs(計算浮點型數的絕對值)
相關函數:abs
表頭文件:#include<math.h>
定義函數:double fabs(double x);
函數說明:fabs()用來計算浮點型數x的絕對值,然後將結果返回。
返回值:返回參數x的絕對值計算結果
#include <math.h>
main()
{
double answer;
answer=fabs(-3.141592);
printf("|-3.141592|=%f\n",answer);
}
執行結果
|-3.141592|=3.141592
4. C++中的模數是什麼意思 啊
相似的很多,相同很少,c++兼容c,但是加入很多面向對象的功能
5. 51單片機c語言,ADC模數轉換的問題
對於這個,要這么看:
假設中斷A是優先順序高的中斷,中斷B是優先順序低的中斷
如果在正常執行的過程中,發生中斷A,那麼,中斷A執行完成後,會返回正常程序;
如果在正常執行過程中,發生中斷B,又在中斷B處理過程中發生中斷A,那麼,中斷A執行完成後,一定要返回的是中斷B,這是由硬體決定的,不是軟體決定的,所以,軟體沒有任何指令可以讓中斷A執行完成後直接跳過還沒有執行完的中斷B而直接回到主程序,因為這是硬體決定的,軟體做不到,即便你在高級中斷A中關閉了中斷B,但是因為你原來的中斷B還沒有執行完,所以,仍然要把沒執行完的部分執行下去,才能返回到正常程序.
對於ARM系列的可以,對於51來說,是不行的,因為51軟體指令不允許修改PC寄存器的值
6. c語言中1%2等於多少
首先我們要理解的是%在c語言中是什麼運算。在c語言中,%指的是取余數。
有了以上知識作為鋪墊,我們來看一下1%2結果到底是什麼。
1除以2,商是0,余數是1,所以1%2的結果是1。
拓展資料:
關於「/」的「%」的總結
除法運算符「/」。二元運算符,具有左結合性。參與運算的量均為整型時,結果為整型,捨去小數。如果運算量中有一個為實型,結果為雙精度實型。
求余運算符「%」,二元運算符,具有左結合性。參與運算的量均為整型。
求余運算的結果等於兩個數相除後的余數。
「%」取模運算符還有一些小的應用,例如:
①當你想要通過rand()獲得隨機數時,rand()%100;產生0-99的隨機數。
假如要產生16-59之間的數,可以這樣寫:rand()%44+16(這里44由59-16+1得到)。
rand()%44 即可獲得0-43的隨機數,再加上16即可得到16-59的隨機數了;
②除了第一點以外,「%」運算還通常用於N進制的轉換。例如:
如果是二進制轉換,那麼就可以通過/與%的結合使用則可以得到轉換之後的二進制數了(其實就是短除法)
當原數被除至剩餘0時,它的上一次模數就是最高位進制數。
30(10)->11110(2)/與%的結合使用通常都可用於獲得最低位數又或者獲得所需的某位數。例如:
「/」通常可以去掉尾數,而「%」通常都用於獲得尾數。
7. C語言康輝老師模的問題
「模」是「Mod」的音譯,模運算多應用於程序編寫中。 Mod的含義為求余。
這個數是16位0的補碼
2的8次方=256是在八位時的情況
望採納
另外你的問題描述很亂啊
8. 為什麼用c語言求余求模來把兩位數分離,和賦定時初值
求余和求模操作,在C語言中實際上是同一個操作,即模除運算,符號為%.
a%b其含義為:求a除以b所得余數。
在C語言中,可以使用整型模除和除法配合,來獲取兩位數的個位和十位。
其原理為如下。
對於兩位數x,如果其個位數為b,十位數為a,(0<=a,b<=9)寫成ab的形式,其真值為10a+b。
於是求x的個位數的表達式可以寫成x%10,是因為
x%10 = (10a+b)%10=10a%10+b%10=0+b=b
這里用到了模除相關知識。
對於10a,一定是a的倍數,所以,10a對10取餘一定為0。
而b為0到9的數字,比10小,對10取余時值為本身。
x/10 = (10a+b)/10 = 10a/10 +b/10=a+0 = a
這里用到的是整型除法的知識。
10a/10=a和b/10=0
其中,b<10,對於整型,除法結果只取整數部分,於是b/10=0.
通過以上推理,可以得到,對於10進制二進制數x,x/10為十位數,而x%10為個位數。
至於提問中的賦定時初值,這個沒有要求一定用模除或除法。但有時會要求分段做初始化。比較常見的有兩種。
1 系統為提高效率,或其他的原因,對定時器介面做了分別的封裝,而使其適用於不同量級的定時。比如分別封裝為毫秒級別的和秒級別的。
這樣對於一個超過一秒且帶有毫秒數的定時,就需要分化為秒級和毫秒級兩部分。比如2500毫秒,就需要分化成2秒+500毫秒的形式。
基於兩位數取各個位的同樣原理,對於時間x,可以得到計算秒的表達式為x/1000, 同時計算毫秒的表達式為x%1000。
2 系統對定時器的設置為寄存器形式,分為高位和低位。
以雙位元組16位寄存器為例,對於時間x,可以寫成高位為x/256,和低位為x%256的格式。
事實上,這種寫法是低效的,C語言提供的更高效的位操作同樣可以實現該目的,即
低位為x&0xFF, 高位為((unsigned short)x>>8)&0xFF。由於本項操作與提問關系不大,所以不對其原理進行介紹了。
9. C語言中的模數
1、你把原題貼一下會說的更清楚些;
2、原問題中「商和模數」是一起說的,「商」應該是整除的得數,模數就是整除的余數;
10. C語言模數1e9 + 7是什麼意思
1e9 是科學計數法
表示1乘10的9次冪
然後再加7
表示浮點數
1000000007