|
使用中斷方式C51程序設(shè)計_單片機與一個單片機串口通信仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (15.59 KB, 下載次數(shù): 24)
下載附件
2018-11-14 02:40 上傳
單片機與1個單片機串口通信設(shè)計任務(wù):
1個單片機(主機)通過串行口將十六進制數(shù)發(fā)送給另一個單片機(從機),驅(qū)動從機繼電器動作,并在數(shù)碼管顯示接收到的數(shù)。從機接收到數(shù)據(jù)后,返回原數(shù)據(jù)給主機并在數(shù)碼管顯示。
0.png (6.81 KB, 下載次數(shù): 21)
下載附件
2018-11-14 02:41 上傳
手動輸入:通過開發(fā)板上的數(shù)字量輸入撥動開關(guān)來實現(xiàn)數(shù)據(jù)輸入(00 01 10 11)
單片機源程序如下:
- #include<reg51.h>
- #include<string.h>
- #define uint unsigned int
- #define uchar unsigned char
- /****************************開關(guān)端口定義*********************************************/
- sbit sw_0=P3^3;
- sbit sw_1=P3^4;
- /****************************數(shù)碼顯示 鍵盤接口定義****************************************/
- sbit PS0=P2^4;//數(shù)碼管個位
- sbit PS1=P2^5;//數(shù)碼管十位
- sfr P_data=0x80;//P0口為顯示數(shù)據(jù)輸出口
- sbit P_K_L=P2^2;//鍵盤列
-
- uchar tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};//字段轉(zhuǎn)換表
- uchar temp=0; //存放數(shù)據(jù)區(qū)
- uint a;
- uint sw_in(void);//開關(guān)量輸入采集
- void display(uint a);//顯示函數(shù)
- void delay(uint delay_time);//延時函數(shù)
- void init_serial(void);
- void main(void)
- {
- init_serial();
- temp=sw_in();
- TI=0;
- SBUF=temp;
-
- while(1);
- }
- /**************************串口初始化函數(shù)**************************/
- /*函數(shù)原型:void init_serial(void)
- /*函數(shù)功能:設(shè)置串口通信參數(shù)及方式
- /*輸入?yún)?shù):無
- /*輸出參數(shù):無
- /*調(diào)用模塊:無
- /******************************************************************/
- void init_serial(void)
- { TMOD=0X20;//定時器1方式2
- TH1=0XFA;
- TL1=0XFA;
- PCON=0X80;
- SCON=0X50;//串口方式1,允許接收,波特率9600bit/s
- TR1=1; //開始計時
- ES=1;
- EA=1;
- }
- //串口中斷處理函數(shù)
- void serial_int() interrupt 4
- {
- if(RI==1)
- { RI=0;
- temp=SBUF; //接收數(shù)據(jù)
- for(a=0;a<200;a++)//顯示,兼有延時的作用
- display(temp);
- }
- if(TI==1)
- { temp=sw_in();
- SBUF=temp;
- TI=0;
- }
- }
- /**************************數(shù)據(jù)采集函數(shù)**************************/
- /*函數(shù)原型:unsigned int sw_in(void)
- /*函數(shù)功能:數(shù)據(jù)采集
- /*輸入?yún)?shù):無
- /*輸出參數(shù):a
- /*調(diào)用模塊:無
- /******************************************************************/
- uint sw_in(void)
- {
- unsigned int a=0;
- if(sw_0)
- { a=a+1;}
- if(sw_1)
- {a=a+0x10;}
- return a;
- }
- /**************************數(shù)碼管顯示函數(shù)**************************/
- /*函數(shù)原型:void display(void)
- /*函數(shù)功能:數(shù)碼管顯示
- /*輸入?yún)?shù):無
- /*輸出參數(shù):無
- /*調(diào)用模塊:delay()
- /******************************************************************/
- void display(unsigned int a)
- {
- bit b=P_K_L;
- P_K_L=1;//防止按鍵干擾顯示
-
- P_data=tab[a&0x0f];//顯示個1位
- PS0=0;
- PS1=1;
- delay(200);
-
- P_data=tab[(a>>4)&0x0f]; //顯示十位
- PS0=1;
- PS1=0;
- delay(200);
- P_K_L=b;//恢復(fù)按鍵
- P_data=0xff;//恢復(fù)數(shù)據(jù)口
- }
- /*******************************延時函數(shù)*********************************/
- /*函數(shù)原型:delay(unsigned int delay_time)
- /*函數(shù)功能:延時函數(shù)
- /*輸入?yún)?shù):delay_time (輸入要延時的時間)
- /*輸出參數(shù):無
- /*調(diào)用模塊:無
- /**********************************************************************/
- void delay(unsigned int delay_time) //延時子程序
- {for(;delay_time>0;delay_time--)
- {}
- }
復(fù)制代碼
0.png (40.61 KB, 下載次數(shù): 21)
下載附件
2018-11-14 02:42 上傳
0.png (7.8 KB, 下載次數(shù): 20)
下載附件
2018-11-14 02:42 上傳
所有資料51hei提供下載:
單片機通信.zip
(150.55 KB, 下載次數(shù): 30)
2018-11-12 10:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|