① 求:單片機C52與PC機串口通信完整電路圖,十分感謝!郵箱:[email protected]
單片機C52 PCB 上 有 MAX232 嗎?
有 的話,用串口線 直接連
沒有的話 要 轉換
請看 武漢鴻偉光電
E232TTL RS232/TTL電平無源轉換器
② 求dac0832與51單片機介面電路圖,
我做的濾波器
#include<reg51.h>
#include"math.h"
#defineN25
#definePI3.1415926
sbitda_wr1=P3^6;
sbitda_cs=P2^7;
voidInputWave();
floatFIR();
voidda0832();
floatfHn[N]={0.0,0.0,0.001,-0.002,0.01,-0.09,
-0.018,0.049,-0.02,0.11,0.28,0.64,0.28,
-0.11,-0.02,0.049,-0.018,-0.009,0.01,
-0.002,-0.002,0.001,0.0,0.0
};
floatfXn[N]={0.0};
floatfInput,fOutput;
floatfSignal1,fSignal2;
floatfStepSignal1,fStepSignal2;
floatf2PI;
inti;
floatFIN[256],FOUT[256];
intnIn,nOut;
main(void)
{
nIn=0;nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*1.4;
while(1)
{
//fInput=InputWave();
InputWave();
//FIN[nIn]=fInput;
//nIn++;nIn%=256;
fOutput=FIR();
FOUT[nOut]=fOutput;
nOut++;
if(nOut>=256)
{nOut=0;da0832();
}
}
}
/*floatInputWave()
{
for(i=N-1;i>0;i--)fXn[i]=fXn[i-1];
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;
fSignal1+=fStepSignal1;
if(fSignal1>=f2PI)fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if(fSignal2>=f2PI) fSignal2-=f2PI;
return(fXn[0]);
} */
voidInputWave()
{
inti;
for(i=0;i<=15000;i++)
{
fXn[i]=(sin(PI*2*i/N*15000)+1)*5;
}
}
floatFIR()
{
floatfSum;
fSum=0;
for(i=0;i<N;i++)fSum+=(fXn[i]*fHn[i]);
return(fSum);
}
voidda0832()
{
unsignedchari;
da_cs=0;//da轉換輸出使能標志置位
da_wr1=0;//輸入寄存器的官寫選通信號,表示單片機要傳送數據了
for (i=0;i<255;i++)
P0=FOUT[i];
da_wr1=1;//數據傳送完成,使能鎖存
da_cs=1;
}
③ 51單片機和計算機之間實現串口通信的電路圖
串口通訊參考程序如下:
來源:深入淺出AVR單片機
#include<reg51.h>
unsignedcharUART_RX;//定義串口接收數據變數
unsignedcharRX_flag;//定義穿行接收標記
/*********************************************************************************************
函數名:UART串口初始化函數
調用:UART_init();
參數:無
返回值:無
結果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(佔用)
備註:振盪晶體為12MHz,PC串口端設置[4800,8,無,1,無]
/**********************************************************************************************/
voidUART_init(void){
EA=1;//允許總中斷(如不使用中斷,可用//屏蔽)
ES=1;//允許UART串口的中斷
TMOD=0x20;//定時器T/C1工作方式2
SCON=0x50;//串口工作方式1,允許串口接收(SCON=0x40時禁止串口接收)
TH1=0xF3;//定時器初值高8位設置
TL1=0xF3;//定時器初值低8位設置
PCON=0x80;//波特率倍頻(屏蔽本句波特率為2400)
TR1=1;//定時器啟動
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:UART串口接收中斷處理函數
調用:[SBUF收到數據後中斷處理]
參數:無
返回值:無
結果:UART串口接收到數據時產生中斷,用戶對數據進行處理(並發送回去)
備註:過長的處理程序會影響後面數據的接收
/**********************************************************************************************/
voidUART_R(void)interrupt4using1{//切換寄存器組到1
RI=0;//令接收中斷標志位為0(軟體清零)
UART_RX=SBUF;//將接收到的數據送入變數UART_data
RX_flag=1;//標記接收
//用戶函數內容(用戶可使用UART_data做數據處理)
//SBUF=UART_data;//將接收的數據發送回去(刪除//即生效)
//while(TI==0);//檢查發送中斷標志位
//TI=0;//令發送中斷標志位為0(軟體清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:UART串口發送函數
調用:UART_T(?);
參數:需要UART串口發送的數據(8位/1位元組)
返回值:無
結果:將參數中的數據發送給UART串口,確認發送完成後退出,採用非中斷方式
備註:
/**********************************************************************************************/
voidUART_T(unsignedcharUART_data){//定義串口發送數據變數
ES=0;//禁止穿行中斷
SBUF=UART_data;//將接收的數據發送回去
while(TI==0);//檢查發送中斷標志位
TI=0;//令發送中斷標志位為0(軟體清零)
ES=1;//打開穿行中斷
}
/*********************************************************************************************
函數名:UART串口發送字元串函數
調用:UART_S(?);
參數:需要UART串口發送的數據(8位/1位元組)
返回值:無
結果:將參數中的數據發送給UART串口,確認發送完成後退出,採用非中斷方式
備註:
/**********************************************************************************************/
voidUART_S(unsignedchar*str)
{
while(1)
{
if(*str=='