『壹』 pic單片機串列通信收發字元串的問題!高分求助!
我把你的程序做了些修改,並在PROTEUS中模擬,是正確的,圖中的上面是模擬的發送,我輸入了「HowAreYou?"並按回車鍵,單片機收到回車後,先輸出"OK!!!"及回車,再把收到的數回送出去。
這里加了宏定義。有些內容請見北航的《PIC16系列單片機C程序設計與PROTEUS模擬》一書。
#include<pic.h>
__CONFIG(0x3F31);
#defineucharunsignedchar
#defineuintunsignedint
//宏定義,發送一個數,並等等發送完畢
#defineSEND_ONE(A)
TXREG=A;
while(!TRMT)
bitFLAG=0; //標志位,如收到回車字元,此位為1
ucharN=0; //接收數據累計
ucharDD[20]; //接收數據存放在此
constucharDD1[7]="OK!!!"; //雖然只有6個字元,但要用7個單元,最後一個為結束字元,const表示存放在程序存儲器中的常數
voidinit(void);
voidinterruptISR(void);
voidmain()
{ uchari;
init();
while(1)
{ if(FLAG)
{ for(i=0;i<6;i++) //先發送「OK!!!」
{ SEND_ONE(DD1[i]);
}
SEND_ONE(0x0D); //發送一個回車
for(i=0;i<N;i++)
{ SEND_ONE(DD[i]);
}
FLAG=N=0; //重新清0,為下次接收做准備
}
};
}
voidinit()
{
TRISC=0xff; //這里要把高二位設置這輸入,但在以下的串口使能後,系統自動將RC6變成通信輸出
TXSTA=0x24;
RCSTA=0x90;
SPBRG=25; //9600波特率
GIE=1;
PEIE=1;
RCIE=1; //打開中斷
}
voidinterruptISR(void)
{
if(RCIE&&RCIF) //不必清RCIF,因為接收數據後RCIF自動清0
{ DD[N]=RCREG;
if(DD[N]==0x0D)
FLAG=1; //如果收到回車,標志位置1
N++;
if(N>=20)
N=0; //如果接收數據數超出,從0存放
}
}
『貳』 pic單片機串列非同步通信的C程序,發送郵箱[email protected],謝謝了!
我這里把北航的<PIC16系列單片機C程序設計與PROTEUS模擬>一書的例4.15發在這里,這個例子是二個單片機之間的非同步通信,主機每按一下按鍵,就把數發出,人機接收到就把數在LED上顯示出來.因此這個例子有發送和接收二種.個人認為這本書值得你看的.給的圖和程序都是所附光碟中的.
主機的程序:
//非同步串列通信發送,按一下按鍵RB0,發送一個位元組,從20H開始發送
#include<pic.h>
//__CONFIG(0x3F71); //運行用
__CONFIG(0x3F39); //調試用
#defineLED RB1
voidDELAY(unsignedint); //延時(i)ms
voidCSH(void); //初始化程序
//宏定義,發送一個數,並等待其發送結束
#defineSEND_ONE(a)
TXREG=a;
while(TRMT==0)
charaaa;
main(void)
{
CSH();
aaa=0x20; //發送的第一個數
LED=0;
while(1);
}
//======延時(n)ms
voidDELAY(unsignedintn)
{ unsignedintj;
chark;
for(j=0;j<n;j++)
for(k=246;k>0;k--)NOP();
}
//======初始化程序
voidCSH(void)
{ TRISB=0B00000001; //RB0為按鍵輸入
TRISC=0B11100000;
TRISD=0; //D口全為輸出,接LED
PORTD=0;
INTCON=0B10010000; //RB0中斷使能
SPBRG=25; //波特率9600,高速,8位數據
RCSTA=(0b10010000);
TXSTA=(0b00100100);
}
//======//中斷服務程序
voidinterruptINT_ISR(void)
{ charx;
if(INTF) //按鍵RB0中斷,LED3閃一下,蜂鳴器響
{ LED=1;
SEND_ONE(aaa);
PORTD=aaa;
aaa++; //發送的數加1,為下次發送做准備
DELAY(100);
LED=0;
INTF=0;
}
}
從機的程序:
//非同步串列通信的接收
#include<pic.h>
__CONFIG(0x3F39); //調試用
#defineLED RB1
voidDELAY_I(unsignedint); //延時(i)ms,中斷用
voidCSH(void); //初始化程序
voidinterruptINT_ISR(void); //中斷服務程序
main(void)
{ CSH();
LED=0;
while(1);
}
//======初始化程序
voidCSH(void)
{ TRISB=0B11110000;
TRISC=0B11100011; //RC2為蜂鳴器輸出
TRISD=0;
PORTD=0;
INTCON=0B11000000; //
RCIE=1; //接收中斷
SPBRG=25; //波特率9600,高速,8位數據
RCSTA=(0b10010000);
TXSTA=(0b00100100);
PORTB=0b00000000;
}
//======//中斷服務程序
voidinterruptINT_ISR(void)
{ charx;
if(RCIE&RCIF) //接收中斷,LED閃一下
{ LED=1;
x=RCREG; //讀接收數據,實際上會自動將RCIF清0
PORTD=x;
DELAY_I(100); //延時為了能看清LED閃亮
LED=0;
}
}
//======延時(n)ms
voidDELAY_I(unsignedintn)
{ unsignedintj;
chark;
for(j=0;j<n;j++)
for(k=246;k>0;k--)NOP();
}
『叄』 求用PIC單片機語言編寫一段crc8校驗碼的程序 (求大神指點,要是有注釋就更好了)
可以參考北航的《PIC16系列單片機C程序設計與PROTEUS模擬》一書,裡面有8位的和16位的CRC程序,是用PICC編的,8位的好象在第6章的一線式溫度感測器那一節。
『肆』 pic系列單片機用c語言編程時,讓他執行A/D轉換的指令是什麼
AD轉換不是一條指令就可以完成的,它要先經過埠設置,AD設置等過程後才能准備進入AD轉換,下例是從北航的<PIC16單片機C程序設計與PROTEUS模擬>一書中得到的啟發編制的程序,希望對你能有幫助.建議你看一下這本書,對初學和想進一步提高在PIC單片機應用編程等會有用的.
附圖是對應程序的,在模擬時調整電位器可以看到AD結果的變化,並通過計算器可以驗證程序的正確性.
//ADl轉換示例,可以改變輸入電壓、AD通道、結果對齊方式等,看其變化
#include<pic.h>
__CONFIG(0x3F39);//配置位設置
voidmain(void)
{ chari,X,Y;
TRISA=0xFF; //將所有的A口設置為輸入
TRISE=0x03; //將所有的E口設置為輸入
TRISD=0; //C口與D口全為輸出
TRISC=0;
ADCON1=0b10000000; //設置AD結果對齊方式、AD時鍾選擇(與ADCON0的位7,6一起),AD埠設置等
ADCON0=0b01011001; //AD時鍾選擇(與ADCON1的位6一起),通道選擇,AD模塊使能
while(1)
{ NOP();
for(i=0;i<3;i++) //延時時間大約20us
NOP();
ADGO=1; //開始AD
while(ADGO==1); //等待AD轉換完成
ADIF=0;
X=ADRESH; //讀取AD結果高位元組至C口
PORTC=X;
Y=ADRESL; //讀取AD結果低位元組至D口
PORTD=Y;
};
}