找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2537|回复: 0
打印 上一主题 下一主题
收起左侧

请问各位我用STC12C5A60S2芯片无法进行串口通信

[复制链接]
跳转到指定楼层
楼主
ID:170418 发表于 2017-5-14 23:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问一下大家,我想通过STC12C5A60S2串口通信像12864液晶屏发送中文字符,却没办法在中文屏中显示,所以想问问大家到底是哪里除了问题。
代码如下









  1. #include<include.h>


  2. sbit RXD=P3^0;
  3. sbit TXD=P3^1;

  4. bit Flage_Receive_Ok,Receive;
  5. uint idata receive_count;
  6. uchar xdata uart_buff[205]={0};

  7. /*****************************************************
  8. "广告屏串口命令功能:"
  9. "help----帮助命令。"
  10. "ad*:&-----发送广告词,“*”为1~5时,写入缓冲区和EEPROM第“*”条广告地址;“*”不为1~5时,只写入缓冲区。“&”为广告词。"
  11. "cmd:1-----查看EEPROM中保存的广告词。"
  12. "cmd:2*----删除EEPROM中保存的广告词。"        
  13. "cmd:3*----选择需要显示的广告词,“*”为1~5的数字。"        
  14. "cmd:4-----查看当前时间。"
  15. "cmd:5*----设置当前时间,“*”为时间,格式:2016-1-05-05-05-05-05(2016年周一05月05日05时05分05秒)。"        
  16. "命令格式:*命令$"
  17. *****************************************************/
  18. unsigned char code help1                                        []={"广告屏串口命令功能:"};
  19. unsigned char code help2                                        []={"help------帮助命令。"};
  20. unsigned char code help3                                        []={"ad*:&-----发送广告词,“*”为1-5时,写入缓冲区和EEPROM第“*”条广告词地址;“*”不为1-5时,只写入缓冲区。“&”为广告词。"};
  21. unsigned char code help4                                        []={"cmd:1-----查看EEPROM中保存的广告词。返回格式:序号(EEPROM广告词序号):数据"};
  22. unsigned char code help5                                        []={"cmd:2*----删除EEPROM中保存的广告词。"};        
  23. unsigned char code help6                                        []={"cmd:3*----选择需要显示的广告词,“*”为1~5的数字。"};        
  24. unsigned char code help7                                        []={"cmd:4-----查看当前时间。"};
  25. unsigned char code help8                                        []={"cmd:5*----设置当前时间,“*”为时间,格式:2016-01-05-05-05-05-05(2016年周一05月05日05时05分05秒)。"};        
  26. unsigned char code help9                                        []={"命令格式:*命令$"};

  27. /*****************************************************
  28. 不同命令下的串口提示信息
  29. *****************************************************/
  30. unsigned char code uart_save_ad   []={"写入广告词成功!"};
  31. unsigned char code uart_show_ad   []={"EEPROM中的广告词:"};
  32. unsigned char code uart_set_ad    []={"选择广告词成功!"};
  33. unsigned char code uart_dele_ad1  []={"EEPROM中无广告词可删!"};
  34. unsigned char code uart_dele_ad2  []={"删除广告词成功!"};
  35. unsigned char code uart_show_time []={"当前时间为:"};
  36. unsigned char code uart_set_time  []={"设置时间成功!"};


  37. /*****************************************************
  38. 函数名:timer0_uart_init
  39. 功能:定时器0、串口初始化
  40. 参数:void
  41. 返回值:void
  42. 变量:
  43. *****************************************************/
  44. void timer0_uart_init()
  45. {
  46.          //定时器初始化
  47.    TMOD = 0x21;
  48.          //初始化化定时1ms
  49.    TH0 = 0x0FC;
  50.    TL0 = 0x066;
  51.          //EA = 1;
  52.    ET0 = 1;
  53.    TR0 = 1;
  54.         
  55.          //串口初始化  
  56.          //TMOD=0x20;
  57.    TH1=0xfd;
  58.    TL1=0xfd;
  59.    SM0=0;
  60.    SM1=1;               
  61.          RI=0;
  62.          TI=0;
  63.    REN=1;
  64.          ES=1;
  65.    TR1=1;        
  66.         
  67.          //开总中断
  68.    EA=1;  
  69. }

  70. /*****************************************************
  71. 函数名:send_LF_CR
  72. 功能:向串口发送回车、换行符
  73. 参数:void
  74. 返回值:void
  75. 变量:
  76. *****************************************************/
  77. void send_LF_CR()
  78. {
  79.                 SBUF = 0x0d;
  80.                 while(!TI);
  81.                 TI=0;
  82.                 SBUF = 0x0a;
  83.                 while(!TI);
  84.                 TI=0;
  85. }
  86. /*****************************************************
  87. 函数名:send_help
  88. 功能:发送串口命令帮助
  89. 参数:void
  90. 返回值:void
  91. 变量:
  92. *****************************************************/
  93. void send_help()
  94. {
  95.                 uint i;
  96.                 //发送回车换行
  97.                 send_LF_CR();
  98.                 //发送help内容
  99.                 for(i=0;i<strlen(help1);i++)
  100.                 {
  101.                         SBUF=help1[i];
  102.                         while(!TI);
  103.                                 TI=0;               
  104.                 }
  105.                 send_LF_CR();
  106.                 for(i=0;i<strlen(help2);i++)
  107.                 {
  108.                         SBUF=help2[i];
  109.                         while(!TI);
  110.                                 TI=0;               
  111.                 }
  112.                 send_LF_CR();
  113.                 for(i=0;i<strlen(help3);i++)
  114.                 {
  115.                         SBUF=help3[i];
  116.                         while(!TI);
  117.                                 TI=0;               
  118.                 }
  119.                 send_LF_CR();
  120.                 for(i=0;i<strlen(help4);i++)
  121.                 {
  122.                         SBUF=help4[i];
  123.                         while(!TI);
  124.                                 TI=0;               
  125.                 }
  126.                 send_LF_CR();
  127.                 for(i=0;i<strlen(help5);i++)
  128.                 {
  129.                         SBUF=help5[i];
  130.                         while(!TI);
  131.                                 TI=0;               
  132.                 }
  133.                 send_LF_CR();
  134.                 for(i=0;i<strlen(help6);i++)
  135.                 {
  136.                         SBUF=help6[i];
  137.                         while(!TI);
  138.                                 TI=0;               
  139.                 }
  140.                 send_LF_CR();
  141.                 for(i=0;i<strlen(help7);i++)
  142.                 {
  143.                         SBUF=help7[i];
  144.                         while(!TI);
  145.                                 TI=0;               
  146.                 }
  147.                 send_LF_CR();
  148.                 for(i=0;i<strlen(help8);i++)
  149.                 {
  150.                         SBUF=help8[i];
  151.                         while(!TI);
  152.                                 TI=0;               
  153.                 }
  154.                 send_LF_CR();
  155.                 for(i=0;i<strlen(help9);i++)
  156.                 {
  157.                         SBUF=help9[i];
  158.                         while(!TI);
  159.                                 TI=0;               
  160.                 }
  161.                 send_LF_CR();
  162. }


  163. /*****************************************************
  164. 函数名:uart_control
  165. 功能:串口控制函数,执行串口命令
  166. 参数:void
  167. 返回值:void
  168. 变量:
  169. *****************************************************/
  170. void uart_control()
  171. {        
  172.                 uint i,j;
  173.                 if(Flage_Receive_Ok==1)
  174.                 {
  175.                         ES=0;        
  176.                         send_LF_CR();                        
  177.                         for(j=0;j<receive_count;j++)
  178.                         {
  179.                           SBUF=uart_buff[j];
  180.                           while(!TI);
  181.                       TI=0;                  
  182.                         }
  183.                         //接收到的数据为广告数据
  184.                         if((uart_buff[0]=='a')&&(uart_buff[1]=='d')&&(uart_buff[3]==':'))
  185.                         {
  186.                                 input=receive_count-4;
  187.                                 
  188.                                 for(i=0;i<input;i++)
  189.                                         store[i]=uart_buff[i+4];
  190.                                                 begin = 0;
  191.                                 one_save = 0;
  192.                                 /****************************************************
  193.                                 指定保存地址才进行写入到EEPROM,否则只存入显示缓冲区
  194.                                  uart_buff[2]中的值对应EEPROM的广告保存地址
  195.                                 *********uart_buff[2]***********EEPROM地址***********
  196.                                                                                         1                                                                                         3
  197.                                                                                         2                                                                                         6
  198.                                                                                         3                                                                                   9
  199.                                                                                         4                                                                                        12
  200.                                                                                         5                                                                                        15                                       
  201.                                 *****************************************************/
  202.                                 if(((uart_buff[2]-'0')>=1)&&((uart_buff[2]-'0')<=5))        
  203.                                 {                                       
  204.                                                 i = uart_buff[2]-'0'-1;
  205.                                                 
  206.                                                 if((i<2)||((i==2)&&(input<=88)))
  207.                                                 {                                                               
  208.                                                         for(j=0; j< USING_CHAR_NUM; j++)
  209.                                                                 eepromBUF[j] = IapReadByte(IAP_ADDRESS+j);
  210.                                                         if((eepromBUF[0]<5)&&(eepromBUF[IAP_ADDRESS+3+i*3]==0))
  211.                                                                 eepromBUF[0] = eepromBUF[0]+1;//广告词数加1
  212.                                                         eepromBUF[IAP_ADDRESS+3+i*3] = input;//修改广告词长度
  213.                                                         
  214.                                                         for(j=0;j< input; j++)                                                                        
  215.                                                                         eepromBUF[24+i*200+j] = store[j];        
  216.                                                         
  217.                                                         IapEraseSector(IAP_ADDRESS);
  218.                                                         //写入EEPROM
  219.                                                         for(j=0; j< USING_CHAR_NUM; j++)                                                        
  220.                                                                  IapProgramByte(IAP_ADDRESS+j,eepromBUF[j]);                                                                 
  221.                                                 }
  222.                                                 else if((i==2)&&(input>88))
  223.                                                 {
  224.                                                         //写第一个扇区
  225.                                                         for(j=0; j< USING_CHAR_NUM; j++)
  226.                                                                 eepromBUF[j] = IapReadByte(IAP_ADDRESS+j);
  227.                                                         if((eepromBUF[0]<5)&&(eepromBUF[IAP_ADDRESS+3+i*3]==0))
  228.                                                                 eepromBUF[0] = eepromBUF[0]+1;//广告词数加1
  229.                                                         eepromBUF[IAP_ADDRESS+3+i*3] = input;//修改广告词长度
  230.                                                         
  231.                                                         for(j=0;j< 88; j++)                                                                        
  232.                                                                         eepromBUF[424+j] = store[j];        
  233.                                                         
  234.                                                         IapEraseSector(IAP_ADDRESS);
  235.                                                         //写入EEPROM
  236.                                                         for(j=0; j< USING_CHAR_NUM; j++)                                                        
  237.                                                                  IapProgramByte(IAP_ADDRESS+j,eepromBUF[j]);
  238.                                                         
  239.                                                         //写第二个扇区                                                                        
  240.                                                         for(j=0; j< USING_CHAR_NUM; j++)
  241.                                                                 eepromBUF[j] = IapReadByte(IAP_ADDRESS1+j);
  242.                                                         
  243.                                                         for(j=0;j<(input-88); j++)                                                                        
  244.                                                                         eepromBUF[j] = store[j+88];        
  245.                                                         
  246.                                                         IapEraseSector(IAP_ADDRESS1);
  247.                                                         
  248.                                                         //写入EEPROM
  249.                                                         for(j=0; j< USING_CHAR_NUM; j++)                                                        
  250.                                                                  IapProgramByte(IAP_ADDRESS1+j,eepromBUF[j]);                                                                        
  251.                                                 }
  252.                                                 else if(i>2)
  253.                                                 {
  254.                                                         //写第一个扇区
  255.                                                         for(j=0; j< USING_CHAR_NUM; j++)
  256.                                                                 eepromBUF[j] = IapReadByte(IAP_ADDRESS+j);
  257.                                                         if((eepromBUF[0]<5)&&(eepromBUF[IAP_ADDRESS+3+i*3]==0))
  258.                                                                 eepromBUF[0] = eepromBUF[0]+1;//广告词数加1
  259.                                                         eepromBUF[IAP_ADDRESS+3+i*3] = input;//修改广告词长度
  260.                                                                                                                                 
  261.                                                         IapEraseSector(IAP_ADDRESS);
  262.                                                         //写入EEPROM
  263.                                                         for(j=0; j< USING_CHAR_NUM; j++)                                                        
  264.                                                                  IapProgramByte(IAP_ADDRESS+j,eepromBUF[j]);
  265.                                                         
  266.                                                         EepromWriteByte(i*200+24,store,200);
  267.                                                 }
  268.                                 }                                
  269.                                 
  270.                         }

  271.                         /***************************************************************
  272.                         *******************接收到的数据为命令数据***********************
  273.                         命令数据格式:
  274.                         uart_buff[0]  uart_buff[1]  uart_buff[2]  uart_buff[3]  uart_buff[4]  uart_buff[5~]
  275.                                         'c'                                                'm'                                                'd'                                                ':'                                                '1-5'                                "数据"        
  276.                         
  277.                         ----------------------------------------------------------------------------------
  278.                         "cmd:1-----查看EEPROM中保存的广告词。"
  279.                         "cmd:2*----删除EEPROM中保存的广告词。"        
  280.                         "cmd:3*----选择需要显示的广告词,“*”为1~5的数字。"        
  281.                         "cmd:4-----查看当前时间。"
  282.                         "cmd:5*----设置当前时间,“*”为时间,格式:2016-1-05-05-05-05-05(2016年周一05月05日05时05分05秒)。"
  283.                         ***************************************************************/
  284.                         else if((uart_buff[0]=='c')&&(uart_buff[1]=='m')&&(uart_buff[2]=='d')&&(uart_buff[3]==':'))
  285.                         {
  286.                                 //判断命令号,即uart_buff[4]中的内容
  287.                                 switch(uart_buff[4])
  288.                                 {
  289.                                         case '1':        //一号命令,发送广告数据
  290.                                                 send_LF_CR();
  291.                                                 for(i=0;i<strlen(uart_show_ad);i++)
  292.                                                 {
  293.                                                         SBUF=uart_show_ad[i];
  294.                                                         while(!TI);
  295.                                                                 TI=0;               
  296.                                                 }                                                               
  297.                                                 ad_index.AD_number = IapReadByte(IAP_ADDRESS);                                                
  298.                                                 if((ad_index.AD_number) > 0)
  299.                                                 {
  300.                                                         for(i=0,j=0;i<5;i++)
  301.                                                         {
  302.                                                                 if(IapReadByte(IAP_ADDRESS+3+i*3) !=0)
  303.                                                                 {
  304.                                                                         (ad_index.addr_buff+j)->addr = (IapReadByte(IAP_ADDRESS+1+i*3)<<8) | IapReadByte(IAP_ADDRESS+2+i*3);
  305.                                                                         (ad_index.addr_buff+j)->len_addr = IAP_ADDRESS+3+i*3 ;                                                
  306.                                                                         (ad_index.addr_buff+j)->len  =  IapReadByte(IAP_ADDRESS+3+i*3);
  307.                                                                         j++;
  308.                                                                 }
  309.                                                         }
  310.                                                         send_LF_CR();                                                        
  311.                                                         for(i=0;i<ad_index.AD_number;i++)
  312.                                                         {
  313.                                                                 SBUF = i+1+'0';
  314.                                                                 while(!TI);
  315.                                                                 TI=0;        
  316.                                                                 SBUF = '(';
  317.                                                                 while(!TI);
  318.                                                                 TI=0;        
  319.                                                                 SBUF = (((ad_index.addr_buff+i)->len_addr)/3)+'0';
  320.                                                                 while(!TI);
  321.                                                                 TI=0;               
  322.                                                                 SBUF = ')';
  323.                                                                 while(!TI);
  324.                                                                 TI=0;                                                                        
  325.                                                                 SBUF = ':';
  326.                                                                 while(!TI);
  327.                                                                 TI=0;                                                               
  328.                                                                 for(j=0;j<((ad_index.addr_buff+i)->len);j++)
  329.                                                                 {
  330.                                                                         SBUF = IapReadByte(((ad_index.addr_buff+i)->addr)+j);
  331.                                                                         while(!TI);
  332.                                                                         TI=0;
  333.                                                                 }        
  334.                                                                 send_LF_CR();                                                               
  335.                                                         }
  336.                                                 }                                
  337.                                                 break;
  338.                                         case '2'://2号命令删除第uart_buff[5]条广告词
  339.                                         ad_index.AD_number = IapReadByte(IAP_ADDRESS);        
  340.                                         if(ad_index.AD_number > 0)
  341.                                         {        
  342.                                                 for(i=0,j=0;i<5;i++)
  343.                                                 {
  344.                                                         if(IapReadByte(IAP_ADDRESS+3+i*3) !=0)
  345.                                                         {
  346.                                                                 (ad_index.addr_buff+j)->addr = (IapReadByte(IAP_ADDRESS+1+i*3)<<8) | IapReadByte(IAP_ADDRESS+2+i*3);
  347.                                                                 (ad_index.addr_buff+j)->len_addr = IAP_ADDRESS+3+i*3 ;                                                
  348.                                                                 (ad_index.addr_buff+j)->len  =  IapReadByte(IAP_ADDRESS+3+i*3);
  349.                                                                 j++;
  350.                                                         }
  351.                                                 }
  352.                                                         
  353.                                                 for(i=0;i<ad_index.AD_number;i++)
  354.                                                 {
  355.                                                         if(((ad_index.addr_buff+i)->len_addr) == (uart_buff[5]-'0')*3)
  356.                                                         {
  357.                                                                 (ad_index.addr_buff+i)->len = 0;
  358.                                                                  break;
  359.                                                         }
  360.                                                         
  361.                                                 }
  362.                                                 (ad_index.AD_number)--;
  363.                                                 
  364.                                                 EepromWriteByte((ad_index.addr_buff+i)->len_addr,(uchar *)(&((ad_index.addr_buff+i)->len)),1);//广告词长度清零
  365.                                                 EepromWriteByte(IAP_ADDRESS,(uchar *)(&(ad_index.AD_number)),1);//写入广告总数               

  366.                                                 send_LF_CR();
  367.                                                 for(i=0;i<strlen(uart_dele_ad2);i++)
  368.                                                 {
  369.                                                         SBUF=uart_dele_ad2[i];
  370.                                                         while(!TI);
  371.                                                                 TI=0;               
  372.                                                 }                                                
  373.                                         }
  374.                                         else
  375.                                         {
  376.                                                 send_LF_CR();
  377.                                                 for(i=0;i<strlen(uart_dele_ad1);i++)
  378.                                                 {
  379.                                                         SBUF=uart_dele_ad1[i];
  380.                                                         while(!TI);
  381.                                                                 TI=0;               
  382.                                                 }
  383.                                         }                                       
  384.                                                 break;
  385.                                         case '3':        //3号命令选择显示第uart_buff[5]条广告词

  386.                                         for(i=0;i<((ad_index.addr_buff+(uart_buff[5]-'0')-1)->len);i++)                                
  387.                                                         store[i] = IapReadByte(((ad_index.addr_buff+(uart_buff[5]-'0')-1)->addr)+i);        
  388.                                         input = (ad_index.addr_buff+(uart_buff[5]-'0')-1)->len;

  389.                                                 send_LF_CR();
  390.                                                 for(i=0;i<strlen(uart_set_ad);i++)
  391.                                                 {
  392.                                                         SBUF=uart_set_ad[i];
  393.                                                         while(!TI);
  394.                                                                 TI=0;               
  395.                                                 }
  396.                                                 end =0;
  397.                                                 begin = 0;
  398.                                                 page = 0;
  399.                                                 AD_delete = 0;
  400.                                                 page_data = 0;                                       
  401.                                                 WriteCommandLCD(0x01,1);        
  402.                                                 function = 0;
  403.                                                 
  404.                                                 break;
  405.                                         case '4':        //4号命令查看当前时间
  406.                                                 send_LF_CR();
  407.                                                 for(i=0;i<strlen(uart_show_time);i++)
  408.                                                 {
  409.                                                         SBUF=uart_show_time[i];
  410.                                                         while(!TI);
  411.                                                                 TI=0;               
  412.                                                 }
  413.                                                 SBUF = 2 +'0';
  414.                                                 while(!TI);
  415.                                                         TI=0;        
  416.                                                 SBUF = '0';
  417.                                                 while(!TI);
  418.                                                         TI=0;        
  419.                                                 for(i=0;i<7;i++)
  420.                                                 {
  421.                                                         if(i!= 1)
  422.                                                         {
  423.                                                                 SBUF = (TIME[6-i]>>4)+'0';
  424.                                                                 while(!TI);
  425.                                                                         TI=0;                                                        
  426.                                                                 SBUF = (TIME[6-i]&0x0f)+'0';
  427.                                                                 while(!TI);
  428.                                                                         TI=0;        
  429.                                                                 SBUF = TimeType[13-i*2-1];
  430.                                                                 while(!TI);
  431.                                                                         TI=0;        
  432.                                                                 SBUF = TimeType[13-i*2];
  433.                                                                 while(!TI);
  434.                                                                         TI=0;
  435.                                                         }
  436.                                                         else{
  437.                                                                 SBUF = TimeType[13-i*2-1];
  438.                                                                 while(!TI);
  439.                                                                         TI=0;
  440.                                                                 SBUF = TimeType[13-i*2];
  441.                                                                 while(!TI);
  442.                                                                         TI=0;        
  443.                
  444.                                                                 SBUF = TimeWeekType[(TIME[6-i]-1)*2];
  445.                                                                 while(!TI);
  446.                                                                         TI=0;
  447.                                                                 SBUF = TimeWeekType[(TIME[6-i]-1)*2+1];
  448.                                                                 while(!TI);
  449.                                                                         TI=0;                                                                        
  450.                                                         }
  451.                                                 }                                                                                                                                       
  452.                                                 break;        
  453.                                         case '5':        //5号命令设置时间,时间数据在uart_buff[5~26],格式:2016-1-05-05-05-05-05
  454.                                                 
  455.                                                 for(i=0;i<7;i++)
  456.                                                 {
  457.                                                         TIME[i] = ((uart_buff[25-i*3]-'0')<<4)+(uart_buff[26-i*3]-'0');         
  458.                                                 }

  459.                                                 Ds1302Init();        
  460.                                                 
  461.                                                 send_LF_CR();
  462.                                                 for(i=0;i<strlen(uart_set_time);i++)
  463.                                                 {
  464.                                                         SBUF = uart_set_time[i];
  465.                                                         while(!TI);
  466.                                                                 TI=0;               
  467.                                                 }
  468.                                                 
  469.                                                 break;                                       
  470.                                         default:
  471.                                                 break;

  472.                                 }
  473.                         }
  474.                         else if((uart_buff[0]=='h')&&(uart_buff[1]=='e')&&(uart_buff[2]=='l')&&(uart_buff[3]=='p'))
  475.                         {
  476.                                         send_help();               
  477.                         }
  478.                  //清楚uart_buff[1~4]内容                        
  479.                  for(i=0;i<4;i++)
  480.                                 uart_buff[i]=0;               
  481.                  //清楚接收标志位
  482.                  receive_count = 0;
  483.                  Flage_Receive_Ok = 0;
  484.                  ES=1;               
  485.                 }        

  486. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表