把讀取0832的高8位更改為temp1|=DO;沒有問題,但把讀取低8位更改為temp2|=DO;不行。
因為讀取DO的是位數據要放在temp2的最高位。如堅持這種寫法就要把DO移到高位,
并且要把DO強制轉換成char。如:temp2|=((char)DO<<7);,這就顯得多此一舉了。
函數解釋:
- //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,
- //本函數是模擬0832的串行協議進行的
- unsigned char ad0832read(bit ch)
- {
- uchar i,Data1=0,Data2=0;
- CLK=0; //時鐘置低平
- DO =1; //開始信號為高電平
- CS =0; //片選信號置低,啟動AD轉換芯片
- CLK=1; //輸入開始信號(構成一個正脈沖),時鐘上升沿,輸入開始信號
- CLK=0; //時鐘下降沿
- //模擬信號輸入模式選擇(1:單模信號,0:雙模差分信號)
- DO =1;
- CLK=1; //時鐘上升沿,輸入開始信號
- CLK=0; //時鐘下降沿
- //模擬信號輸入通道選擇(1:通道CH1,0:通道CH0)
- DO =ch; //選擇通道0
- CLK=1; //時鐘上升沿,輸入開始信號
- CLK=0; //時鐘下降沿
- DO =1; //數據線置高,準備接收數據
- for(i=0;i<8;i++) //從高位移入數據
- {
- CLK=1;
- CLK=0; //時鐘下降沿,AD0832輸出數據,高位(MSB)先
- Data1=Data1<<1;
- if(DO==1)
- Data1=Data1|0x01; //數據左移位,補0 ,如果數據為“1”,移入1, 如果數據為“0”,移入0,
- }
- for(i=0;i<8;i++) //從低位移入數據
- {
- Data2=Data2>>1;
- if(DO==1)
- Data2=Data2|0x80; //數據右移位,補0,如果數據為“1”,移入1如果數據為“0”,移入0,
- CLK=1;
- CLK=0; //時鐘下降沿,AD0832輸出數據,高位(MSB)先
- }
- //數據線置高,釋放總線,完成一次轉換
- CLK=1;
- DO =1;
- CS =1;
- return (Data1==Data2)?Data1:0; // 如果相等輸出data1 or 0
- }
復制代碼 |