![]() |
發布時間: 2024-1-11 06:50
正文摘要:#include "STC8G.h" #define uint unsigned int #define uchar unsigned char #define FOSC 1105920L //系統頻率 #define BAUD 11520 //串口波特率 uint ADC1_DATA; uchar ADC1_H; uchar ADC1_L; void ... |
wulin 發表于 2024-1-13 06:11 把定時器2修改為定時器1后,可以發送數據了,謝謝 |
hjx5548 發表于 2024-1-12 20:14 首先要說清楚所選用的MCU具體型號,你標題寫STC8G1K0A,在15、16樓又說是STC8G1H08A。實際上你說的型號都不存在。估猜實際型號是STC8G1K08A-PIN8。那么問題就非常明確了。STC8G1K08A只有定時器0和定時器1,沒有定時器2。你用定時器2作波特率發生器怎么能成功? |
wulin 發表于 2024-1-11 22:12 能不能把你的代碼發上來參考一下,STC8H1K08A的8腳單片機,ADC采集是P32。 |
hjx5548 發表于 2024-1-11 14:41 STC8G1H08A-PIN8 單片機的P32 |
wulin 發表于 2024-1-11 22:12 #include "STC8G.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int #define ADCTIM (*(unsigned char volatile xdata *)0xfea8) #define ADC_POWER 0x80 //ADC電源控制位1000 0000 #define ADC_START 0x40 //ADC啟動控制位0100 0000 #define ADC_FLAG 0x20 //ADC完成標志位0010 0000 #define ADC_EPWMT 0x10 //ADC使能控制位0001 0000 #define FOSC 1105920L //系統頻率 #define BAUD 11520 //串口波特率 uint ADC_A,ADC_B; void Delay1ms() //@11.0592MHz { unsigned char i, j; i = 15; j = 90; do { while (--j); } while (--i); } /*----------------------------- 初始化ADC ------------------------------*/ void UartInit() //可變波特率設置 115200bps@11.0592MHz { SCON = 0x50; //8位可變波特率 AUXR |= 0x14; //T2為1T模式 T2L = (65536 - (FOSC/4/BAUD)); //設置波特率重裝值 T2H = (65536 - (FOSC/4/BAUD))>>8; } void send_byte(uchar by) { SBUF = by; while (!TI); TI = 0; } void Init_ADC() { //ADC 控制器 電源 啟動 完成 -- 15通道模擬選擇位 單片機STC8G1K08A-8PIN P30 0000 P31 0001 P32 0010 P33 0011 P54 0100 P55 0101 //ADC_CONTR B7 B6 B5 B4 B3 B2 B1 B0 P_SW2 |= 0x80; //打開 ADCTIM = 0x3f; //設置 ADC 內部時序 P_SW2 &= 0x7f; //關閉 ADCCFG = 0x27; //設置ADC結果右對齊,速度為512系統時鐘 ADC_RES=0; //清除ADC_RES存儲器以前的結果 ADC_RESL=0; ADC_CONTR=ADC_POWER; //ADC 開啟電源 Delay1ms(); //上電延時1ms } /*---------------------------- 讀取ADC結果 ----------------------------*/ uint GetADCResult(uchar CH) { ADC_CONTR=ADC_POWER|ADC_START|CH;//啟動轉換1100 1000 STC8G1K08A-8PIN的CH P30 0000 P31 0001 P32 0010 P33 0011 P54 0100 P55 0101 _nop_();_nop_(); //小延時 while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成標志置位 1010 0000 ADC_CONTR &=~ADC_FLAG; //清完成標志 return ADC_RES<<8|ADC_RESL; //返回十位ADC結果 } void main () { P3M0 = 0x00; P3M1 = 0x04; P5M0 = 0x00; P5M1 = 0x00; Init_ADC(); while(1) { ADC_A=GetADCResult(2); // ADC_B=GetADCResult(1); //添加顯示/控制代碼 send_byte(ADC_A/1000 + 0x30); send_byte(ADC_A%1000/100 + 0x30); send_byte(ADC_A%100/10 + 0x30); send_byte(ADC_A%10 + 0x30); send_byte(0x0a); Delay100ms(); Delay100ms(); Delay100ms(); } } //這個是你以前帖子,加入了串口發送,也是無法發送ADC ,芯片為8腳的STC8G1K08A ,ADC采集口P32 |
設置P32為ADC口,需要修改哪里? |
#define BAUD 11520 //串口波特率,先單獨測試串口吧 |
hjx5548 發表于 2024-1-11 20:37 ![]() |
hjx5548 發表于 2024-1-11 14:41 ADC_CONTR |=0x40;//啟動AD交換 后4位表示采集的通道 ADC0口 P30 0000 P31 0001 P32 0010 P33 0011 P54 0100 P55 0101 |
cocolala 發表于 2024-1-11 09:43 代碼是什么型號單片機? |
hjx5548 發表于 2024-1-11 14:42 上面改過的程序實測串口可以正常發送ADC轉換值。問題可能是你串口中斷與send_byte(uchar by)函數TI處理沖突。 |
wulin 發表于 2024-1-11 10:47 定時器后面還有代碼要用的。先謝謝了 |
cocolala 發表于 2024-1-11 09:43 謝謝啦,有空我試一下 |
用不到的函數屏蔽掉
|