找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9155|回复: 7
收起左侧

单片机推挽输出怎么设置?

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
ID:377872 发表于 2018-8-1 14:30 | 显示全部楼层 |阅读模式
    我用ld3320语音模块控制继电器,从而控制4路负载,但是无法控制,有人叫我在语音模块端口设置为推挽输出才够电流推动,我想问怎么设置?我是新手,望解答。谢谢
  1. #include "config.h"
  2. /************************************************************************************/
  3. //        nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
  4. //        LD_ASR_NONE:                表示没有在作ASR识别
  5. //        LD_ASR_RUNING:                表示LD3320正在作ASR识别中
  6. //        LD_ASR_FOUNDOK:                表示一次识别流程结束后,有一个识别结果
  7. //        LD_ASR_FOUNDZERO:        表示一次识别流程结束后,没有识别结果
  8. //        LD_ASR_ERROR:                表示一次识别流程中LD3320芯片内部出现不正确的状态
  9. /***********************************************************************************/
  10. uint8 idata nAsrStatus=0;       
  11. void MCU_init();
  12. void ProcessInt0(); //识别处理函数
  13. void  delay(unsigned long uldata);
  14. void         User_handle(uint8 dat);//用户执行操作函数
  15. void Led_test(void);//单片机工作指示
  16. void Delay200ms();
  17. uint8_t G0_flag=DISABLE;//运行标志,ENABLE:运行。DISABLE:禁止运行
  18. sbit LED=P4^2;//信号指示灯
  19. //应用IO口定义 (模块标注 P2)
  20. sbit PA1=P4^1; //对应板上标号 P4.1
  21. sbit PA2=P2^7;  //对应板上标号 P2.7
  22. sbit PA3=P2^6;  //.....
  23. sbit PA4=P2^5;  //.....
  24. sbit PA5=P2^4;  //.....
  25. sbit PA6=P2^3;  //.....
  26. sbit PA7=P3^3;  //对应板上标号 IT1
  27. sbit PA8=P3^4;  //对应板上标号 T0
  28. sbit LED2=P1^0;
  29. sbit FAN=P1^1;
  30. sbit CURTAIN=P1^2;

  31. /***********************************************************
  32. * 名    称: void  main(void)
  33. * 功    能: 主函数        程序入口
  34. * 入口参数:  
  35. * 出口参数:
  36. * 说    明:                                          
  37. * 调用方法:
  38. **********************************************************/
  39. void  main(void)
  40. {
  41.         uint8 idata nAsrRes;
  42.         uint8 i=0;
  43.         Led_test();
  44.         MCU_init();
  45.         LD_Reset();
  46.         UartIni(); /*串口初始化*/
  47.         nAsrStatus = LD_ASR_NONE;                //        初始状态:没有在作ASR
  48.        
  49.         #ifdef TEST       
  50.     PrintCom("一级口令:小杰\r\n"); /*text.....*/
  51.         PrintCom("二级口令:1、代码测试\r\n"); /*text.....*/
  52.         PrintCom("        2、开发板验证\r\n"); /*text.....*/
  53.         PrintCom("        3、开灯\r\n"); /*text.....*/
  54.         PrintCom("        4、关灯\r\n"); /*text.....*/
  55.         PrintCom("  5、开风扇\r\n"); /*text.....*/
  56.         PrintCom("        6、关风扇\r\n"); /*text.....*/
  57.         PrintCom("        7、开窗帘\r\n"); /*text.....*/
  58.         PrintCom("        8、关窗帘\r\n"); /*text.....*/
  59.         #endif

  60.         while(1)
  61.         {
  62.                 switch(nAsrStatus)
  63.                 {
  64.                         case LD_ASR_RUNING:
  65.                         case LD_ASR_ERROR:               
  66.                                 break;
  67.                         case LD_ASR_NONE:
  68.                         {
  69.                                 nAsrStatus=LD_ASR_RUNING;
  70.                                 if (RunASR()==0)        /*        启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
  71.                                 {
  72.                                         nAsrStatus = LD_ASR_ERROR;
  73.                                 }
  74.                                 break;
  75.                         }
  76.                         case LD_ASR_FOUNDOK: /*        一次ASR识别流程结束,去取ASR识别结果*/
  77.                         {                               
  78.                                 nAsrRes = LD_GetResult();                /*获取结果*/
  79.                                 User_handle(nAsrRes);//用户执行函数
  80.                                 nAsrStatus = LD_ASR_NONE;
  81.                                 break;
  82.                         }
  83.                         case LD_ASR_FOUNDZERO:
  84.                         default:
  85.                         {
  86.                                 nAsrStatus = LD_ASR_NONE;
  87.                                 break;
  88.                         }
  89.                 }// switch                                
  90.         }// while

  91. }
  92. /***********************************************************
  93. * 名    称:          LED灯测试
  94. * 功    能: 单片机是否工作指示
  95. * 入口参数: 无
  96. * 出口参数:无
  97. * 说    明:                                          
  98. **********************************************************/
  99. void Led_test(void)
  100. {
  101.         LED=~ LED;
  102.         Delay200ms();
  103.         LED=~ LED;
  104.         Delay200ms();
  105.         LED=~ LED;
  106.         Delay200ms();
  107.         LED=~ LED;
  108.         Delay200ms();
  109.         LED=~ LED;
  110.         Delay200ms();
  111.         LED=~ LED;
  112. }
  113. /***********************************************************
  114. * 名    称: void MCU_init()
  115. * 功    能: 单片机初始化
  116. * 入口参数:  
  117. * 出口参数:
  118. * 说    明:                                          
  119. * 调用方法:
  120. **********************************************************/
  121. void MCU_init()
  122. {
  123.         P0 = 0xff;
  124.         P1 = 0xff;
  125.         P2 = 0xff;
  126.         P3 = 0xff;
  127.         P4 = 0xff;
  128.         LD_MODE = 0;                //        设置MD管脚为低,并行模式读写
  129.         IE0=1;
  130.         EX0=1;
  131.         EA=1;
  132. }
  133. /***********************************************************
  134. * 名    称:        延时函数
  135. * 功    能:
  136. * 入口参数:  
  137. * 出口参数:
  138. * 说    明:                                          
  139. * 调用方法:
  140. **********************************************************/
  141. void Delay200us()                //@22.1184MHz
  142. {
  143.         unsigned char i, j;
  144.         _nop_();
  145.         _nop_();
  146.         i = 5;
  147.         j = 73;
  148.         do
  149.         {
  150.                 while (--j);
  151.         } while (--i);
  152. }

  153. void  delay(unsigned long uldata)
  154. {
  155.         unsigned int j  =  0;
  156.         unsigned int g  =  0;
  157.         while(uldata--)
  158.         Delay200us();
  159. }

  160. void Delay200ms()                //@22.1184MHz
  161. {
  162.         unsigned char i, j, k;

  163.         i = 17;
  164.         j = 208;
  165.         k = 27;
  166.         do
  167.         {
  168.                 do
  169.                 {
  170.                         while (--k);
  171.                 } while (--j);
  172.         } while (--i);
  173. }

  174. /***********************************************************
  175. * 名    称: 中断处理函数
  176. * 功    能:
  177. * 入口参数:  
  178. * 出口参数:
  179. * 说    明:                                          
  180. * 调用方法:
  181. **********************************************************/
  182. void ExtInt0Handler(void) interrupt 0  
  183. {        
  184.         ProcessInt0();                                /*        LD3320 送出中断信号,包括ASR和播放MP3的中断,需要在中断处理函数中分别处理*/
  185. }
  186. /***********************************************************
  187. * 名    称:用户执行函数
  188. * 功    能:识别成功后,执行动作可在此进行修改
  189. * 入口参数: 无
  190. * 出口参数:无
  191. * 说    明: 通过控制PAx端口的高低电平,从而控制外部继电器的通断                                         
  192. **********************************************************/
  193. void         User_handle(uint8 dat)
  194. {
  195.      //UARTSendByte(dat);//串口识别码(十六进制)
  196.                  if(0==dat)
  197.                  {
  198.                           G0_flag=ENABLE;
  199.                                 LED=0;
  200.                  }
  201.                  else if(ENABLE==G0_flag)
  202.                  {       
  203.                                  G0_flag=DISABLE;
  204.                                 LED=1;
  205.                          switch(dat)                   /*对结果执行相关操作,客户修改*/
  206.                           {
  207.                                   case CODE_DMCS:                        /*命令“测试”*/
  208.                                                 PrintCom("“代码测试”命令识别成功\r\n"); //串口输出提示信息(可删除)
  209.                                                 PA1=0;//让PA1端口为低电平
  210.                                                                                                          break;
  211.                                         case CODE_KFBYZ:         /*命令“全开”*/
  212.                                                 PrintCom("“开发板验证”命令识别成功\r\n");//串口输出提示信息(可删除)
  213.                                                 PA2=0;//让PA2端口为低电平
  214.                                                                                                          break;
  215.                                         case CODE_KD:                /*命令“复位”*/                               
  216.                                                 PrintCom("“开灯”命令识别成功\r\n"); //串口输出提示信息(可删除)
  217.                                                 PA3=0;//让PA3端口为低电平
  218.                                                 LED2=0;//灯开
  219.                                                                                                         break;
  220.                                         case CODE_GD:                /*命令“复位”*/                               
  221.                                                 PrintCom("“关灯”命令识别成功\r\n"); //串口输出提示信息(可删除)
  222.                                                 PA3=1;//让PA3端口为高电平
  223.                                                 LED2=1;//灯关
  224.                                                                                                         break;
  225.                                         case CODE_KFS:                /*命令“复位”*/                               
  226.                                                 PrintCom("“开风扇”命令识别成功\r\n"); //串口输出提示信息(可删除)
  227.                                                 PA4=0;//让PA4端口为低电平
  228.                                                 FAN=0;
  229.                                                                                                         break;
  230.                                         case CODE_GFS:                /*命令“复位”*/                               
  231.                                                 PrintCom("“关风扇”命令识别成功\r\n"); //串口输出提示信息(可删除)
  232.                                                 PA5=1;//让PA5端口为低电平
  233.                                                 FAN=1;
  234.                                                                                                         break;
  235.                                         case CODE_KCL:                /*命令“复位”*/                               
  236.                                                 PrintCom("“开窗帘”命令识别成功\r\n"); //串口输出提示信息(可删除)
  237.                                                 PA6=0;       
  238.                                                 CURTAIN=0;
  239.                                                                                                         break;       
  240.                                         case CODE_GCL:                /*命令“复位”*/                               
  241.                                                 PrintCom("“关窗帘”命令识别成功\r\n"); //串口输出提示信息(可删除)
  242.                                                 PA7=0;
  243.                                                 CURTAIN=1 ;
  244.                                                                                                         break;                                                                                                                                                                                                                                                                       
  245.                                                         default:PrintCom("请重新识别发口令\r\n"); //串口输出提示信息(可删除)
  246.                                                                                                         break;
  247.                                 }       
  248.                         }       
  249.                         else        
  250.                         {
  251.                                 PrintCom("请说出一级口令\r\n"); //串口输出提示信息(可删除)       
  252.                         }
  253. }       
复制代码


main.docx

18.82 KB, 下载次数: 4

ld3320控制继电器

回复

使用道具 举报

ID:308437 发表于 2018-8-2 08:38 | 显示全部楼层
要增强型的51才可以支持:
初始化写上:
P2M0=0xff;
就把所有的P2口设置为强推挽输出了。电流可以达到几百毫安(不强推,只有二三十毫安,最大好像是五十多,具体要看手册)。你试一下,还有头文件记得改
回复

使用道具 举报

ID:381956 发表于 2018-8-2 09:05 | 显示全部楼层
可通过设置PXM1:PXM0的值: PXM1:PXM0 0 0 准双向口(传统IO) 0 1 推挽输出(强上拉 ,电流可达20mA,尽量少用) 1 0 仅为输入(高阻)可通过设置PXM1:PXM0的值: PXM1:PXM0 0 0 准双向口(传统IO) 0 1 推挽输出(强上拉 ,电流可达20mA,尽量少用) 1 0 仅为输入(高阻)

评分

参与人数 1黑币 +2 收起 理由
hyg1997 + 2 很给力!

查看全部评分

回复

使用道具 举报

ID:377872 发表于 2018-8-2 09:25 | 显示全部楼层
yousunny 发表于 2018-8-2 08:38
要增强型的51才可以支持:
初始化写上:
P2M0=0xff;

就是说如果我要设置p1口的话就加上p1M0=0xff?我的单片机是增强型的,那个头文件要怎么改?
回复

使用道具 举报

ID:221865 发表于 2018-8-2 19:26 | 显示全部楼层
hyg1997 发表于 2018-8-2 09:25
就是说如果我要设置p1口的话就加上p1M0=0xff?我的单片机是增强型的,那个头文件要怎么改?

不用改头文件,直接给赋值就行。
回复

使用道具 举报

ID:584864 发表于 2020-4-27 11:13 | 显示全部楼层
yousunny 发表于 2018-8-2 08:38
要增强型的51才可以支持:
初始化写上:
P2M0=0xff;

如果不是增强的单片机,几百毫安受不了,单片机可能烧毁。所以尽量单个引脚设置推免。
比如STC12C5A60S2单片机片内最大不得超过120mA。
假如P2.4引脚想强推免可以输出20mA驱动蜂鸣器。代码是
P2M0=0x10;
P2M1=0x00;
强推免配置:这里相应的P2M0中的2,就是指整个P2引脚系列,包括P2.0,P2.1等。
然后后面十六进制0X的数0000 0000 从左到右分别是P2.7到P2.0引脚
然后只需将相应的PXM0引脚设置为1,相应的PXM1引脚设置为0即是强推免模式。
比如上面的P2.4引脚强推免代码。
回复

使用道具 举报

ID:311846 发表于 2020-4-27 16:04 | 显示全部楼层
单片机驱动不了就加上拉电阻,妥妥的让你驱动
回复

使用道具 举报

ID:230500 发表于 2022-4-1 22:15 | 显示全部楼层
2319964969 发表于 2020-4-27 11:13
如果不是增强的单片机,几百毫安受不了,单片机可能烧毁。所以尽量单个引脚设置推免。
比如STC12C5A60S2 ...

说得很详细,今天刚好用到,刚开始也不知道怎么设置, 现在会了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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