找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1099|回复: 0
收起左侧

这个单片机程序如何只通过P2.0口输出稳定的触发信号?

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 2 次
ID:614734 发表于 2021-4-29 01:33 | 显示全部楼层 |阅读模式
这个程序原本是通过P2.0~P2.5输出6个相差30°的波形,导致输出波形在示波器上的波形不稳定,现要求它能够透过P2.0输出稳定的波形,且只收P3.3输入信号的控制。求大佬帮忙指导改一下

单片机源程序如下:
  1. #include "reg52.h"
  2. #include"ADC0808.h"
  3. #include "lcd.h"

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit VT1=P2^0;
  7. sbit VT2=P2^1;
  8. sbit VT3=P2^2;
  9. sbit VT4=P2^3;
  10. sbit VT5=P2^4;
  11. sbit VT6=P2^5;
  12. uchar count;
  13. uchar AD_num,angle_num;//采样AD的值和导通的角度
  14. uchar AD_signal,achieve_signal;
  15. uint delay_num=0;//延时的时间

  16. void Delay10ms()                //@12MHz
  17. {
  18.         unsigned char i, j, k;

  19.         _nop_();
  20.         _nop_();
  21.         i = 5;
  22.         j = 154;
  23.         k = 1;
  24.         do
  25.         {
  26.                 do
  27.                 {
  28.                         while (--k);
  29.                 } while (--j);
  30.         } while (--i);
  31. }

  32. void SCRTrg(uchar Num)     //  脉冲宽度30°  
  33. {        
  34. ;
  35.                 switch(Num)            // 触发相位
  36.         {
  37.                 case 1:
  38.                          VT1 = 1          // 开通
  39.                     VT6 = 1;
  40.                         break;
  41.                 case 2:
  42.                         VT1 = 0;            // 关断
  43.                     VT6 = 0;
  44.                         break;
  45.                 case 3:
  46.                         VT2 = 1;
  47.                     VT1 = 1;
  48.                         break;
  49.                 case 4:
  50.                     VT1 = 0;
  51.                     VT2 = 0;
  52.                         break;        
  53.                 case 5:
  54.                     VT3 = 1;
  55.             VT2 = 1;
  56.                         break;
  57.           case 6:
  58.                         VT3 = 0;
  59.                     VT2 = 0;
  60.                         break;
  61.                 case 7:
  62.                         VT3 = 1;
  63.                     VT4 = 1;
  64.                         break;
  65.                 case 8:
  66.                         VT3 = 0;
  67.                     VT4 = 0;
  68.                         break;
  69.                 case 9:
  70.                         VT5 = 1;
  71.                     VT4 = 1;
  72.                         break;
  73.                 case 10:
  74.                     VT5 = 0;
  75.                         VT4 = 0;
  76.                         break;        
  77.                 case 11:
  78.                         VT5 = 1;
  79.                     VT6 = 1;
  80.                         break;
  81.           case 12:
  82.                         VT5 = 0;
  83.                     VT6 = 0;
  84.                         break;
  85.                 default:
  86.                         break;
  87.         }*/
  88. }
  89. //定时器和外部中断初始化
  90. void Timer_Init(void)
  91. {
  92.         TMOD=0x11;
  93.         TH1=0xF9;        
  94.         TL1= 0x7F;
  95.         ET0=1;
  96.         ET1=1;
  97.         IT0 = 1;        // 下降沿触发
  98.         PX0=1;//外部中断0定义为高优先级
  99.         EX0=1;
  100. }
  101. void main(void)
  102. {
  103.     Timer_Init();
  104.         VT1=0;
  105.         VT2=0;
  106.         VT3=0;
  107.         VT4=0;
  108.         VT5=0;
  109.         VT6=0;
  110.     LcdInit();
  111.         AD_num=ADCInit();
  112.         angle_num=(uint)((255-AD_num)/255.0*180);
  113.         delay_num=(uint)(angle_num*10000/180.0);
  114.         LcdPrintf(0,"angle:");
  115.         LcdDisplayI(6,angle_num);
  116.         EA=1;
  117.         while(1)
  118.         {
  119.                 if(AD_signal==1)
  120.                 {
  121.                         AD_signal=0;
  122.                     if(AD_num!=ADCInit())
  123.                         {
  124.                                 TR0=0;
  125.                                 TR1=0;
  126.                                 AD_num=ADCInit();
  127.                                 angle_num=(uint)((255-AD_num)/255.0*180);
  128.                     delay_num=(uint)(angle_num*10000/180.0);
  129.                                 LcdDisplayI(6,angle_num);
  130.                                 achieve_signal=1;
  131.                                 EX0=1;
  132.                                 
  133.                         }                                
  134.                 }
  135.         }
  136. }
  137. void exint0() interrupt 0
  138. {
  139.         Delay10ms();
  140.         count=1;
  141. //        if(angle_num<60)
  142. //                count=1;
  143. //        else if(angle_num<120)
  144. //                count=11;
  145. //        else
  146. //                count=9;
  147.         TH0=(65536-delay_num)/256;
  148.         TL0=(65536-delay_num)%256;
  149.         TR0=1;
  150.         EX0=0;//关外部中断
  151. }
  152. void Time0Int()  interrupt 1
  153. {
  154.         TH0=(65536-delay_num)/256;
  155.         TL0=(65536-delay_num)%256;
  156.         TH1=0xF9;        
  157.         TL1= 0x82;
  158.         TR0=0;
  159.         TR1=1;
  160. }
  161. void Time1Int()  interrupt 3
  162. {
  163.         TH1=0xF9;        
  164.         TL1= 0x82;
  165.         SCRTrg(count++);
  166.         if(count==6)
  167.                 AD_signal=1;
  168.         if(count>12)
  169.         {
  170.                 count=1;
  171.         }
  172. }

复制代码

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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