找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3418|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

按鈕 溫度 紅外三種方式控制電機轉(zhuǎn)速的單片機程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:547295 發(fā)表于 2019-6-16 21:03 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
電路原理圖如下:


單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. unsigned int times;
  4. unsigned int controlway;
  5. unsigned int flag=0;
  6. unsigned int flaghongwai=0;
  7. //電機控制
  8. sbit out3=P2^2;
  9. sbit out1=P2^0;
  10. sbit out2=P2^1;
  11. //按鈕控制
  12. sbit button=P1^0;
  13. sbit buttonup=P1^6;
  14. sbit buttondown=P1^7;
  15. //溫度控制
  16. sbit DQ=P3^7;
  17. sbit temp=P1^1;
  18. //紅外控制
  19. sbit hongwai=P1^2;
  20. sbit        IR    = P3^2;
  21. unsigned char        N[4];//識別碼,操作碼存放
  22. unsigned char   X1,X2,X3,X4;

  23. void delay(unsigned char n){
  24.         do{
  25.                 _nop_();
  26.                 _nop_();
  27.                 _nop_();
  28.                 n--;
  29.         }while(n);
  30. }

  31. //溫度控制
  32. void init_ds18b20(){
  33.         unsigned char x=0;
  34.         DQ=0;
  35.         delay(120);
  36.         DQ=1;
  37.         delay(16);
  38.         delay(80);
  39. }
  40. unsigned char readbyte(){
  41.         unsigned char i=0;
  42.         unsigned char date=0;
  43.         for(i=8;i>0;i--){
  44.                 DQ=0;
  45.                 delay(1);
  46.                 DQ=1;
  47.                 date>>=1;
  48.                 if(DQ)
  49.                 date|=0x80;        
  50.                 delay(11);
  51.         }        
  52.         return (date);
  53. }
  54. void writebyte(unsigned char dat){
  55.         unsigned char i=0;
  56.         for(i=8;i>0;i--){
  57.                 DQ=0;
  58.                 DQ=dat&0x01;
  59.                 delay(5);
  60.                 DQ=1;
  61.                 dat>>=1;
  62.                 delay(5);
  63.         }        
  64. }
  65. unsigned char retemp(){
  66.         unsigned char a,b,tt;
  67.         unsigned int t;
  68.         init_ds18b20();
  69.         writebyte(0xcc);
  70.         writebyte(0x44);
  71.         init_ds18b20();
  72.         writebyte(0xcc);
  73.         writebyte(0xbe);
  74.         a=readbyte();
  75.         b=readbyte();
  76.         t=b;
  77.         //t=t<<8;
  78.         t<<=8;
  79.         t=t|a;
  80.         tt=t*0.0625;
  81.         return (tt);
  82. }

  83. //按鍵檢測,電機轉(zhuǎn)速控制
  84. timer0 () interrupt 1 {
  85.         unsigned char tempread=0;
  86.         if(button==0){
  87.                 controlway=1;               
  88.         }else if(temp==0){
  89.                 controlway=2;
  90.         }else if(hongwai==0){
  91.                 controlway=3;
  92.         }else{
  93.                 controlway=1;
  94.         }
  95.         switch(controlway){
  96.                         case 1:
  97.                                 if(buttonup==0){
  98.                                          if(times<10000){
  99.                                                 times+=1000;
  100.                                         }
  101.                                 }else if(buttondown==0){
  102.                                          if(times>0){
  103.                                                 times-=1000;
  104.                                         }
  105.                                 }
  106.                                 delay(100);
  107.                         break;
  108.                         case 2:
  109.                                 flag++;
  110.                                 if(flag==20)
  111.                                 {
  112.                                         tempread=retemp();
  113.                                         if(tempread>24&&tempread<34){
  114.                                          times=1000*(tempread-24);
  115.                                         }else{
  116.                                                 times=10000;
  117.                                         }
  118.                                         flag=0;
  119.                                 }
  120.                         break;
  121.                         case 3:
  122.                         //轉(zhuǎn)換為外部中斷
  123.                                 IT0 = 0;
  124.                                 EX0 = 1;
  125.                         break;
  126.                 }
  127.         TH0=0x3c;
  128.         TL0=0xb0;
  129. }         
  130. //紅外接收信號
  131. /********************** 外部中斷函數(shù)************************/
  132. void exint0() interrupt 0
  133. {         
  134.    unsigned int cnt;
  135.    unsigned char i;
  136.    EX0 = 0;
  137.    cnt = 0;        
  138.         
  139.    while(!IR) cnt++;                               //記錄引導(dǎo)碼時間
  140.    if(cnt < 1000){EX0=1;return;}                   //9ms的計數(shù)值(12MHz:1000< cnt <1500)
  141.            
  142.    cnt = 0;                        
  143.    while(IR) if(cnt++ > 400){EX0=1;return;}        //防卡死,超時保護(12MHz: > 300)   
  144.    if(cnt < 200){EX0=1;return;}                    //(12MHz不分頻: <260)            

  145.    for(i=0; i<32; i++)                             //讀取32位位碼
  146.        {
  147.          cnt = 0;                                                                                                                                                
  148.          while(!IR);                       
  149.          while(IR) if(cnt++ > 200){EX0=1;return;}  //超時保護(12MHz:>=200)
  150.          N[i/8] >>= 1;
  151.          if(cnt>60) N[i/8] |= 0x80;                //0和1的計數(shù)界線(12MHz:< 109)   
  152.        }

  153.          if(N[0] == ~N[1] && N[2] == ~N[3])            //校驗識別碼,操作碼        
  154.            {
  155.            /*
  156.                    X1 = N[0]/16;
  157.                 X2 = N[0]%16;
  158.                 X3 = N[2]/16;
  159.                 */
  160.                 X4 = N[2]%16;
  161.                
  162.                 flaghongwai=1;
  163.            }
  164.          
  165.         EX0 = 1;                 
  166. }
  167. main(){

  168.         TMOD = 0x01;                                                                                                                  
  169.         TH0=0x3c;
  170.         TL0=0xb0;        
  171.         //TH0 = (65536-50000)/256;
  172.         //TL0 = (65536-50000)%256;
  173.         EA=1;                 
  174.         ET0=1;                 
  175.         //TR0=1;        
  176.         X1=X2=X3=X4 = 0;

  177.            
  178.         times=0;
  179.         delay(1000);
  180.         while(1){
  181.                 TR0=1; //轉(zhuǎn)換為定時器
  182.                 if(flaghongwai==1)
  183.                 {        TR0=0;        
  184.                         if(X4==1&×<10000){
  185.                                 times=times+1000;
  186.                         }else if(X4==2&×>100){
  187.                                 times=times-1000;
  188.                         }
  189.                         X4 = 0;
  190.                         flaghongwai=0;
  191.                 }
  192.                 out2=1;
  193.                 out1=0;
  194.                 out3=0;
  195.                 delay(times);
  196.                 out1=1;
  197.                 out3=1;                           
  198.                 delay(10000-times);
  199.         }
  200. }

復(fù)制代碼
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. sbit sendup=P1^0;
  6. sbit senddown=P1^1;

  7. #define SBM   0x80                //識別碼

  8. #define m9    (65536-9000)               //約9mS
  9. #define m4_5  (65536-4500)               //約4.5mS
  10. #define m1_6  (65536-1630)               //約1.65mS
  11. #define m_65  (65536-580)               //約0.65mS
  12. #define m_56  (65536-560)               //約0.56mS
  13. #define m40   (65536-40000)       //約40mS
  14. #define m56   (65536-56000)       //56mS
  15. #define m2_25 (65536-2250)        //約2.25mS

  16. sbit IR  = P3^6;                                  //定義發(fā)射引腳(接PNP三極管基極)

  17. uchar KEY(void);
  18. void  SanZhuan(void);
  19. void  ZZ(uchar x);
  20. void  Z0(uchar temp);
  21. void  TT0(bit BT,uint x);
  22. void  YS(uchar time);
  23. void delay(unsigned char n){
  24.         do{
  25.                 _nop_();
  26.                 _nop_();
  27.                 _nop_();
  28.                 n--;
  29.         }while(n);
  30. }
  31. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  32. 函數(shù)功能:主函數(shù)
  33. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  34. void main(void)
  35. {

  36.   TMOD = 0x01;         //T0 16位工作方式
  37.   IR=1;                                   //發(fā)射端口常態(tài)為高電平

  38.   while(1)
  39.   {
  40.    SanZhuan();
  41.   }
  42. }


  43. uchar KEY(void)
  44. {
  45. P1 = 0xff;            //將鍵盤端口行值設(shè)為1,列值設(shè)為0
  46. if(sendup==0){
  47.           return 1;
  48. }else if(senddown==0){
  49.            return 2;
  50. }

  51.   return 0;
  52. }
  53. /***************************************************************
  54. 函數(shù)功能:散轉(zhuǎn)程序
  55. 入口參數(shù):v
  56. //
  57. //  13 14 15 16
  58. //  9  10 11 12
  59. //  5  6  7  8
  60. //  1  2  3  4
  61. ***************************************************************/
  62. void SanZhuan(void)
  63. {
  64. uchar v;
  65. v = KEY();
  66. switch(v)
  67. {
  68.   case 1:ZZ(0x01);v=0;break;                //"  "
  69.   case 2:ZZ(0x02);v=0;break;                //"  "
  70.   default:v=0;
  71. }
  72. }
  73. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  74. 函數(shù)功能:發(fā)送主程序
  75. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  76. void ZZ(uchar x)
  77. {
  78.   TT0(1,m9);                   //高電平9mS
  79.   TT0(0,m4_5);               //低電平4.5mS

  80.   /*┈ 發(fā)送4幀數(shù)據(jù) ┈*/
  81.   Z0(SBM);                                                                                                                                       
  82.   Z0(~SBM);
  83.   Z0(x);
  84.   Z0(~x);

  85.   /*┈┈ 結(jié)束碼 ┈┈*/
  86.   TT0(1,m_65);
  87.   TT0(0,m40);

  88.   /*┈┈ 重復(fù)碼 ┈┈*/
  89.   while(KEY())
  90.    {
  91.         TT0(1,m9);
  92.         TT0(0,m2_25);

  93.         TT0(1,m_56);
  94.         TT0(0,m40);
  95.                 TT0(0,m56);
  96.                                                          
  97.     }
  98.                   

  99. }
  100. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  101. 函數(shù)功能:單幀發(fā)送程序
  102. 入口參數(shù):1幀數(shù)據(jù)
  103. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  104. void Z0(uchar temp)
  105. {
  106.   uchar v;
  107.   for (v=0;v<8;v++)                     //循環(huán)8次移位
  108.        {     
  109.                  TT0(1,m_65);                        //高電平0.65mS         
  110.                          if(temp&0x01) TT0(0,m1_6); //發(fā)送最低位
  111.                          else          TT0(0,m_56);     
  112.                          temp >>= 1;                //右移一位
  113.         }   
  114. }

  115. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  116. 函數(shù)功能:38KHz脈沖發(fā)射 + 延時程序
  117. 入口參數(shù):(是否發(fā)射脈沖,延時約 x (uS))
  118. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  119. void TT0(bit BT,uint x)
  120. {
  121.   TH0 = x>>8;                    //輸入T0初始值
  122.   TL0 = x;
  123.   TF0=0;                                //清0
  124.   TR0=1;                                //啟動定時器0
  125.   if(BT == 0) while(!TF0);        //BT=0時不發(fā)射38KHz脈沖只延時;BT=1發(fā)射38KHz脈沖且延時;
  126.   else while(1)                            //38KHz脈沖,占空比5:26
  127.          {
  128.                   IR = 0;
  129.                   if(TF0)break;
  130.                if(TF0)break;
  131.                   IR = 1;
  132.                 if(TF0)break;
  133.                  if(TF0)break;
  134.                  if(TF0)break;
  135.                   if(TF0)break;
  136.                  if(TF0)break;
  137.                  if(TF0)break;
  138.                  if(TF0)break;
  139.                  if(TF0)break;
  140.                  if(TF0)break;
  141.                   if(TF0)break;
  142.                  }
  143.   TR0=0;                                //關(guān)閉定時器0
  144.   TF0=0;                                //標(biāo)志位溢出則清0

  145.   IR =1;                                //脈沖停止后,發(fā)射端口常態(tài)為高電平
  146. }
  147. /***************************************************************
  148. 函數(shù)功能:按鍵消抖    延時程序
  149. 入口參數(shù):1ms×time       (晶振=12MHz)
  150. ***************************************************************/
  151. void YS(uchar time)
  152. {
  153.      uchar i,j;
  154.          for(i=0; i<time; i++)
  155.      for(j=0; j<247; j++)_nop_();
  156. }
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:97678 發(fā)表于 2019-12-17 09:18 | 只看該作者
請教一下,第二個文件的第192行,和第194行是什么錯誤?
編譯不能通過。
回復(fù)

使用道具 舉報

板凳
ID:97678 發(fā)表于 2019-12-17 09:20 | 只看該作者
剛剛發(fā)錯了。是程序的第一部分。
回復(fù)

使用道具 舉報

地板
ID:791490 發(fā)表于 2020-6-28 18:10 | 只看該作者
用戶碼0080 對應(yīng)的什么型號的遙控器啊  對應(yīng)的碼值表是什么啊
回復(fù)

使用道具 舉報

5#
ID:495287 發(fā)表于 2020-6-30 18:45 | 只看該作者
謝謝樓主指點,這個要慢慢消化下。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表