找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何在电机和1602的单片机程序上面加入红外控制?求解

[复制链接]
跳转到指定楼层
楼主
ID:473410 发表于 2019-2-22 15:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用DS1302和DS18B20做了一个万年历在LCD1602上面显示时间和温度,同时加了一个电机和指示灯以及蜂鸣器的程序进去,达到的效果是LCD正常显示,当温度超过临界值(20度)的时候,电机开始启动,指示灯亮起,蜂鸣器同时也响,目前的问题是,蜂鸣器响的声音很有问题,音调特别低,我感觉是板子处理速度不够快,蜂鸣器的转换高低电频不够,不清楚应该怎么改动,还有,我想要加上一个红外遥控程序进去,就是温度能够自动控制电机和指示灯,但是也能通过遥控器手动控制电机和指示灯。目前红外接收程序我也有,但是不知道应该怎么写进去,希望大佬们给点意见。初学51,请多指教!
以下是源程序:
  1. #include<reg52.h>
  2. #include"lcd.h"
  3. #include"ds1302.h"
  4. #include"temp.h"
  5. //#include"HWTX.h"


  6. sbit K1=P3^1;
  7. sbit K2=P3^0;
  8. sbit K3=P3^2;
  9. sbit K4=P3^3;         
  10. sbit PWM=P1^0;
  11. sbit led=P2^0;
  12. sbit beep=P1^5;



  13. void Time1Config();
  14. void Int0Configuration();
  15. void LcdDisplay();
  16. unsigned char SetState,SetPlace;
  17. void Delay10ms(void);   //误差 0us
  18. void datapros(int temp);

  19. /*******************************************************************************
  20. * 函数名         : main
  21. * 函数功能                   : 主函数
  22. * 输入           : 无
  23. * 输出                  : 无
  24. *******************************************************************************/

  25. void main()
  26. {
  27.         unsigned char i;
  28.         Int0Configuration();
  29.         LcdInit();
  30.         Ds1302Init();
  31. //        IrInit();       //初始化红外线接收
  32.         while(1)
  33.         {      
  34.                 if(SetState==0)
  35.                 {
  36.                         Ds1302ReadTime();
  37.                 }
  38.                 else
  39.                 {
  40.                         if(K1==0)                //检测按键K1是否按下
  41.                         {
  42.                                 Delay10ms();        //消除抖动
  43.                                 if(K1==0)
  44.                                 {
  45.                                         SetPlace++;
  46.                                         if(SetPlace>=7)
  47.                                                 SetPlace=0;                                       
  48.                                 }

  49.                                 while((i<50)&&(K1==0))         //检测按键是否松开
  50.                                 {
  51.                                         Delay10ms();
  52.                                         i++;
  53.                                 }
  54.                                 i=0;
  55.                         }
  56.                         if(K2==0)                //检测按键K2是否按下
  57.                         {
  58.                                 Delay10ms();        //消除抖动
  59.                                 if(K2==0)
  60.                                 {
  61.                                         TIME[SetPlace]++;
  62.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  63.                                         {
  64.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  65.                                         }
  66.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  67.                                         {
  68.                                                 TIME[SetPlace]=0;
  69.                                         }
  70.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23
  71.                                         {
  72.                                                 TIME[SetPlace]=0;
  73.                                         }
  74.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  75.                                         {
  76.                                                 TIME[SetPlace]=0;      
  77.                                         }
  78.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  79.                                         {
  80.                                                 TIME[SetPlace]=0;
  81.                                         }      
  82.                                         if((TIME[SetPlace]>=0x7)&&(SetPlace==5))                //周只能到7
  83.                                         {
  84.                                                 TIME[SetPlace]=1;
  85.                                         }               
  86. //                                        if(SetPlace==5)                //月只能到12
  87. //                                        {
  88. //                                                TIME[SetPlace]=;
  89. //                                        }      
  90.                                 }
  91.                               
  92.                                 while((i<50)&&(K2==0))         //检测按键是否松开
  93.                                 {
  94.                                         Delay10ms();
  95.                                         i++;
  96.                                 }
  97.                                 i=0;
  98.                               
  99.                         }                                               
  100.                 }                                   
  101.                 LcdDisplay();
  102.         }
  103. }


  104. void datapros(int temp)
  105. {
  106.         float tp;
  107.         if(temp<0)
  108.         {
  109.                 temp-=1;
  110.                 temp=~temp;
  111.                 tp=temp;
  112.                 temp=tp*0.0625*100+0.5;
  113.                 LcdWriteCom(0x49+0x80);
  114.                 LcdWriteData('-');                       
  115.         }
  116.         else
  117.         {
  118.                 tp=temp;
  119.                 temp=tp*0.0625*100+0.5;
  120.                 LcdWriteCom(0x49+0x80);      
  121.                 LcdWriteData('+');               
  122.         }
  123.         LcdWriteCom(0x4a+0x80);
  124.         LcdWriteData('0'+temp%10000/1000);
  125.         LcdWriteCom(0x4b+0x80);
  126.         LcdWriteData('0'+temp%10000%1000/100);
  127.         LcdWriteCom(0x4c+0x80);
  128.         LcdWriteData('.');
  129.         LcdWriteCom(0x4d+0x80);
  130.         LcdWriteData('0'+temp%100/10);
  131.         LcdWriteCom(0x4e+0x80);
  132.         LcdWriteData('0'+temp%100%10);
  133. }
  134. /*******************************************************************************
  135. * 函数名         : LcdDisplay()
  136. * 函数功能                   : 显示函数
  137. * 输入           : 无
  138. * 输出                  : 无
  139. *******************************************************************************/

  140. void LcdDisplay()
  141. {
  142.         LcdWriteCom(0x40+0x80);
  143.         LcdWriteData('0'+TIME[2]/16);                                //时
  144.         LcdWriteData('0'+(TIME[2]&0x0f));                                 
  145.         LcdWriteData(':');
  146.         LcdWriteData('0'+TIME[1]/16);                                //分
  147.         LcdWriteData('0'+(TIME[1]&0x0f));      
  148.         LcdWriteData(':');
  149.         LcdWriteData('0'+TIME[0]/16);                                //秒
  150.         LcdWriteData('0'+(TIME[0]&0x0f));
  151.         datapros(ds18b20readtemp());

  152.         LcdWriteCom(0x80);
  153.         LcdWriteData('2');
  154.         LcdWriteData('0');
  155.         LcdWriteData('0'+TIME[6]/16);                        //年
  156.         LcdWriteData('0'+(TIME[6]&0x0f));
  157.         LcdWriteData('-');
  158.         LcdWriteData('0'+TIME[4]/16);                        //月
  159.         LcdWriteData('0'+(TIME[4]&0x0f));
  160.         LcdWriteData('-');
  161.         LcdWriteData('0'+TIME[3]/16);                        //日
  162.         LcdWriteData('0'+(TIME[3]&0x0f));
  163.         LcdWriteCom(0x8D);
  164.         LcdWriteData('0'+(TIME[5]&0x07));        //星期                        
  165. }
  166. /*******************************************************************************
  167. * 函数名         : Int0Configuration()
  168. * 函数功能                   : 配置外部中断0
  169. * 输入           : 无
  170. * 输出                  : 无
  171. *******************************************************************************/

  172. void Int0Configuration()
  173. {
  174.         //设置INT0
  175.         IT0=1;//跳变沿出发方式(下降沿)
  176.         EX0=1;//打开INT0的中断允许。
  177.         EA=1;//打开总中断
  178.         TMOD|=0x01;
  179.         TH1=0X38;
  180.         TL1=0X38;
  181.         ET1=1;
  182.         TR1=1;

  183. }                                 
  184. /*******************************************************************************
  185. * 函数名         : Int0()
  186. * 函数功能                   : 外部中断0 中断函数
  187. * 输入           : 无
  188. * 输出                  : 无
  189. *******************************************************************************/

  190. void Int0() interrupt 0                 
  191. {
  192.         Delay10ms();
  193.         if(K3==0)
  194.         {
  195.                 SetState=~SetState;
  196.                 SetPlace=0;
  197.                 Ds1302Init();      
  198.         }
  199. }                                   
  200. /*******************************************************************************
  201. * 函数名         : Delay10ms
  202. * 函数功能                   : 延时函数,延时10ms
  203. * 输入           : 无
  204. * 输出                  : 无
  205. *******************************************************************************/
  206. void Delay10ms(void)   //误差 0us
  207. {
  208.     unsigned char a,b,c;
  209.     for(c=1;c>0;c--)
  210.         for(b=38;b>0;b--)
  211.             for(a=130;a>0;a--);
  212. }

  213. void timer1() interrupt 3
  214. {
  215.         static unsigned int e;
  216.         TH1=0X38;
  217.         TL1=0X38;
  218.         e++;
  219.         if(e==5)                   //1s
  220.         {
  221.                 e=0;
  222.                 if(ds18b20readtemp()*6.25>=2000)
  223.                 {
  224.                         led=0;
  225.                         beep=~beep;
  226.                         PWM=1;
  227.                 }
  228.                 else
  229.                 {
  230.                         led=1;
  231.                         PWM=0;
  232.                 }
  233.         }      
  234. }
复制代码


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

使用道具 举报

沙发
ID:473410 发表于 2019-2-22 18:06 | 只看该作者
我试着把红外程序弄进去,有两个问题,第一个:当电机是关上的时候,按电源键不能让电机开启。第二个:当电机是开着的时候,按电源键只能让电机停一会,这个原因我知道,因为我的温度控制电机程序是在中断里面不停扫描的,所以按下去的那一会可以停,然后又继续转动。请问这两个问题怎么解决?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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