支持多串口的模拟串口代码

  • A+
所属分类:技术教程

运行在AVR上,把变量封装在结构体,在用结构体指针来访问,还可以无限扩展UART数量呢。

  1. #include <iom32v.h>
  2. #include <macros.h>
  3. #include <string.h>
  4. #includ"Vga_drv.h"
  5. #includ"uart.h"
  6. #includ"Key_Scan.h"
  7. #includ"bmp.h"
  8. #includ"Isr.h"
  9. #includ"ps2_driver.h"
  10. #includ"eeprom.h"
  11. #includ"global.h"
  12. #includ"CRC.h"
  13. #define uint32 unsigned long
  14. #define SC_RXD 6
  15. #define SC_RXD_SET_INPUT() {DDRD&=(~BIT(SC_RXD));}
  16. #define SC_RXD_GET() ((PIND&(BIT(SC_RXD))))
  17. #define SC_TXD 7
  18. #define SC_TXD_0() {PORTD&=(~BIT(SC_TXD));}
  19. #define SC_TXD_1() {PORTD|=BIT(SC_TXD);}
  20. #define SC_TXD_SET_OUTPUT() {DDRD|=BIT(SC_TXD);}
  21. uint8 sc1_rxd_scan_ct=0;
  22. uint8 sc1_rxd_scan_next_time=0;
  23. uint8 sc1_rxd_scan_step=0;
  24. uint8 sc1_rxd_dat;
  25. uint8 sc1_rxd_ready=0;
  26. uint8 sc1_rxd_tmpdat;
  27. uint8 sc_txd_ready=0;//模拟串口变量
  28. uint8 sc_txd_bit_pt=0;
  29. uint8 sc_txd_data=0;
  30. uint8 sc_txd_ct=0;
  31. void SC_Recv_Pro(uint8 dat){
  32. }
  33. void SC_RxdSrv(void){
  34.         if(sc1_rxd_scan_step==0){
  35.                 if(!SC_RXD_GET()){
  36.                         sc1_rxd_scan_step=1;
  37.                         return;
  38.                 }
  39.         }
  40.         if(sc1_rxd_scan_step==1){
  41.                 if(!SC_RXD_GET()){
  42.                         sc1_rxd_scan_step=2;                //rxd start bit ok,goto next step
  43.                         sc1_rxd_scan_ct=0;
  44.                         sc1_rxd_scan_next_time=3;
  45.                         sc1_rxd_tmpdat=0;
  46.                         return;
  47.                 }
  48.                 else{
  49.                         sc1_rxd_scan_step=0;        //rxd start bit is avalid
  50.                         return;
  51.                 }
  52.         }
  53.         if(sc1_rxd_scan_step>=2){
  54.                 sc1_rxd_scan_ct++;
  55.                 if(sc1_rxd_scan_ct<sc1_rxd_scan_next_time) return;
  56.                 sc1_rxd_scan_ct=0;
  57.                 if(sc1_rxd_scan_step<10){
  58.                         sc1_rxd_tmpdat>>=1;
  59.                         if(SC_RXD_GET()){
  60.                                 sc1_rxd_tmpdat|=0x80;
  61.                         }
  62.                         sc1_rxd_scan_step++;
  63.                         return;
  64.                 }
  65.                 if(sc1_rxd_scan_step==10){
  66.                         if(SC_RXD_GET()){
  67.                                 sc1_rxd_dat=sc1_rxd_tmpdat;
  68.                                 sc1_rxd_ready=1;
  69.                                 //Receive a byte OK
  70.                                 #if 0
  71.                                  sc_txd_data=sc1_rxd_dat;
  72.                                  sc_txd_ready=1;
  73.                                  #endif
  74.                                  #if 0
  75.                                  Test_Uart1(sc1_rxd_dat);
  76.                                  #endif
  77.                                  SC_Recv_Pro(sc1_rxd_dat);
  78.                         }
  79.                         sc1_rxd_scan_step=0;
  80.                         return;
  81.                 }
  82.         }
  83. }
  84. void SC_TxdSrv(void){
  85.         sc_txd_ct++;
  86.         if(sc_txd_ct<3) return;
  87.         sc_txd_ct=0;
  88.         if(sc_txd_ready){                                                        //Data Ready
  89.                 if(sc_txd_bit_pt<10){
  90.                         if(sc_txd_bit_pt==0){
  91.                                 SC_TXD_0();                                //Start BIT
  92.                         }
  93.                         else{
  94.                                 if(sc_txd_bit_pt>=9){
  95.                                         SC_TXD_1();                        //End BIT
  96.                                 }
  97.                                 else{                                                        //数据位
  98.                                         if((sc_txd_data>>(sc_txd_bit_pt-1))&0x01){
  99.                                                 SC_TXD_1();
  100.                                         }
  101.                                         else{
  102.                                                 SC_TXD_0();
  103.                                         }
  104.                                 }
  105.                         }
  106.                 }
  107.                 if(sc_txd_bit_pt>10){
  108.                         sc_txd_bit_pt=0;                        //发送完后延时两个时钟,复位各标志
  109.                         sc_txd_ready=0;
  110.                 }
  111.                 else{
  112.                         sc_txd_bit_pt++;                        //位指针自加
  113.                 }
  114.         }
  115. }
  116. void SC_send_char(uint8 b){
  117.          sc_txd_data=b;
  118.          sc_txd_ready=1;
  119.          while(sc_txd_ready==1);
  120. }
  121. void SC_send_str(uint8 *str){
  122.          while((*str)!=0){
  123.                  SC_send_char(*str);
  124.                 str++;
  125.          }
  126. }
  127. void init_SimComIO(void){
  128.         SC_TXD_SET_OUTPUT();
  129.         SC_TXD_1();
  130.         SC_RXD_SET_INPUT();
  131. }
  132. #pragma interrupt_handler ISR_T1:8
  133. void ISR_T1(void)
  134. {
  135. //compare occured TCNT1=OCR1A
  136.         SC_RxdSrv();
  137.         SC_TxdSrv();
  138. }

 

结构体封装多串口

  1. typedef sim_uart_def{
  2. uint8 sc1_rxd_scan_ct;
  3. uint8 sc1_rxd_scan_next_time;
  4. uint8 sc1_rxd_scan_step;
  5. uint8 sc1_rxd_dat;
  6. uint8 sc1_rxd_ready;
  7. uint8 sc1_rxd_tmpdat;
  8. uint8 sc_txd_ready;//模拟串口变量
  9. uint8 sc_txd_bit_pt;
  10. uint8 sc_txd_data;
  11. uint8 sc_txd_ct;
  12. }TYPE_SIM_UART_DEF;
  13. TYPE_SIM_UART_DEF su1,su2,su3,su4,su5,su6;
  14. void SC_RxdSrv(TYPE_SIM_UART_DEF *pSU);
  15. void SC_TxdSrv(TYPE_SIM_UART_DEF *pSU);
图片引用自网络