找回密码
 立即注册

QQ登录

只需一步,快速开始

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

不带ADC的OTP单片机实现电位计控制PWM程序

[复制链接]
跳转到指定楼层
楼主
ID:981957 发表于 2021-12-9 01:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这方案比 555 的便宜, 不用外接他和电阻电容
用两个普通IO口实现读电位器, 调试输出波形
可以达到任何频率
附件的程序用了12F509 做的, 可以直接用在 0.3元的OTP单片机上

单片机源程序如下:
  1. #include <12F509.h>
  2. #fuses INTRC,NOWDT,NOPROTECT, NOMCLR
  3. #use delay(clock=4000000)
  4. #define GP0 PIN_B0
  5. #define GP1 PIN_B1
  6. #define GP2 PIN_B2
  7. #define GP3 PIN_B3
  8. #define GP4 PIN_B4
  9. #define GP5 PIN_B5

  10. #define set_options(value)   {#ASM         \
  11.                               MOVLW  value \
  12.                               OPTION       \
  13.                               #ENDASM}

  14. #define UART_TX_HI() output_high(GP2)
  15. #define UART_TX_LO() output_low(GP2)
  16. #define BitTime 40

  17. void GP5_In()
  18. {
  19.         output_low (GP5);
  20.         set_tris_b(0xfa);

  21. }

  22. void GP5_Out()
  23. {

  24.         set_tris_b(0xda);
  25.         output_high (GP5);
  26. }

  27. unsigned char duty;
  28. unsigned char i;

  29. void cycle_backward (void)
  30. {
  31.    output_low (GP2);
  32.    delay_us (70);
  33.    output_high (GP2);
  34.    delay_us (70);
  35. }

  36. void Get_Pos()
  37. {

  38.         set_tris_b(0xfa); //GP5 input
  39.         while(input(GP5) == 0)
  40.         {
  41.                 duty++;
  42.         }
  43.         set_tris_b(0xda); //GP5 output
  44. }

  45. void GetAdc()
  46. {
  47.         duty = 0;
  48.         output_high(GP4);    //Activate Pullup
  49.        
  50.         while(input(GP5) == 0)
  51.         {
  52.                 duty++;
  53.                 if(duty==255)
  54.                 {
  55.                         output_low(GP4);
  56.                         return;
  57.                 }
  58.         }
  59.         output_low(GP4);   // No pullup
  60. }

  61. void UART_Transmit(unsigned char DataValue)
  62. {
  63.        
  64.         /* Basic Logic
  65.        
  66.         TX pin is usually high. A high to low bit is the starting bit and
  67.         a low to high bit is the ending bit. No parity bit. No flow control.
  68.         BitCount is the number of bits to transmit. Data is transmitted LSB first.
  69.         */
  70.         // Send Start Bit
  71.         UART_TX_LO();
  72.         delay_us(BitTime);   //delay_us(33); //
  73.         for ( i = 0; i < 8; i++ )
  74.         {
  75.         // Set Data pin according to the DataValue
  76.                 if( ((DataValue>>i)&0x1) == 0x1 ) // If Bit is high
  77.                 {
  78.                         UART_TX_HI();
  79.                 }
  80.                 else // If Bit is low
  81.                 {
  82.                         UART_TX_LO();
  83.                 }
  84.                 delay_us(BitTime);  //delay_us(33); //
  85.         }
  86.         // Send Stop Bit
  87.         UART_TX_HI();
  88.         delay_us(BitTime);  //delay_us(33); //
  89. }


  90. /*
  91. REVERT THE HARDWARE TO USING 2 PINS FOR POTENTIOMETER MEASUREMENT
  92. USE A CAPACITOR OF 22PF TO 100PF
  93. USE A TIMER TO HAVE THE PULSE CONTROL

  94. >SETUP TIMER0 SO THAT 256 COUNTS = PULSE PERIOD(1 MSEC)
  95. RUN TIMER 0
  96. WHILE LOOP
  97. >GETADC
  98. >IF DUTY MORE THAN MAX VALUE, ALWAYS ON
  99. >ELSE IF DUTY = 0, ALWAYS OFF
  100. >ELSE IF TIMER COUNT = DUTY, OUTPUT ON
  101.       IF TIMER COUNT = 255, OUTPUT OFF

  102. */


  103. void main()
  104. {
  105.         set_options(0x07);
  106.         set_tris_b(0xfa);                //GP2 and GP0 are outputs
  107.     setup_counters (RTCC_INTERNAL,RTCC_DIV_2);
  108.         output_low(GP5); //no pullup for GP5

  109.    while (TRUE)
  110.         {
  111.                 //UART_Transmit(0);
  112.                 //GetAdc();
  113.                 //Get_Pos();
  114.                 //UART_Transmit(duty>>8);
  115.                
  116.                 set_tris_b(0xfa); //GP5 input
  117.                 set_timer0(0);
  118.                 while(input(GP5) == 0)
  119.                 {

  120.                 }
  121.                 duty = get_timer0();
  122.                 set_tris_b(0xda); //GP5 output

  123.                 //UART_Transmit(0);
  124.                 //UART_Transmit(duty);
  125.                 //delay_us(BitTime);

  126.                 if(duty<95)
  127.                 {
  128.                         if(duty < 4)
  129.                         {
  130.                                 output_high(GP0);
  131.                                 delay_ms(1);
  132.                         }
  133.                         else
  134.                         {
  135.                                 output_low(GP0);
  136.                                 for(i=0;i<duty;i++)
  137.                                 {
  138.                                         delay_us(50);
  139.                                 }
  140.                                 duty = 100 - duty;
  141.                                 output_high(GP0);
  142.                                 for(i=0;i<duty;i++)
  143.                                 {
  144.                                         delay_us(50);
  145.                                 }
  146.                         }
  147.                 }
  148.                 else
  149.                 {
  150.                         output_low(GP0);
  151.                         delay_ms(1);
  152.                 }
  153.     }
  154. }

复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:72649 发表于 2021-12-16 15:47 来自手机 | 只看该作者
能不能提供一下原理图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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