欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC12C2052AD單片機芯片中關于AD轉換的相關內容
[打印本頁]
作者:
chinayanhui
時間:
2020-3-1 16:55
標題:
STC12C2052AD單片機芯片中關于AD轉換的相關內容
使用芯片自帶的AD轉換器,按芯片說明書中提供的典型線路圖連接方案。發現使用查詢方式AD轉換沒有問題,獲取的輸出轉換電壓和實際輸入電壓,大約相差正負0.2V左右。但是使用中斷方式,僅在芯片上電觸發一次,然后就不動了。代碼也檢查了N多遍,真心看不出還有什么問題。請問各位大神遇到過這種問題嗎?該芯片測得的直流電壓會相差這么多嗎?誰用過這款芯片?
單片機代碼如下:
#include <intrins.h>
#include <STC12C2052AD.H>
#include "UART.H"
volatile uint8 COMMAND;
#define ADC_POWER 0x80 // 1000 0000
#define ADC_FLAG 0x10 // 0001 0000
#define ADC_START 0x08 // 0000 1000
#define ADC_SPEEDLL 0x00 // 0000 0000
#define ADC_SPEEDL 0x20 // 0010 0000
#define ADC_SPEEDH 0x40 // 0100 0000
#define ADC_SPEEDHH 0x60 // 0110 0000
// 延時函數
void Delay(uint16 n)
{
uint16 x;
while(n--)
{
x = 5000;
while(x--);
}
}
// AD中斷(這里出現問題,上電觸發一次,然后就不再觸發)
void AdcISR() interrupt 5
{
ADC_CONTR &= ~ADC_FLAG;
PutChar(ADC_DATA);
// 開始下一次轉換
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 6 | ADC_START;
Delay(10);
}
// 初始化AD
void InitAdc()
{
P1 = P1M0 = P1M1 = 0xFF; // 將所有P1口全部設置為開漏(Open Drain)
ADC_DATA = 0;
// 清空DA轉換的結果
//ADC_CONTR = ADC_POWER | ADC_SPEEDHH;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 6 | ADC_START;
Delay(10);
}
// 查詢方式獲取AD的值
uint8 GetAdcResult()
{
ADC_CONTR = ADC_POWER | ADC_SPEEDHH | 6 | ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG));
// 清空位
ADC_CONTR &= ~ADC_FLAG;
// 返回轉換結果
return ADC_DATA;
}
// 軟件延時500ms
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
InitUART(); // 初始化串口
InitAdc(); // 初始化ADC
// 中斷方式使用AD,使用查詢方式時,注釋下面兩行
AUXR |= 0x10;
IE = 0xB0; // 芯片說明書上給出的是0xA0,會將串口通訊的中斷屏蔽,這里我改為了0xB0
while(1)
{
;
// 查詢方式使用AD,中斷方式注釋下面兩行
// Delay500ms();
// PutChar(GetAdcResult());
}
}
復制代碼
作者:
wulin
時間:
2020-3-1 17:56
沒有看到開總中斷和開ADC中斷
作者:
chinayanhui
時間:
2020-3-1 18:03
剛剛發完帖后,又仔細的檢查了一下代碼。發現這個問題可能是中斷造成的。因為我在中斷響應程序中調用了將數據發送到串口的操作,這種操作會觸發串口發送數據完成的中斷。
我將中斷程序改為如下:
void AdcISR() interrupt 5
{
ADC_CONTR &= ~ADC_FLAG;
PutChar(0xFF);
PutChar(0xFE);
PutChar(ADC_DATA);
// 開始下一次轉換
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 6 | ADC_START;
}
復制代碼
在串口調試工具中發現接收窗僅打印了一個FF,然后就不動了。
查詢手冊發現,雖然沒有設置串口優先級寄存器的情況下,同級的串口中斷的優先級比AD優先執行,但是串口中斷并不會打斷AD中斷的執行。所以程序就停止在了putchar中,因為putchar會等待串口中斷執行完成將TI設置為0才往下執行。
所以,在主函數中將串口中斷的優先級提高一級就可以正常工作了。
void main()
{
// 中斷方式使用AD,使用查詢方式時,注釋下面兩行
PS = 1;
AUXR |= 0x10;
IE = 0xB0; // 芯片說明書上給出的是0xA0,會將串口通訊的中斷屏蔽,這里我改為了0xB0
//PADC_SPI = 1; // 高優先級
InitUART(); // 初始化串口
InitAdc(); // 初始化ADC
while(1)
{
;
// 查詢方式使用AD,中斷方式注釋下面兩行
// Delay500ms();
// PutChar(GetAdcResult());
}
}
復制代碼
作者:
chinayanhui
時間:
2020-3-1 18:06
wulin 發表于 2020-3-1 17:56
沒有看到開總中斷和開ADC中斷
謝謝您,我的問題已經解決了。開AD中斷是
AUXR |= 0x10;
IE = 0xB0;
開總中斷在是InitUART中做了。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1