久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1519|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲系列第一页 | 青草久久免费视频 | 成人午夜高清 | 中文字幕亚洲免费 | 欧美精品久久久久久久久久 | va精品| 久久中文字幕一区 | 99热精品在线观看 | www.久久久| 天天搞天天操 | 久久久久久久久久影视 | 91aiai| 亚洲欧美国产精品一区二区 | 久久精品免费观看 | 91看片视频 | 国产免费一区二区三区最新6 | 中文字幕蜜臀av | 国产成视频在线观看 | 国产99视频精品免费播放照片 | 亚洲一区二区久久久 | 欧美在线a| 91久久精品日日躁夜夜躁欧美 | 欧美精品在线观看 | 日本一级淫片免费啪啪3 | 性一交一乱一透一a级 | 久久男人 | 欧美v在线观看 | 一区二区在线不卡 | 成人av在线网站 | 日日夜夜影院 | 国产日韩av一区二区 | 国产精品免费在线 | 亚洲欧洲精品在线 | 一区二区不卡 | 国产一区二区三区在线 | 国产精品无码久久久久 | 欧美专区在线 | 欧美成人精品一区二区男人看 | 亚洲国产精品视频 | 亚洲毛片在线观看 | 亚洲欧美国产精品一区二区 |