找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2999|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

主從機(jī)多機(jī)通信模型類似云臺解碼器一樣用跳線設(shè)置從機(jī)地址

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72008 發(fā)表于 2015-1-11 20:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include //STC12C5AxxS2系列單片機(jī)頭文件
  2. #define uchar unsigned char//宏定義
  3. #define uint unsigned int//宏定義

  4. uchar DZ;//地址號,為接線方便本程序占用P1口用做手工地址設(shè)置后面的控制會對P1口無效
  5. //一幀標(biāo)準(zhǔn)數(shù)據(jù)幀
  6. int D=0; //緩沖區(qū)指針標(biāo)志
  7. uchar DATA[3]; //數(shù)據(jù)幀格式為【地址】【請求OR設(shè)置標(biāo)志(1為請求2為設(shè)置,請求時(shí)數(shù)據(jù)位為空數(shù)據(jù))】【IO口號0對應(yīng)P0,1對應(yīng)P1.....】【數(shù)據(jù)】

  8. /*********************************************************************************************
  9. 函數(shù)名:毫秒級CPU延時(shí)函數(shù)
  10. 調(diào) 用:DELAY_MS (?);
  11. 參 數(shù):1~65535(參數(shù)不可為0)
  12. 返回值:無
  13. 結(jié) 果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
  14. 備 注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)i<125
  15. /*********************************************************************************************/
  16. void DELAY_MS (unsigned int a){
  17. unsigned int i;
  18. while( a-- != 0){
  19. for(i = 0; i < 600; i++);
  20. }
  21. }
  22. /*********************************************************************************************/

  23. /*********************************************************************************************
  24. 函數(shù)名:UART串口初始化函數(shù)
  25. 調(diào) 用:UART_init();
  26. 參 數(shù):無
  27. 返回值:無
  28. 結(jié) 果:啟動(dòng)UART串口接收中斷,允許串口接收,啟動(dòng)T/C1產(chǎn)生波特率(占用)
  29. 備 注:振蕩晶體為12MHz,PC串口端設(shè)置 [ 4800,8,無,1,無 ]
  30. /**********************************************************************************************/
  31. void UART_init (void){
  32. EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
  33. ES = 1; //允許UART串口的中斷

  34. TMOD = 0x20; //定時(shí)器T/C1工作方式2
  35. SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時(shí)禁止串口接收)
  36. TH1 = 0xF3; //定時(shí)器初值高8位設(shè)置
  37. TL1 = 0xF3; //定時(shí)器初值低8位設(shè)置
  38. PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
  39. TR1 = 1; //定時(shí)器啟動(dòng)
  40. }
  41. /**********************************************************************************************/

  42. /*********************************************************************************************
  43. 函數(shù)名:UART串口接收中斷處理函數(shù)
  44. 調(diào) 用:[SBUF收到數(shù)據(jù)后中斷處理]
  45. 參 數(shù):無
  46. 返回值:無
  47. 結(jié) 果:UART串口接收到數(shù)據(jù)時(shí)產(chǎn)生中斷,用戶對數(shù)據(jù)進(jìn)行處理(并發(fā)送回去)
  48. 備 注:過長的處理程序會影響后面數(shù)據(jù)的接收
  49. /**********************************************************************************************/
  50. void UART_R (void) interrupt 4 using 1{ //切換寄存器組到1
  51. unsigned char UART_data; //定義串口接收數(shù)據(jù)變量
  52. if(RI&&D<=3){
  53. RI = 0; //令接收中斷標(biāo)志位為0(軟件清零)
  54. UART_data = SBUF; //將接收到的數(shù)據(jù)送入變量 UART_data
  55. DATA[D]=UART_data;
  56. D++;
  57. }
  58. }
  59. /**********************************************************************************************/


  60. /*********************************************************************************************
  61. 函數(shù)名:UART串口發(fā)送函數(shù)
  62. 調(diào) 用:UART_T (?);
  63. 參 數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))
  64. 返回值:無
  65. 結(jié) 果:將參數(shù)中的數(shù)據(jù)發(fā)送給UART串口,確認(rèn)發(fā)送完成后退出
  66. 備 注:
  67. /**********************************************************************************************/
  68. void UART_T (unsigned char UART_data){ //定義串口發(fā)送數(shù)據(jù)變量
  69. SBUF = UART_data; //將接收的數(shù)據(jù)發(fā)送回去
  70. while(TI == 0); //檢查發(fā)送中斷標(biāo)志位
  71. TI = 0; //令發(fā)送中斷標(biāo)志位為0(軟件清零)
  72. }
  73. /**********************************************************************************************/

  74. /*********************************************************************************************
  75. 函數(shù)名:UART串口發(fā)送字符串函數(shù)
  76. 調(diào) 用:UART_TC (?);
  77. 參 數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))
  78. 返回值:無
  79. 結(jié) 果:向串口發(fā)送一個(gè)字符串,長度不限。
  80. 備 注:例:UART_TC("d9887321$"); 此函數(shù)需要#include 頭文件支持。
  81. /**********************************************************************************************/
  82. void UART_TC (unsigned char *str){
  83. while(*str != '\0'){
  84. UART_T(*str);
  85. *str++;
  86. }
  87. *str = 0;
  88. }
  89. /**********************************************************************************************/

  90. /*********************************************************************************************
  91. 函數(shù)名:主函數(shù)
  92. 調(diào) 用:無
  93. 參 數(shù):無
  94. 返回值:無
  95. 結(jié) 果:程序開始處,無限循環(huán)
  96. 備 注:
  97. /**********************************************************************************************/
  98. void main (void)
  99. {
  100. uint x;
  101. //地址初始化
  102. DZ=P1;
  103. //串口初始化
  104. UART_init ();
  105. while(1)
  106. {
  107. //地址初始化
  108. DZ=P1;
  109. if(D>3)
  110. {
  111. //已經(jīng)收到一幀控制數(shù)據(jù)
  112. if(DATA[0]==DZ)
  113. {
  114. if(DATA[1]==1)
  115. {
  116. //返回IO口狀態(tài)數(shù)據(jù)
  117. switch( DATA[2])
  118. {
  119. case 0:
  120. DATA[3]=P0;
  121. for(x=0;x<=3;x++)
  122. {
  123. UART_T(DATA[x]);
  124. }
  125. break;
  126. case 2:
  127. DATA[3]=P2;
  128. for(x=0;x<=3;x++)
  129. {
  130. UART_T(DATA[x]);
  131. }
  132. break;
  133. }
  134. }else if(DATA[1]==2)
  135. {
  136. //設(shè)置IO口狀態(tài)
  137. switch( DATA[2])
  138. {
  139. case 0:
  140. P0=DATA[3];
  141. break;
  142. case 2:
  143. P2=DATA[3];
  144. break;
  145. }
  146. }
  147. }
  148. D=0;
  149. }
  150. }

  151. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表