找回密码
 立即注册
查看: 361|回复: 6

我想用一线通讯,输出来的为什么不是方波

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-04-27 18:22:16

18

主题

30

回帖

476

积分

中级会员

积分
476
发表于 2024-6-29 14:51:12 | 显示全部楼层 |阅读模式
本来是个stm的部分代码,我想把它逻辑移植到stc上。但是stm的输出的是方波完全是高低电平,我输出的是山谷带尖。
还在学习中,望大佬指教一下。
转过来后时间周期差不多

STM.jpg stc.jpg
  1. #include "comm\STC32G.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. typedef         unsigned char        u8;
  5. typedef         unsigned int        u16;
  6. typedef         unsigned long        u32;
  7. #define MAIN_Fosc        12000000UL
  8. /****************************** 用户定义宏 ***********************************/
  9. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒
  10. #if (MAIN_Fosc >= 40000000L)
  11.     #define                usrNOP()    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
  12. #elif (MAIN_Fosc >= 36000000L)
  13.     #define                usrNOP()    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
  14. #elif (MAIN_Fosc >= 30000000L)
  15.     #define                usrNOP()    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
  16. #elif (MAIN_Fosc >= 24000000L)
  17.     #define                usrNOP()    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
  18. #elif (MAIN_Fosc >= 20000000L)
  19.     #define                usrNOP()    _nop_();_nop_();_nop_();_nop_();_nop_()
  20. #elif (MAIN_Fosc >= 18000000L)
  21.     #define                usrNOP()    _nop_();_nop_();_nop_();_nop_()
  22. #elif (MAIN_Fosc >= 12000000L)
  23.     #define                usrNOP()    _nop_();_nop_();_nop_()
  24. #elif (MAIN_Fosc >= 6000000L)
  25.     #define                usrNOP()    _nop_();_nop_()
  26. #else
  27.     #define                usrNOP()    _nop_()
  28. #endif
  29. sbit DQ = P1^3;  
  30. u8 USB_databuf[10] = {0x9E, 0xA0, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x84};
  31. u8 upan_runstep = 0;
  32. /*****************************************************************************/
  33. /*************  本地常量声明    **************/
  34. /*************  本地变量声明    **************/
  35. bit B_1ms;          //1ms标志
  36. u16 msecond,second;
  37. /*************  本地函数声明    **************/
  38. u8 Reverse_Byte(u8 dat);
  39. u8 CanReadReg(u8 addr);
  40. void delay_us(u8 us);
  41. void Upan_Txd_Function(u8 devicestatus);
  42. void Upan_Rxd_Function(void);
  43. void Upan_Txd_FristStart(void);
  44. void WriteBit(u8 State);
  45. void Start_Bit(void);
  46. void End_Bit(void);
  47. void WriteByte(u8 dat);
  48. void Delay100Xus(u8 count);        //@12.000MHz
  49. /********************* 主函数 *************************/
  50. void main(void)
  51. {
  52.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  53.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  54.     CKCON = 0; //提高访问XRAM速度
  55.     P0M0 = 0x00; P0M1 = 0x00;
  56.     P1M0 = 0x00; P1M1 = 0x00;
  57.     P2M0 = 0x00; P2M1 = 0x00;
  58.     P3M0 = 0x00; P3M1 = 0x00;
  59.     P4M0 = 0x00; P4M1 = 0x00;
  60.     P5M0 = 0x00; P5M1 = 0x00;
  61.     P6M0 = 0x00; P6M1 = 0x00;
  62.     P7M0 = 0x00; P7M1 = 0x00;
  63.         P35=0;
  64.         second=0;
  65.        
  66.         AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
  67.     TH0 = (u8)(Timer0_Reload / 256);
  68.     TL0 = (u8)(Timer0_Reload % 256);
  69.     ET0 = 1;    //Timer0 interrupt enable
  70.     TR0 = 1;    //Tiner0 run
  71.     EA = 1;     //打开总中断
  72.        
  73.      while(1)
  74.     {
  75.         if(B_1ms)   //1ms到
  76.         {
  77.             B_1ms = 0;
  78.             if(++msecond >= 150)   
  79.             {
  80.                 P35=~P35;
  81.                                 Upan_Txd_FristStart();
  82.                                 Upan_Txd_Function(1);
  83.                
  84.             }
  85.         }
  86.     }
  87. }
  88. //========================================================================
  89. // 函数: void  delay_us(u8 us)
  90. // 描述: 延时函数。
  91. // 参数: us,要延时的us数, 这里只支持1~255us.
  92. // 返回: none.
  93. // 版本: VER1.0
  94. // 日期: 2013-4-1
  95. // 备注:
  96. //========================================================================
  97. void delay_us(u8 us)
  98. {
  99.     do{
  100.         usrNOP();
  101.         usrNOP();
  102.     }while(--us);
  103. }
  104. /********************** Timer0 1ms中断函数 ************************/
  105. void timer0 (void) interrupt 1
  106. {
  107.     B_1ms = 1;      //1ms标志
  108. }
  109. void Upan_Txd_Function(u8 devicestatus)
  110. {
  111.     u8 num = 0;
  112.     if( upan_runstep == 8 ){
  113.         USB_databuf[1] = Reverse_Byte(devicestatus);
  114.         Start_Bit();
  115.         for(num = 0; num < 10;  num ++)
  116.         {
  117.             WriteByte(USB_databuf[num]);
  118.         }
  119.         End_Bit();
  120.     }
  121. }
  122. void Upan_Txd_FristStart(void)
  123. {
  124.     if( upan_runstep ==0 )
  125.     {
  126.         P13=1;
  127.         Delay100Xus(320);
  128.         P13=0;
  129.         upan_runstep++;     
  130.     }
  131.     else if( upan_runstep == 7 )
  132.     {
  133.         P13=1;
  134.         Delay100Xus(4);
  135.         P13=0;
  136.         upan_runstep++;      
  137.     }
  138.     else if( upan_runstep == 8 )
  139.     {
  140.         ;      
  141.     }
  142.     else
  143.     {
  144.         upan_runstep++;
  145.     }   
  146. }
  147. u8 Reverse_Byte(u8 dat)
  148. {
  149.     u8 temp = 0;
  150.         u8 i ;
  151.     for(i = 0; i < 8; i++)
  152.     {
  153.         temp = ((dat>>i) & 0x01) | temp;
  154.         if(i < 7)
  155.         {
  156.             temp = temp << 1;
  157.         }
  158.     }
  159.     return temp;
  160. }
  161. void Start_Bit(void)
  162. {
  163.     u8 num = 0;
  164.     P13=0;
  165.    
  166.     for(num = 0; num < 10;  num ++)
  167.     {
  168.          Delay100Xus(10);
  169.     }
  170. }
  171. void End_Bit(void)
  172. {
  173.     P13=1;
  174.      Delay100Xus(4);
  175.     P13=0;
  176.      Delay100Xus(12);
  177. }
  178. void WriteBit(u8 State)
  179. {
  180.     P13=1;
  181.     if(State == 1)
  182.     {
  183.          Delay100Xus(12);
  184.         P13=0;
  185.          Delay100Xus(4);
  186.     }
  187.     else
  188.     {
  189.          Delay100Xus(4);
  190.         P13=0;
  191.          Delay100Xus(12);
  192.     }
  193.     P13=1;
  194. }
  195. void WriteByte(u8 dat)
  196. {
  197.     u8 i=0;
  198.   
  199.     for(i=0;i<8;i++)
  200.     {
  201.         if(dat&0x80)
  202.         {
  203.            WriteBit(1);
  204.         }
  205.         else
  206.         {
  207.            WriteBit(0);
  208.         }
  209.         dat=dat<<1;
  210.     }
  211. }
  212. void Delay100Xus(u8 count)        //@12.000MHz
  213. {
  214.         u8 num = 0;
  215.         for(num = 0; num < count;  num ++)
  216.         {
  217.         unsigned long edata i;
  218.         _nop_();
  219.         _nop_();
  220.         _nop_();
  221.         i = 298UL;
  222.         while (i) i--;
  223.         }
  224. }
复制代码


QT上位机小佬,努力学习嵌入式中,感谢各位大佬指导
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-6-29 15:13:26 | 显示全部楼层
道理很简单,你STM32的GPIO设置的模式是PP_OUT,而STC32设置的是准双向内部弱上拉,这样由于口线高电平靠弱上拉来实现,影响了上升沿的斜率,看起来就成三角波了,建议配置P13端口的内部强4k上拉,或者设置为推拉输出模式。
睁开眼睛做场梦~~~
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-04-27 18:22:16

18

主题

30

回帖

476

积分

中级会员

积分
476
发表于 2024-6-29 15:57:38 | 显示全部楼层
晓*** 发表于 2024-6-29 15:13
道理很简单,你STM32的GPIO设置的模式是PP_OUT,而STC32设置的是准双向内部弱上拉,这样由于口线高电平靠弱 ...

谢谢谢谢,改成推挽确实好了
微信图片_20240629155648.jpg
QT上位机小佬,努力学习嵌入式中,感谢各位大佬指导
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 2024-6-29 17:18:28 | 显示全部楼层
群里有高人
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2024-6-29 20:00:42 | 显示全部楼层
houy*** 发表于 2024-6-29 15:57
谢谢谢谢,改成推挽确实好了

有高手指导就是好啊!
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-29 08:51:26

4

主题

75

回帖

871

积分

荣誉版主

积分
871
发表于 2024-7-3 15:44:46 来自手机 | 显示全部楼层
这都是模拟电路的基本常知
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:35 , Processed in 0.114508 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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