乖女从小被C到大H文NP|人妻洗澡被强公日日澡电影|小柔被六个男人躁到早上电影|被男人吃奶跟添下面特舒服|被绑在坐桩机上抹春药BL推文

技術(shù)熱線: 4007-888-234
設(shè)計開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享

技術(shù)支持

從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力

新聞中心

提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動態(tài)

PIC單片機(jī)C語言編程實(shí)例四

更新時間: 2019-01-05
閱讀量:3141

通用同步/異步通信的應(yīng)用
8.5 單片機(jī)雙機(jī)異步通信
1 單片機(jī)PIC1編程(發(fā)送部分)

include

/該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)異步通信功能,該程序是發(fā)送部分/
unsigned char tran[8]; /定義一個數(shù)組存儲發(fā)送數(shù)據(jù)/
unsigned char k,data; /定義通用寄存器/
const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
/不帶小數(shù)點(diǎn)的顯示段碼表/
/spi顯示初始化子程序/
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
/設(shè)置SPI的控制方式,允許SSP方式,并且時鐘下降沿發(fā)送,與”74HC595,當(dāng)其 SCLK從低到高跳變時,串行輸入寄存器”的特點(diǎn)相對應(yīng)/
TRISC=0xD7; /
SDO引腳為輸出,SCK引腳為輸出/
TRISA5=0; /
RA5引腳設(shè)置為輸出,以輸出顯示鎖存信號/
}
/
給數(shù)組賦初值子程序 /
void fuzhi()
{
for(k=0;k<8;k++) {
tran[k]=k+3;
}
}
/
SCI部件初始化子程序/
void sciint()
{
SPBRG=0X19; /
將傳輸?shù)牟ㄌ芈试O(shè)為約9 600位/秒/
TXSTA=0X04; /
選擇異步高速方式傳輸8位數(shù)據(jù)/
RCSTA=0X80; /
允許同步串行口工作/
TRISC6=1;
TRISC7=1; /
將RC6、RC7設(shè)置為輸入方式,對外部呈高阻狀態(tài)/
}
/
SPI傳輸數(shù)據(jù)子程序/
void SPILED(data)
{
SSPBUF=data; /
啟動發(fā)送/
do {

}while(SSPIF==0);
SSPIF=0;
}
/
顯示子程序,顯示8位數(shù)/
void display()
{
RA5=0; /
準(zhǔn)備鎖存/
for(k=0;k<8;k++) {
data=tran[k];
data=table[data]; /
查得顯示的段碼/
SPILED(data); /
發(fā)送顯示段碼/
}
RA5=1; /
最后給一個鎖存信號,代表顯示任務(wù)完成/
}
/
主程序/
main()
{
SPIINIT();
fuzhi(); /
給數(shù)組賦初值/
sciint(); /
SCI部件初始化/
di(); /
中斷禁止/
TXEN=1; /
發(fā)送允許/
CREN=1; /
接收數(shù)據(jù)允許/
for(k=0;k<8;k++){
TXREG=tran[k]; /
發(fā)出一個字符/
while(1){
if(TXIF==1) break;
} /
等待寫入完成/
while(1){
if(RCIF==1) break;/
若收到響應(yīng)字節(jié),則終止等待/
}
RCREG=RCREG; /
讀響應(yīng)字節(jié),清RCIF/
}
display(); /
顯示發(fā)送的數(shù)據(jù)*/
while(1){
;
}
}

2 單片機(jī)PIC2編程(接收部分)

include

/該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)異步通信功能,該程序是接收部分,并把接收的數(shù)據(jù)顯示在8 個LED上/
unsigned char rece[8];/
定義一個數(shù)組存儲接收數(shù)據(jù)/
unsigned char k,data;/
定義通用寄存器/
const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
/
不帶小數(shù)點(diǎn)的顯示段碼表/
/
spi顯示初始化子程序/
void SPIINIT()
{
;詳細(xì)語句見發(fā)送程序
}
/
SCI部件初始化子程序/
void sciint()
{
SPBRG=0X19; /
波特率設(shè)置與PIC1相同,為約9 600位/秒/
TXSTA=0X04; /
異步高速傳輸/
RCSTA=0X80; /
串行口工作使能/
TRISC6=1;
TRISC7=1; /
將RC6、RC7設(shè)置為輸入方式,對外部呈高阻狀態(tài)/
}
/
SPI傳送數(shù)據(jù)子程序/
void SPILED(data)
{
;詳細(xì)語句與見發(fā)送程序
}
/
顯示子程序,顯示4位數(shù)/
void display()
{
RA5=0; /
準(zhǔn)備鎖存/
for(k=0;k<8;k++){
data=rece[k];
data=table[data]; /
查得顯示的段碼/
SPILED(data); /
發(fā)送顯示段碼/
}
RA5=1; /
最后給一個鎖存信號,代表顯示任務(wù)完成/
}
/
主程序/
main()
{
SPIINIT(); /
spi顯示初始化/
sciint(); /
SCI部件初始化/
di(); /
中斷禁止/
CREN=1; /
接收允許/
TXEN=1; /
發(fā)送允許/
for(k=0;k<8;k++){
while(1){
if(RCIF==1) break;
} /
等待接收數(shù)據(jù)/
rece[k]=RCREG; /
讀取接收數(shù)據(jù),同時清掉RCIF/
TXREG=rece[k]; /
發(fā)送接收到的數(shù)據(jù)/
while(1){
if(TXIF==1) break;
} /
等待寫入完成/
}
display(); /
顯示接收的數(shù)據(jù)*/
while(1){

}
}
8.6 單片機(jī)雙機(jī)同步通信
1 單片機(jī)PIC1編程(主控發(fā)送)

include

/該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)同步通信功能,是主控發(fā)送部分。程序上電后顯示 相應(yīng)的字符,表示系統(tǒng)正常工作。發(fā)送完畢后顯示發(fā)送的數(shù)據(jù)/
unsigned char tran[8]; /
定義一個數(shù)組存儲發(fā)送數(shù)據(jù)/
unsigned char k,data; /
定義通用寄存器/
const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
/
不帶小數(shù)點(diǎn)的的顯示段碼表/
/
spi顯示初始化子程序/
void SPIINIT()
{
;詳細(xì)程序語句請參考本章8.5節(jié)
}
/
給發(fā)送數(shù)組賦初值子程序 /
void fuzhi()
{
for(k=0;k<8;k++){
tran[k]=k;
} /
發(fā)送0~7八個數(shù)據(jù)/
}
/
SCI部件初始化子程序/
void sciint()
{
SPBRG=200 ; /
將傳輸?shù)牟ㄌ芈试O(shè)為約9600位/秒/
TXSTA=0X90; /
選擇主控方式/
RCSTA=0X80; /
允許同步串行口工作/
TRISC6=1;
TRISC7=1; /
將RC6、RC7設(shè)置為輸入方式,對外部呈高阻狀態(tài)/
}
/
SPI傳送數(shù)據(jù)子程序/
void SPILED(data)
{
;詳細(xì)程序語句請參考本章8.5節(jié)
}
/
顯示子程序,顯示8位數(shù)/
void display()
{
RA5=0; /
準(zhǔn)備鎖存/
for(k=0;k<8;k++){
data=tran[k];
data=table[data]; /
查得顯示的段碼/
SPILED(data); /
發(fā)送顯示段碼/
}
RA5=1; /
最后給一個鎖存信號,代表顯示任務(wù)完成/
}
/
顯示子程序,顯示8位數(shù)/
void display1()
{
RA5=0; /
準(zhǔn)備鎖存/
for(k=0;k<8;k++){
data=0xf9; /
顯示”1”表示系統(tǒng)正常工作/
SPILED(data); /
發(fā)送顯示段碼/
}
RA5=1; /
最后給一個鎖存信號,代表顯示任務(wù)完成/
}
/
主程序/
main()
{
SPIINIT(); /
spi顯示初始化/
fuzhi(); /
給發(fā)送數(shù)組賦發(fā)送初值/
sciint(); /
SCI部件初始化/
di(); /
中斷禁止/
TXEN=1; /
發(fā)送允許/
display1(); /
顯示相應(yīng)的字符,表示系統(tǒng)正常/
while(1){
for(k=0;k<8;k++){
TXREG=tran[k];/
發(fā)出一個字符/
while(1){
if(TXIF==1) break;
} /
等待上一個數(shù)據(jù)寫入完成/
}
display(); /
顯示發(fā)送的數(shù)據(jù)/
} /
循環(huán)發(fā)送*/
}

2 單片機(jī)PIC2編程(從動接收)

include

/該程序?qū)崿F(xiàn)單片機(jī)雙機(jī) 同步通信功能,是從動接收部分,并把接收的數(shù)據(jù)顯 示在8個LED上/
unsigned char rece[8]; /
定義一個數(shù)組存儲接收數(shù)據(jù)/
unsigned char k,data; /
定義通用寄存器/
unsigned int i;
const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
/
不帶小數(shù)點(diǎn)的顯示段碼表/
/
spi顯示初始化子程序/
void SPIINIT()
{
;詳細(xì)程序語句請參考本章8.5節(jié)
}
/
SCI部件初始化子程序/
void sciint()
{
TXSTA=0X10 ; /
選擇同步從動方式/
RCSTA=0X90; /
串行口工作使能/
TRISC6=1;
TRISC7=1; /
將RC6、RC7設(shè)置為輸入方式對外部呈高阻狀態(tài)/
}
/
SPI傳送數(shù)據(jù)子程序/
void SPILED(data)
{
;/
詳細(xì)程序語句請參考本章8.5節(jié)/
}
/
顯示子程序,顯示4位數(shù)/
void display()
{
RA5=0; /
準(zhǔn)備鎖存/
for(k=0;k<8;k++){
data=rece[k];
data=table[data]; /
查得顯示的段碼/
SPILED(data); /
發(fā)送顯示段碼/
}
RA5=1; /
最后給一個鎖存信號,代表顯示任務(wù)完成/
}
/
主程序/
main()
{
SPIINIT(); /
spi顯示初始化/
sciint(); /
SCI部件初始化/
di(); /
中斷禁止/
CREN=1; /
接收允許/
for(k=0;k<8;k++) rece[k]=0x03;
display(); /
顯示表示系統(tǒng)正常運(yùn)行的數(shù)據(jù)/
while(1) {
while(1){
CREN=1; /
允許連續(xù)接收/
while(1){
if(RCIF==1) break;
} /
等待接收數(shù)據(jù)/
k=0;
rece[k]=RCREG; /
讀取接收數(shù)據(jù)/
if(OERR==1) { /
如果有溢出錯誤,則處理/
CREN=0;
CREN=1;
}
if(rece[k]==0x00) break;/
“0”為同步字符,只有接收到“0”時才進(jìn)行下面的接收/
}
for(k=1;k<8;k++){
while(1){
if(RCIF==1) break;
} /
等待接收數(shù)據(jù)/
rece[k]=RCREG;/
讀取接收數(shù)據(jù)/
if(OERR==1) { /
如果有溢出錯誤,則處理/
CREN=0;
CREN=1;
}
rece[k]=rece[k]&0x0F;/
屏蔽掉高位,防止干擾/
}
CREN=0;
display(); /
顯示接收的數(shù)據(jù)/
for(i=65535;—i; )continue;
for(i=65535;—i; )continue;/
給予一定時間的延時,再進(jìn)行下一輪接收*/
}
}

8.7 單片機(jī)與PC機(jī)通信
1 PC機(jī)編程
PC采用Toubr C 進(jìn)行編寫。程序如下:

include

define port 0x3f8 /利用串口1進(jìn)行通信/

int ch[15];
main ()
{
int a;
int i,j;
int b[6]={88,15,38,26,20,0};
char c;
clrscr();
outportb(port+3,0x80); /準(zhǔn)備設(shè)置波特率/
outportb(port,0x0C); /波特率設(shè)置為9600bps/
outportb(port+1,0x00);
outportb(port+3,0x03); /8位數(shù)據(jù),無奇偶檢驗(yàn),1位停止位/
outportb(port+1,0x00); /關(guān)中斷/
inportb(port+5); /讀一次線路狀態(tài)寄存器,使其復(fù)位/
for(;;){
printf(“\t\tsend data or receive data: (s or r?)\n\n\n”);
c=getchar();
switch(c) {
case ‘s’:
case ‘S’: {
while(!(inportb(port+5)&0x20));/發(fā)送保持器滿則等待/
outportb(port,0x01); /否則發(fā)送數(shù)據(jù)01,通知單片機(jī)準(zhǔn)備接收/
for(i=0;i<6;i++){ /共發(fā)送6個數(shù)據(jù)/
a=b[i];
while(!(inportb(port+5)&0x20)) delay(100);/發(fā)送保持器滿,等待/
outportb(port,a); /發(fā)送a/
printf(“%d\n”,a); /顯示a/
while(!(inport(port+5)&1)); /接收單片機(jī)送回的數(shù)據(jù)/
ch[i]=inport(port); /保存/
}
delay(10);
for(j=0;j<8;j++) printf(“\n%d\n”,ch[j]);/顯示接收的回送數(shù)據(jù)/
getch();
break;
}
case’r’: /接收數(shù)據(jù)/
case’R’:{
while(!(inportb(port+5)&0x20));
outportb(port,0x02); /發(fā)送數(shù)據(jù)02,通知單片機(jī)發(fā)送數(shù)據(jù)/
for(j=0;j<9;j++) { /共接收9個數(shù)據(jù)/
while(!(inportb(port+5)&1));
ch[j]=inportb(port);
}
for(j=0;j<9;j++) printf(“\n %d\n”,ch[j]);
getch();
break;
}
}
}
}

山东| 二连浩特市| 凤山县| 西平县| 大名县| 特克斯县| 弥勒县| 合江县| 汨罗市| 咸丰县| 香港 | 武陟县| 安顺市| 视频| 盖州市| 扬中市| 平昌县| 宁波市| 洛阳市| 永川市| 贵阳市| 高雄市| 台江县| 福建省| 仪陇县| 仁化县| 藁城市| 陆河县| 巴彦淖尔市| 娄烦县| 南木林县| 平阴县| 大港区| 那曲县| 桑植县| 青河县| 吉林省| 苏尼特左旗| 罗源县| 黎平县| 甘洛县|