久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6548|回復: 5
打印 上一主題 下一主題
收起左側

工控設備串口及485調試模塊電路原理圖與單片機源碼等資料

[復制鏈接]
跳轉到指定樓層
樓主
【簡要說明】
一、 尺寸:長170mmX寬72mmX高18mm
二、 主要芯片:單片機,MAX485,MAX232
三、 工作電壓:6V40V,功耗小于1W
四、  特點:1、具有穩壓電路,輸入電壓廣,具有電源指示燈
            2、具有485通信和232通信及TTL通信
            3、具有數碼管數據顯示,蜂鳴器提示音
            4、波特率可調分別是 2400 4800  9600 19200
            5、采用大按鍵,機械壽命長
            6、單片機編程,客戶可以自己更改,提供源代碼
            7、可發送20組數據
            8、具有系統復位按鍵
            9、端子采用螺旋壓接端子           
            10、工作溫度-40度至 +70度
            11、工作濕度 40%  ~ 80%RH
            12、板子靜態功耗小于1W
            13具有續流保護
            14、具有電磁抗干擾能力
            15、板子穩定工作可靠
            16、板子可安裝在DIN導軌上面

工控設備串口及485調試模塊的電路原理圖:


pcb:


GYJ-0023_工控設備串口及485調試模塊波特率設置:

1上2下 2400
1下2上 4800
1上2上 9600
1下2下 19200
01 2400
10 4800
00 9600
11 19200

模塊的元件清單:



GYJ-0023_工控設備串口及485調試模程序:
rs485.c單片機源程序如下:

  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>

  3. sbit RS485_DIR = P1^4;  //RS485方向選擇引腳
  4. sbit feng = P3^7;       //蜂鳴器引腳

  5. bit flagFrame = 0;  //幀接收完成標志,即接收到一幀新數據
  6. bit flagTxd = 0;    //單字節發送完成標志,用來替代TXD中斷標志位
  7. unsigned char cntRxd = 0;   //接收字節計數器
  8. unsigned char pdata bufRxd[64];  //接收字節緩沖區

  9. extern void UartAction(unsigned char *buf, unsigned char len);

  10. /* 串口配置函數,baud-通信波特率 */
  11. void ConfigUART(unsigned int baud)
  12. {
  13.     RS485_DIR = 0; //RS485設置為接收方向
  14.     SCON  = 0x50;  //配置串口為模式1
  15.     TMOD &= 0x0F;  //清零T1的控制位
  16.     TMOD |= 0x20;  //配置T1為模式2
  17.     TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
  18.         PCON = 0x00;         //注意  每次變化都要更改,他會保存
  19.     TL1 = TH1;     //初值等于重載值
  20.     ET1 = 0;       //禁止T1中斷
  21.     ES  = 1;       //使能串口中斷
  22.     TR1 = 1;       //啟動T1
  23. }
  24. /* 串口配置函數,19200baud-通信波特率 */
  25. void ConfigUART1(unsigned int baud1)
  26. {
  27.     RS485_DIR = 0; //RS485設置為接收方向
  28.     SCON  = 0x50;  //配置串口為模式1
  29.     TMOD &= 0x0F;  //清零T1的控制位
  30.     TMOD |= 0x20;  //配置T1為模式2
  31.     //TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
  32.    // TL1 = TH1;     //初值等于重載值
  33.    PCON = 0x80;
  34.    TH1 = 0xFD;
  35.    TL1 = 0xFD;
  36.     ET1 = 0;       //禁止T1中斷
  37.     ES  = 1;       //使能串口中斷
  38.     TR1 = 1;       //啟動T1
  39. }
  40. /* 軟件延時函數,延時時間(t*10)us */
  41. void DelayX10us(unsigned int t)
  42. {
  43.     do {
  44.         _nop_();
  45.         _nop_();          //注意如果是52rc就是8個nop   如果是60s2就多加12個nop
  46.         _nop_();
  47.         _nop_();
  48.         _nop_();
  49.         _nop_();
  50.         _nop_();
  51.         _nop_();
  52.                 _nop_();
  53.         _nop_();
  54.         _nop_();
  55.         _nop_();
  56.         _nop_();
  57.         _nop_();
  58.         _nop_();
  59.         _nop_();
  60.                 _nop_();
  61.         _nop_();
  62.         _nop_();
  63.         _nop_();
  64.     } while (--t);
  65. }
  66. /*
  67. void Send( char dat){//發送一字節數據
  68.                            //標志位置1
  69.           SBUF=dat;           //數據裝入SBUF
  70.         while(TI==0);
  71.         TI=0;
  72. }

  73. //向串口發送字符串

  74. void SendString(char *s)

  75. {
  76.   while(*s)            //字符串發送完否

  77.   {
  78.     Send(*s++);    //發送字符并指針指向下一字符
  79.   }
  80. }
  81. */

  82. // 串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
  83. void UartWrite(unsigned char *buf, unsigned char len)
  84. {
  85.     RS485_DIR = 1;  //RS485設置為發送
  86.     while (len--)   //循環發送所有字節
  87.     {
  88.         flagTxd = 0;      //清零發送標志
  89.         SBUF = *buf++;    //發送一個字節數據
  90.         while (!flagTxd); //等待該字節發送完成
  91.     }
  92.     DelayX10us(5);  //等待最后的停止位完成,延時時間由波特率決定
  93.     RS485_DIR = 0;  //RS485設置為接收
  94. }




  95. /* 串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度 */
  96. unsigned char UartRead(unsigned char *buf, unsigned char len)
  97. {
  98.     unsigned char i;
  99.    
  100.     if (len > cntRxd)  //指定讀取長度大于實際接收到的數據長度時,注意  發送的數據長度不能大于 sizeof(buf)-2)
  101.     {                  //讀取長度設置為實際接收到的數據長度
  102.         len = cntRxd;
  103.     }
  104.     for (i=0; i<len; i++)  //拷貝接收到的數據到接收指針上
  105.     {
  106.         *buf++ = bufRxd[i];
  107.     }
  108.     cntRxd = 0;  //接收計數器清零
  109.    
  110.     return len;  //返回實際讀取長度
  111. }
  112. /* 串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔 */
  113. void UartRxMonitor(unsigned char ms)
  114. {
  115.     static unsigned char cntbkp = 0;
  116.     static unsigned char idletmr = 0;

  117.     if (cntRxd > 0)  //接收計數器大于零時,監控總線空閑時間
  118.     {
  119.         if (cntbkp != cntRxd)  //接收計數器改變,即剛接收到數據時,清零空閑計時
  120.         {
  121.             cntbkp = cntRxd;
  122.             idletmr = 0;
  123.         }
  124.         else                   //接收計數器未改變,即總線空閑時,累積空閑時間
  125.         {
  126.             if (idletmr < 30)  //空閑計時小于30ms時,持續累加
  127.             {
  128.                 idletmr += ms;
  129.                 if (idletmr >= 30)  //空閑時間達到30ms時,即判定為一幀接收完畢        注意這是485協議規定的
  130.                 {
  131.                     flagFrame = 1;  //設置幀接收完成標志
  132.                 }
  133.             }
  134.         }
  135.     }
  136.     else
  137.     {
  138.         cntbkp = 0;
  139.     }
  140. }
  141. /* 串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用 */
  142. void UartDriver()
  143. {
  144.     unsigned char len;
  145.     unsigned char pdata buf[40];         //記住  pdata 這個關鍵詞很重要,他能將變量存在xdata中  節省data的空間

  146.     if (flagFrame) //有命令到達時,讀取處理該命令
  147.     {
  148.         flagFrame = 0;
  149.         len = UartRead(buf, sizeof(buf)-2); //將接收到的命令讀取到緩沖區中         注意  接收的數據數量是由bufRxd[64]的大小決定的,發送的數據數量是由buf[40]決定的,因為要與moudebus校驗做配合,所以發送少兩位做為校驗位
  150.         UartAction(buf, len);  //傳遞數據幀,調用動作執行函數
  151.     }
  152. }
  153. /* 串口中斷服務函數 */
  154. void InterruptUART() interrupt 4
  155. {
  156.     if (RI)  //接收到新字節           當字節發送到結束位的一半的時候RI接收標志變為1  進入竄口中斷
  157.     {
  158.         RI = 0;  //清零接收中斷標志位
  159.         if (cntRxd < sizeof(bufRxd)) //接收緩沖區尚未用完時,
  160.         {                            //保存接收字節,并遞增計數器
  161.             bufRxd[cntRxd++] = SBUF;        // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數的次數增加,cntRxd慢慢變大,當傳入的數據不滿的時候就        用時間檢測,判斷是否是傳輸完成
  162.         }
  163.     }
  164.     if (TI)  //字節發送完畢
  165.     {
  166.         TI = 0;   //清零發送中斷標志位
  167.         flagTxd = 1;  //設置字節發送完成標志
  168.     }
  169. }
  170. /*蜂鳴器函數*/
  171. void fengming()
  172. {
  173.         feng = 0;
  174.         DelayX10us(10000);
  175.         DelayX10us(10000);
  176.         feng = 1;

  177.                
  178. }
復制代碼

手持通訊板 - 發送字符:
  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char//宏定義無符號字符型
  4. #define uint unsigned int  //宏定義無符號整型
  5. sbit RS485_DIR = P1^4;  //RS485方向選擇引腳
  6. sbit boma1 = P1^1;
  7. sbit boma2 = P1^0;
  8. bit flagFrame = 0;  //幀接收完成標志,即接收到一幀新數據
  9. bit flagTxd = 0;    //單字節發送完成標志,用來替代TXD中斷標志位
  10. unsigned char cntRxd = 0;   //接收字節計數器
  11. unsigned char pdata bufRxd[64];  //接收字節緩沖區
  12. void UartRxMonitor(unsigned char ms);
  13. void UartWrite(unsigned char *buf, unsigned char len);
  14. void DelayX10us(unsigned int t);
  15. void ConfigUART1(unsigned int baud);
  16. void ConfigUART(unsigned int baud);
  17. sbit ka=P2^4;//按鍵矩陣
  18. sbit kb=P2^5;
  19. sbit kc=P2^6;
  20. sbit kd=P2^7;
  21. sbit k1=P2^0;
  22. sbit k2=P2^1;
  23. sbit k3=P2^2;
  24. sbit k4=P2^3;
  25. xdata uint k4val,k4num,keyval=0,keyval1=0,keyval2=0;
  26. void kabcd();//矩陣按鍵公共
  27. void Getch();//矩陣按鍵
  28. void Delay_us(uint i); //us延時
  29. code uchar seg7code[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
  30. sbit display=P3^6;
  31. void BaudRate();//波特率選擇
  32. uint keynum=0;
  33. static uchar presstime=0;//時間值按鍵用到的
  34. bit kf0=1,kf1=1,kf2=1;
  35. bit kt0=0,kt1=0,kt2=0;
  36. sbit key1=P1^5;
  37. sbit key2=P1^6;
  38. uchar sendval[20]={'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
  39. uint empty=0;//清空
  40. sbit buzzer=P3^7;
  41. bit buzzerf=0;
  42. void main(){
  43.         TMOD = 0x01;
  44.         TH0  = 0xfc;
  45.         TL0  = 0x67;
  46.         TR0  = 1;
  47.         EA   = 1;
  48.         ET0  = 1;
  49.         display=0;
  50.         keyval=16;
  51.         keyval2=16;
  52.         while(1){
  53.                 Getch();//矩陣按鍵
  54.                 BaudRate();//波特率選擇
  55.                 if(keyval!=16){
  56.                         if(kf0){kf0=0;kt0=1;
  57.                                 buzzerf=1;
  58.                                 keyval2=keyval;
  59.                                 sendval[keynum]=keyval1;
  60.                                 keynum++;
  61.                         }
  62.                         keyval=16;
  63.                 }else{if(kt0){kf0=1;kt0=0;}}        
  64.                 P0=seg7code[keyval2];//傳到數碼管顯示
  65.         if(keynum>20){
  66.                 buzzerf=1;
  67.         }
  68.     if(key1==0){if(kf1){if(presstime>100){kf1=0;kt1=1;presstime=0;//當按鍵1按下 清空數據
  69.                 keynum=0;keyval2=16;buzzerf=1;
  70.                 for(empty=0;empty<20;empty++){sendval[empty]='0';}
  71.         }}}else{if(kt1){if(presstime>100){kf1=1;kt1=0;presstime=0;//當按鍵1松開
  72.         }}}//按鍵1結束               
  73.     if(key2==0){if(kf2){if(presstime>100){kf2=0;kt2=1;presstime=0;//當按鍵2按下 發送數據
  74.                 if(keynum<21){
  75.                         buzzerf=1;
  76.                         UartWrite(sendval,keynum);
  77.                 }
  78.         }}}else{if(kt2){if(presstime>100){kf2=1;kt2=0;presstime=0;//當按鍵2松開
  79.         }}}//按鍵2結束               
  80.         if(buzzerf){
  81.                 buzzer=0;//蜂鳴器響        
  82.                 Delay_us(20000);
  83.                 Delay_us(20000);
  84.                 Delay_us(20000);
  85.                 buzzer=1;
  86.                 buzzerf=0;
  87.         }
  88.         }
  89. }
  90. void InterruptTimer0() interrupt 1{//T0中斷服務函數,執行串口接收監控
  91.    TH0  = 0xfc;
  92.    TL0  = 0x67;
  93.    presstime++;
  94.    UartRxMonitor(1);  //串口接收監控
  95. }
  96. /* 串口配置函數,baud-通信波特率 */
  97. void ConfigUART(unsigned int baud){
  98.     RS485_DIR = 0; //RS485設置為接收方向
  99.     SCON  = 0x50;  //配置串口為模式1
  100.     TMOD &= 0x0F;  //清零T1的控制位
  101.     TMOD |= 0x20;  //配置T1為模式2
  102.     TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
  103.         PCON = 0x00;         //注意  每次變化都要更改,他會保存
  104.     TL1 = TH1;     //初值等于重載值
  105.     ET1 = 0;       //禁止T1中斷
  106.     ES  = 1;       //使能串口中斷
  107.     TR1 = 1;       //啟動T1
  108. }
  109. /* 串口配置函數,19200baud-通信波特率 */
  110. void ConfigUART1(unsigned int baud){
  111.         RS485_DIR = 0; //RS485設置為接收方向
  112.         SCON  = 0x50;  //配置串口為模式1
  113.         TMOD &= 0x0F;  //清零T1的控制位
  114.         TMOD |= 0x20;  //配置T1為模式
  115.         PCON = 0x80;
  116.         TH1 = 0xFD;
  117.         TL1 = 0xFD;
  118.         ET1 = 0;       //禁止T1中斷
  119.         ES  = 1;       //使能串口中斷
  120.         TR1 = 1;       //啟動T1
  121. }
  122. /* 軟件延時函數,延時時間(t*10)us */
  123. void DelayX10us(unsigned int t){
  124.     do {
  125.         _nop_();_nop_();_nop_();_nop_();
  126.         _nop_();_nop_();_nop_();_nop_();
  127.                 _nop_();_nop_();_nop_();_nop_();
  128.         _nop_();_nop_();_nop_();_nop_();
  129.                 _nop_();_nop_();_nop_();_nop_();
  130.     } while (--t);
  131. }
  132. // 串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
  133. void UartWrite(unsigned char *buf, unsigned char len){
  134.     RS485_DIR = 1;  //RS485設置為發送
  135.     while (len--){   //循環發送所有字節
  136.         flagTxd = 0;      //清零發送標志
  137.         SBUF = *buf++;    //發送一個字節數據
  138.         while (!flagTxd); //等待該字節發送完成
  139.     }
  140.     DelayX10us(5);  //等待最后的停止位完成,延時時間由波特率決定
  141.     RS485_DIR = 0;  //RS485設置為接收
  142. }
  143. /* 串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔 */
  144. void UartRxMonitor(unsigned char ms){
  145.     static unsigned char cntbkp = 0;
  146.     static unsigned char idletmr = 0;
  147.     if (cntRxd > 0){  //接收計數器大于零時,監控總線空閑時間
  148.         if (cntbkp != cntRxd){  //接收計數器改變,即剛接收到數據時,清零空閑計時
  149.             cntbkp = cntRxd;
  150.             idletmr = 0;
  151.         }else{                 //接收計數器未改變,即總線空閑時,累積空閑時間
  152.             if (idletmr < 30){  //空閑計時小于30ms時,持續累加
  153.                 idletmr += ms;
  154.                 if (idletmr >= 30){  //空閑時間達到30ms時,即判定為一幀接收完畢        注意這是485協議規定的
  155.                     flagFrame = 1;  //設置幀接收完成標志
  156.                 }
  157.             }
  158.         }
  159.     }else{
  160.         cntbkp = 0;
  161.     }
  162. }
  163. /* 串口中斷服務函數 */
  164. void InterruptUART() interrupt 4{
  165.     if (RI){  //接收到新字節           當字節發送到結束位的一半的時候RI接收標志變為1  進入竄口中斷
  166.         RI = 0;  //清零接收中斷標志位
  167.         if (cntRxd < sizeof(bufRxd)){ //接收緩沖區尚未用完時,保存接收字節,并遞增計數器
  168.             bufRxd[cntRxd++] = SBUF;        // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數的次數增加,cntRxd慢慢變大,當傳入的數據不滿的時候就        用時間檢測,判斷是否是傳輸完成
  169.         }
  170.     }
  171.     if (TI){  //字節發送完畢
  172.         TI = 0;   //清零發送中斷標志位
  173.         flagTxd = 1;  //設置字節發送完成標志
  174.     }
  175. }
  176. void BaudRate(){//波特率選擇
  177.         if((boma1 == 0)&&(boma2 != 0)){ConfigUART(2400);}  //配置波特率為1200        
  178.         if((boma2 == 0)&&(boma1 != 0)){ConfigUART(4800);}  //配置波特率為4800        
  179.         if((boma1 == 0)&&(boma2 == 0)){ConfigUART(9600);}  //配置波特率為9600        
  180.         if((boma1 != 0)&&(boma2 != 0)){ConfigUART1(19200);}//配置波特率為19200        
  181. }

  182. void Delay_us(uint i){ //us延時
  183.         for(;i>0;i--){
  184.                 _nop_();
  185.         }
  186. }
  187. void kabcd(){
  188.         Delay_us(10000);
  189.         if(ka==1){k4val|=0x80;}else{k4val&=0x7f;}
  190.         if(kb==1){k4val|=0x40;}else{k4val&=0xbf;}
  191.         if(kc==1){k4val|=0x20;}else{k4val&=0xdf;}
  192.         if(kd==1){k4val|=0x10;}else{k4val&=0xef;}
  193.         k4num=k4val;
  194.         k4num&=0xf0;
  195. }
  196. void Getch(){//矩陣按鍵
  197.         k1=0;//矩陣1開始
  198.         ka=kb=kc=kd=k2=k3=k4=1;
  199.         kabcd();
  200.         if(k4num!=0xf0){
  201.                 kabcd();
  202.                 if(k4num!=0xf0){
  203.                         switch(k4num){
  204.                                 case(0x70):keyval=1;keyval1=49;break;//s1                        
  205.                                 case(0xb0):keyval=2;keyval1=50;break;//s2
  206.                                 case(0xd0):keyval=3;keyval1=51;break;//s3
  207.                                 case(0xe0):keyval=4;keyval1=52;break;//s4
  208.                         }
  209.                 }        
  210.         }//矩陣1結束
  211.         k2=0;//矩陣2開始
  212.         ka=kb=kc=kd=k1=k3=k4=1;
  213.         kabcd();
  214.         if(k4num!=0xf0){
  215.                 kabcd();
  216.                 if(k4num!=0xf0){
  217.                         switch(k4num){
  218.                                 case(0x70):keyval=5;keyval1=53;break;//s5                        
  219.                                 case(0xb0):keyval=6;keyval1=54;break;//s6
  220.                                 case(0xd0):keyval=7;keyval1=55;break;//s7
  221.                                 case(0xe0):keyval=8;keyval1=56;break;//s8
  222.                         }
  223.                 }        
  224.         }//矩陣2結束
  225.         k3=0;//矩陣3開始
  226.         ka=kb=kc=kd=k2=k1=k4=1;
  227. ……………………

  228. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
GYJ-0023_工控設備串口及485調試模塊發貨資料.rar (4.35 MB, 下載次數: 69)


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

使用道具 舉報

沙發
ID:26811 發表于 2018-5-22 11:27 | 只看該作者
學習學習
回復

使用道具 舉報

板凳
ID:228452 發表于 2018-5-27 00:43 | 只看該作者
Thank you for schematics and source code
回復

使用道具 舉報

地板
ID:413389 發表于 2018-10-22 01:56 | 只看該作者
學習學習
回復

使用道具 舉報

5#
ID:428400 發表于 2019-11-7 19:01 | 只看該作者
謝謝分享!
回復

使用道具 舉報

6#
ID:727588 發表于 2020-4-13 09:26 | 只看該作者
繼續學習,感謝大師分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产鲁一鲁一区二区张丽 | 国产色 | 国产精品视频在线播放 | 蜜桃精品视频在线 | 超碰在线影院 | 中文字幕在线看 | 欧美日韩不卡合集视频 | 欧美精品一区二区三区一线天视频 | 亚洲一一在线 | 日韩精品在线一区 | 成人在线视频一区 | 国产精品久久二区 | 欧美成人自拍 | 欧美久久久久久久久中文字幕 | 久久久一| 中文字幕一区二区三区四区五区 | 欧美成人精品一区二区男人看 | cao在线 | 国产精品久久九九 | 黄色免费av | 国产精品伦理一区二区三区 | 精品国产18久久久久久二百 | 农村真人裸体丰满少妇毛片 | 久久久久se| 亚洲精品自在在线观看 | 久久久激情视频 | 99精品视频免费观看 | 成人在线中文字幕 | 久久新视频 | 久久999| 欧美在线视频不卡 | 久久99精品久久久久 | 久久专区 | 国产精品久久久久久久久图文区 | 操一草| 伊人网99 | 久久新视频 | 国产999精品久久久 午夜天堂精品久久久久 | 日韩精品免费一区 | 日韩电影一区 | 365夜爽爽欧美性午夜免费视频 |