![]() |
發布時間: 2023-8-8 16:32
正文摘要:#include<STC8G.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int uint ADC1_DATA; uchar ADC1_H; uchar ADC1_L; sbit fan=P1^4; void delayms(uint xms) &nbs ... |
STC8G1K08 此型號有8,16,20腳的,你用的那一個? |
樓主應該去STC官網找例子。 |
STC單片機的源碼有問題,樓主的代碼是有問題的,ADC1_DATA=ADC1_H*256+ADC1_L;這一句有問題,ADC1_H是8位的,ADC1_H*256會數據溢出,ADC1_H*256永遠=0,應該改成:ADC1_DATA=(uint)ADC1_H*256+ADC1_L;數據溢出是單片機初學者最容易犯的錯誤。 |
復制了源碼用不了 |
選擇“左對齊”方式,直接取ADC_RES值就夠用了,ADC_RESL的可以忽略——如你的應用不是高精尖的話。 |
單片機不是這么學的,除非你是天才 你得一步一步的來,先學會進制,寄存器,高電平低電平之類的,再去學一些比較深入的東西 你先思考100遍,哪怕你的思路全是錯誤,那對你來說,也是有用的 有些東西實在沒辦法,再來提問 比如,PID,FOC之類,這種東西,不借助他人,完全自己去擼代碼,實在是太難了 像你這個問題,其實就是一個數據存放格式問題而已,并不存在什么難度可言 |
1.ADC1_H為什么要乘256?是因為8位嗎?這個是10位的AD轉換,為什么不直接取10位? 計算機是按字節讀、存儲數據的,一個字節8位。尤如每個抽屜放8顆豆子,你要取9,10,11……16。都必須開兩個抽屜,而且取豆的是匙子也只裝8個,不裝其它數。 2.ADCCFG=0X2F;格式是右對齊,這8位是取的D9-D2還是D7-D0? ADC是10位數,可是必須用16位去存放,存放的方式有N種,其中: 最容易被接受的是前面作0:000000XX,XXXXXXXX。 次容易被接受的是后面作0:XXXXXXXX,XX000000。 不容易被接受的是:胡亂放。如果這樣做,又要被你不解和笑話了。 ADCCFG是變量?還是特殊寄存器? 變量=2F,則與ADC無關。 特殊寄存器=2F,你要去查ADCCFG的含義。 3.ADC1_DATA=ADC1_H*256+ADC1_L;這句程序怎么理解? 現在這樣放了:000000XX,XXXXXXXX。這是兩個字節拼成的數。 你將它倆拼成ADC1_DATA,希望得到一個0-65535之間的數,不這樣做你有何高見呢? ADC1_DATA是編譯平臺的認知(為了符合你的習慣認知),它是幾進制的數,由你定義。 在CPU內部,它是由兩個字節組成。在編譯平臺,它由你決定。 4.如果我想在采集到電壓是2.5V的時候去啟動風扇,程序該怎么寫? 事先計算一下,2.5V對應的ADC采樣值是多少,假設是:ADC1_H=A,ADC1_L=B。 那么當你在讀到此采樣值時,就去啟動風扇。 讀書太少了,實在不想看書,改行罷。 |
1.8位芯片的寄存器都是8位,10位數據需要用兩個寄存器儲存 2.兩個寄存器儲存10位數據可以右對齊也可以左對齊 3.ADC1_H*256就是<<8?梢詫慉DC1_DATA = ADC1_H<<8 | ADC1_L;。MCU只能處理2進制數據,C語言代碼可以用10進制或16進制表述。經編輯器編輯后的機器語言都是2進制。 4.如果不需要顯示電壓值,2.5V電壓(VCC=5V)經10位ADC采集ADC1_DATA=512。if(ADC1_DATA>=512) fan=1;else fan=0; |