找回密码
 立即注册

QQ登录

只需一步,快速开始

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

帮忙看看程序有什么问题,用protuse仿真串口接收不到信息

[复制链接]
跳转到指定楼层
#
ID:347760 发表于 2018-7-2 16:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
100黑币
具体是用串口不间断发送ASCII  回车(CR)  换行(LF)  数字  数字 数字  小数点 数字 数字
  但是仿真时接收不到

  1. #include <iom32v.h>
  2. #include <macros.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define CR 0x0D
  6. #define LF 0x0A
  7. #define H_Bit(val, bitn)  (val |=(1<<(bitn))) // bitn位置1
  8. #define L_Bit(val, bitn)  (val&=~(1<<(bitn))) // bitn位置0
  9. #define G_Bit(val, bitn)  (val &(1<<(bitn)) ) //取bitn的值
  10. #define time_bps()  {while(!flag_bps);flag_bps=0;}  //波特率延时
  11. uchar bit_c=0;                                           //数码管位选
  12. uchar bit_data[3];                                        //数码管(四)显示数据
  13. uchar Dp_flag_L=0;                       //精确0.01小数点
  14. uchar Dp_flag_H=0;                       //精确0.1小数点
  15. uchar Dp_flag_D=0;                       //调试功能小数点
  16. uchar Dp_flag=0;                     //数码管小数点总标志位

  17. uint counter=0;
  18. uint counter_2ms=0;
  19. uint counter_20ms=0;
  20. int k=0;
  21. uchar const show[]={0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  22.                     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  23.                                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  24.                                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  25.                                         0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x3F,0x06,
  26.                                         0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,
  27.                   //  C    H
  28.                                         0x39,0x76                                           };//对应ACSII码

  29. volatile uchar RXD_Data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//用于接收长度为8的数据
  30. volatile uchar RUDR; //接收数据暂存
  31. volatile uchar z=0;                             //接收探头信息计位
  32. uchar TUDR=0;              //模拟IO发送数据缓存区  //UDR
  33. volatile uchar flag_bps=0;       //104us标志位
  34. #define MK_RXD PINA1  //   模拟RXD
  35. #define MK_TXD PIND3  //   模拟TXD



  36. /*************************/
  37. uchar IO_UART_RXD(void) //接收
  38. {  
  39.   uchar i=0x00;
  40.   uchar RUDR=0x00;
  41.   while(G_Bit(PORTA,MK_RXD));
  42.   time_bps();     //延时104US
  43.   while(i<8)
  44.   {
  45.     RUDR>>=1;
  46.     if(G_Bit(PORTA,MK_RXD))  
  47.       {
  48.         RUDR|=0x80;
  49.       }
  50.       i++;
  51.       time_bps();   
  52.   }
  53.      while(!G_Bit(PORTA,MK_RXD));//接收完8位信息
  54.          time_bps();
  55. return RUDR;
  56. }
  57. void rx_com(uchar IO_UART_RXD)
  58. {
  59.   if(IO_UART_RXD==0x0D||IO_UART_RXD==0x0A||k>0) //接收的信息是否为回车或者换行,是则置零
  60.          {            
  61.            k++;
  62.      if(IO_UART_RXD>=0x30&&IO_UART_RXD<=0x39||IO_UART_RXD==0x2E)
  63.             {
  64.                   RXD_Data[z]=IO_UART_RXD;
  65.               z++;
  66.                   if(z=9)
  67.                         {
  68.                           z=0;
  69.                           k=0;
  70.                         }
  71.                  }
  72.           }         
  73. }
  74. void IO_UART_TXD(uchar TXD_Data)    //发送
  75. {
  76.   uchar j;
  77.   uchar TUDR;   //发送缓冲寄存器
  78.   TUDR=TXD_Data;
  79.   L_Bit(PORTD,MK_TXD);//发送起始位START  
  80.   time_bps();
  81.   while(j<8)
  82.    {      
  83.      if(TUDR & 0x01)    //取0x01位的值,先发送低位
  84.        {
  85.              H_Bit(TUDR,MK_TXD);
  86.            }
  87.      else
  88.        {
  89.             L_Bit(TUDR,MK_TXD);
  90.            }
  91.      TUDR>>=1;   
  92.      j++;
  93.            time_bps();   
  94.    }
  95.   H_Bit(PORTD,MK_TXD);//发送STOP信号
  96.   time_bps();
  97. }
  98. void LED_bit()
  99. {
  100.         bit_c++;
  101.         bit_c &= 0x03;                     //0000 0011
  102.         PORTC &= ~0xFF;                                 //0000 0000
  103.         switch(bit_c)
  104.         {        
  105.                 case 0x00:
  106.                                         PORTB&=0xF0;                           //1
  107.                         PORTB|=0x07;         //0000 0111              
  108.                 break;
  109.                 case 0x01:        
  110.                                                 PORTB&=0xF0;                                                   //2
  111.                         PORTB|=0x0B;         //0000 1011  
  112.                 break;
  113.                 case 0x02:        
  114.                                                 PORTB&=0xF0;                                                  //3
  115.                         PORTB|=0x0D;         //0000 1101  
  116.                 break;
  117.                 case 0x03:
  118.                                                 PORTB&=0xF0;                                              //4
  119.                         PORTB|=0x0E;         //0000 1110  
  120.                 break;
  121.                 default:
  122.                                 break;
  123.         }               
  124.         PORTC = show[bit_data[bit_c]];
  125.         if(!Dp_flag)
  126.         {
  127.                if((Dp_flag_D==1)&&(bit_c==0x03))                    //4
  128.                                     PORTC |= 0x80;
  129.                    else if((Dp_flag_L==1)&&(bit_c==0x02))              //3
  130.                                              PORTC |= 0x80;
  131.                         else if((Dp_flag_H==1)&&(bit_c==0x01))             //2
  132.                                                   PORTC |= 0x80;
  133.                              else   PORTC &= ~0x80;
  134.         }
  135. }
  136. void Display()    //显示接收信息
  137. {
  138.   Dp_flag=1;      //小数点标志位开  
  139.   if(RXD_Data[0])  //显示百位,精确0.1  //j=0,1,2,3,4,5分别为百位十位个位
  140.                                            //小数点 0.1位 0.01位
  141.   {  Dp_flag_H=1;
  142.      bit_data[0]=RXD_Data[0];
  143.      bit_data[1]=RXD_Data[1];
  144.          bit_data[2]=RXD_Data[2];
  145.          bit_data[3]=RXD_Data[4];
  146.    }
  147.    else                 //显示十位,精确0.01
  148.    {
  149.      Dp_flag_L=1;
  150.      bit_data[0]=RXD_Data[1];
  151.          bit_data[1]=RXD_Data[2];
  152.          bit_data[2]=RXD_Data[4];
  153.          bit_data[3]=RXD_Data[5];
  154.    }
  155. }
  156. void port_init(void)
  157. {
  158.      PORTA = 0x00;      // PORTA口初始化   
  159.      DDRA  = 0xC1;      //1100 0000 指示灯 置位输出    MK_RXD PA1=0
  160.      PORTB = 0xFF;      // PORTB口初始化  
  161.      DDRB  = 0xFF;       //1111 1111
  162.      PORTC = 0x00;          //PORTC口初始化
  163.      DDRC  = 0xFF;           //11111111  数码管 置位输出               
  164.      PORTD = 0x04;          // 0000 0100  PORTD口初始化   
  165.      DDRD  = 0xBA;           //1011 1010   //MK_TXD PD3=1/声光报警 PD4=1
  166. }


  167. void timer0_init(void)  //定时器0
  168. {
  169.    TCCR0 = 0x00;
  170.    TCNT0 = 0x98;
  171.    TCCR0 = 0x02;
  172. }
  173. void init_devices(void)
  174. {

  175. CLI();
  176. port_init();
  177. timer0_init();

  178. MCUCR = 0x00;
  179. GICR  = 0x00;
  180. TIMSK = 0x01;
  181. SEI();
  182. }

  183. #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
  184. void timer0_ovf_isr(void)
  185. {
  186.   #asm("cli")      //关全局中断
  187.   TCNT0=0x98;  
  188.   #asm("sei")   //开全局中断
  189.   flag_bps=1; // 波特率计时标志位  
  190.    if(++counter_2ms>=20)  //每2ms刷新一次数码管
  191.      {
  192.       LED_bit();
  193.        counter_2ms=0;
  194.        counter_20ms++;
  195.      }   
  196. }




  197. void main(void)
  198. {

  199. init_devices();

  200.    while(1);


  201. }
复制代码


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

使用道具 举报

6#
ID:347760 发表于 2018-7-3 13:51 | 只看该作者
jikai555 发表于 2018-7-3 11:16
串口想要收到数据是要串口中断的,其次看一下你的引脚有没有串口的功能,再看一下是不是复用,又没有选择使 ...

哥,请了解下啥叫模拟串口谢谢
回复

使用道具 举报

5#
ID:363818 发表于 2018-7-3 11:16 | 只看该作者
串口想要收到数据是要串口中断的,其次看一下你的引脚有没有串口的功能,再看一下是不是复用,又没有选择使用串口功能,tx,rx有没有反接,常见问题大概就这些,还有波特率,中断的校验,是不是校验不对
回复

使用道具 举报

地板
ID:347760 发表于 2018-7-3 09:20 | 只看该作者
码农改变世界 发表于 2018-7-2 18:57
串口中断打开没,还有全局中断

模拟串口还有串口中断?
回复

使用道具 举报

板凳
ID:249033 发表于 2018-7-2 21:47 | 只看该作者
串口中断打开没,还有全局中断
回复

使用道具 举报

沙发
ID:363495 发表于 2018-7-2 20:40 | 只看该作者
串口的问题吧
回复

使用道具 举报

楼主
ID:231449 发表于 2018-7-2 18:57 | 只看该作者
串口中断打开没,还有全局中断
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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