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

QQ登錄

只需一步,快速開始

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

關(guān)于STC8G1K08單片機(jī)ADC電壓采集程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
  1. #include<STC8G.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uint ADC1_DATA;
  6. uchar ADC1_H;
  7. uchar ADC1_L;
  8. sbit fan=P1^4;
  9. void delayms(uint xms)                        
  10. {
  11.    uint a,b;
  12.    for(a=xms;a>0;a--)
  13.     for(b=700;b>0;b--);
  14. }
  15. void UartInit()    //
  16. {
  17. SCON = 0x50;
  18. T2L = 0xe8; //65536-11059200/115200/4=0FFE8H
  19. T2H = 0xff;
  20. AUXR = 0x15; //
  21. ES = 1; //
  22. EA = 1;

  23. }
  24. void send_byte(uint by)
  25. {
  26.         TI=0;
  27.         SBUF=by  ;
  28.         while(!TI);
  29.         TI=0;

  30. }
  31. void UART1_Isr() interrupt 4
  32. {
  33.   uint temp;
  34.         if(RI)
  35.         {
  36.           RI=0;
  37.                 temp=SBUF;
  38.         }
  39.         else
  40.         {
  41.           TI=0;             //Çå³ýTIλ
  42.         }
  43. }
  44. void main()
  45. {
  46. P0M0 = 0x00;
  47. P0M1 = 0x00;
  48. P1M0 = 0x10; //0001 0000
  49. P1M1 = 0x00; //0000 0000
  50. P2M0 = 0x00;
  51. P2M1 = 0x00;
  52. P3M0 = 0x00;
  53. P3M1 = 0x00;
  54. P4M0 = 0x00;
  55. P4M1 = 0x00;
  56. P5M0 = 0x00;
  57. P5M1 = 0x00;
  58.   
  59.         fan=0;
  60.         UartInit();
  61.         P0M0=0X00;
  62.         P0M1=0X08;
  63.         
  64.         P_SW2|=0X80;
  65.         ADCTIM=0X3F;
  66.         P_SW2&=0X7F;
  67.         
  68.         ADCCFG=0X2F;
  69.         ADC_CONTR=0X80;
  70.         
  71. while (1)
  72. {
  73.                ADC_CONTR|=0X43;
  74.                 delayms(1);
  75.                 while(!(ADC_CONTR&0X20));
  76.                 ADC_CONTR&=~0X20;
  77.                 ADC1_H=ADC_RES;
  78.                 ADC1_L=ADC_RESL;

  79.                     ADC1_DATA=ADC1_H*256+ADC1_L;
  80.          
  81.                    send_byte(ADC1_DATA/1000+0X30);
  82.                     send_byte(ADC1_DATA%1000/100+0X30);
  83.                     send_byte(ADC1_DATA%100/10+0X30);
  84.                     send_byte(ADC1_DATA%10+0X30);
  85.                                                          
  86.               send_byte(0X0A);
  87.               delayms(100);
  88. }
  89. }
復(fù)制代碼
這個(gè)程序是在網(wǎng)上找的。通過(guò)串口可以收到數(shù)據(jù),經(jīng)過(guò)計(jì)算和采集的電壓一致:
例如收到數(shù)據(jù)0100 通過(guò)計(jì)算:100*5.09(MCU電壓)/1024≈0.5V
有幾個(gè)問(wèn)題不明白:
1.ADC1_H為什么要乘256?是因?yàn)?位嗎?這個(gè)是10位的AD轉(zhuǎn)換,為什么不直接取10位?
2.ADCCFG=0X2F;格式是右對(duì)齊,這8位是取的D9-D2還是D7-D0?


3.ADC1_DATA=ADC1_H*256+ADC1_L;這句程序怎么理解?得到的ADC1_DATA是幾進(jìn)制的數(shù),大概格式是怎樣的?
4.如果我想在采集到電壓是2.5V的時(shí)候去啟動(dòng)風(fēng)扇,程序該怎么寫?


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2023-8-8 21:01 | 只看該作者
1.8位芯片的寄存器都是8位,10位數(shù)據(jù)需要用兩個(gè)寄存器儲(chǔ)存
2.兩個(gè)寄存器儲(chǔ)存10位數(shù)據(jù)可以右對(duì)齊也可以左對(duì)齊
3.ADC1_H*256就是<<8?梢詫慉DC1_DATA = ADC1_H<<8 | ADC1_L;。MCU只能處理2進(jìn)制數(shù)據(jù),C語(yǔ)言代碼可以用10進(jìn)制或16進(jìn)制表述。經(jīng)編輯器編輯后的機(jī)器語(yǔ)言都是2進(jìn)制。
4.如果不需要顯示電壓值,2.5V電壓(VCC=5V)經(jīng)10位ADC采集ADC1_DATA=512。if(ADC1_DATA>=512) fan=1;else  fan=0;
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2023-8-9 09:09 | 只看該作者
1.ADC1_H為什么要乘256?是因?yàn)?位嗎?這個(gè)是10位的AD轉(zhuǎn)換,為什么不直接取10位?
計(jì)算機(jī)是按字節(jié)讀、存儲(chǔ)數(shù)據(jù)的,一個(gè)字節(jié)8位。尤如每個(gè)抽屜放8顆豆子,你要取9,10,11……16。都必須開兩個(gè)抽屜,而且取豆的是匙子也只裝8個(gè),不裝其它數(shù)。

2.ADCCFG=0X2F;格式是右對(duì)齊,這8位是取的D9-D2還是D7-D0?
ADC是10位數(shù),可是必須用16位去存放,存放的方式有N種,其中:
最容易被接受的是前面作0:000000XX,XXXXXXXX。
次容易被接受的是后面作0:XXXXXXXX,XX000000。
不容易被接受的是:胡亂放。如果這樣做,又要被你不解和笑話了。
ADCCFG是變量?還是特殊寄存器?
變量=2F,則與ADC無(wú)關(guān)。
特殊寄存器=2F,你要去查ADCCFG的含義。

3.ADC1_DATA=ADC1_H*256+ADC1_L;這句程序怎么理解?
現(xiàn)在這樣放了:000000XX,XXXXXXXX。這是兩個(gè)字節(jié)拼成的數(shù)。
你將它倆拼成ADC1_DATA,希望得到一個(gè)0-65535之間的數(shù),不這樣做你有何高見(jiàn)呢?
ADC1_DATA是編譯平臺(tái)的認(rèn)知(為了符合你的習(xí)慣認(rèn)知),它是幾進(jìn)制的數(shù),由你定義。
在CPU內(nèi)部,它是由兩個(gè)字節(jié)組成。在編譯平臺(tái),它由你決定。

4.如果我想在采集到電壓是2.5V的時(shí)候去啟動(dòng)風(fēng)扇,程序該怎么寫?
事先計(jì)算一下,2.5V對(duì)應(yīng)的ADC采樣值是多少,假設(shè)是:ADC1_H=A,ADC1_L=B。
那么當(dāng)你在讀到此采樣值時(shí),就去啟動(dòng)風(fēng)扇。

讀書太少了,實(shí)在不想看書,改行罷。
回復(fù)

使用道具 舉報(bào)

地板
ID:401564 發(fā)表于 2023-8-9 22:14 | 只看該作者
單片機(jī)不是這么學(xué)的,除非你是天才
你得一步一步的來(lái),先學(xué)會(huì)進(jìn)制,寄存器,高電平低電平之類的,再去學(xué)一些比較深入的東西
你先思考100遍,哪怕你的思路全是錯(cuò)誤,那對(duì)你來(lái)說(shuō),也是有用的
有些東西實(shí)在沒(méi)辦法,再來(lái)提問(wèn)
比如,PID,FOC之類,這種東西,不借助他人,完全自己去擼代碼,實(shí)在是太難了
像你這個(gè)問(wèn)題,其實(shí)就是一個(gè)數(shù)據(jù)存放格式問(wèn)題而已,并不存在什么難度可言
回復(fù)

使用道具 舉報(bào)

5#
ID:69038 發(fā)表于 2023-8-11 10:30 | 只看該作者
選擇“左對(duì)齊”方式,直接取ADC_RES值就夠用了,ADC_RESL的可以忽略——如你的應(yīng)用不是高精尖的話。
回復(fù)

使用道具 舉報(bào)

6#
ID:586915 發(fā)表于 2023-11-23 19:10 | 只看該作者
復(fù)制了源碼用不了
回復(fù)

使用道具 舉報(bào)

7#
ID:491577 發(fā)表于 2023-11-25 00:40 | 只看該作者
STC單片機(jī)的源碼有問(wèn)題,樓主的代碼是有問(wèn)題的,ADC1_DATA=ADC1_H*256+ADC1_L;這一句有問(wèn)題,ADC1_H是8位的,ADC1_H*256會(huì)數(shù)據(jù)溢出,ADC1_H*256永遠(yuǎn)=0,應(yīng)該改成:ADC1_DATA=(uint)ADC1_H*256+ADC1_L;數(shù)據(jù)溢出是單片機(jī)初學(xué)者最容易犯的錯(cuò)誤。
回復(fù)

使用道具 舉報(bào)

8#
ID:1034262 發(fā)表于 2023-11-25 21:37 | 只看該作者
樓主應(yīng)該去STC官網(wǎng)找例子。
回復(fù)

使用道具 舉報(bào)

9#
ID:57657 發(fā)表于 2023-11-25 22:02 | 只看該作者
STC8G1K08 此型號(hào)有8,16,20腳的,你用的那一個(gè)?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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