找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2993|回復(fù): 1
收起左側(cè)

單片機紅外遙控直流電機調(diào)速系統(tǒng)的程序設(shè)計

[復(fù)制鏈接]
ID:346510 發(fā)表于 2019-1-13 14:42 | 顯示全部樓層 |閱讀模式
紅外遙控直流電機調(diào)速系統(tǒng)的設(shè)計 杜鵬 2015214213 實驗八.zip (116.71 KB, 下載次數(shù): 49)

單片機程序源碼:
  1. #include <reg51.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit RS=P2^6;   //LCD引腳
  5. sbit RW=P2^5;
  6. sbit EN=P2^7;
  7. sbit IRIN=P3^2;  //紅外接口
  8. sbit PWM_Out=P1^0;  //PWM輸出引腳

  9. uchar tab[]={"IR-CODE:00H"};                                                                                          
  10. unsigned char IrValue[6];
  11. unsigned char Time;
  12. unsigned char PWM_Cnt,PWM_Duty; //PWM_cnt : PWM周期變量 0~10; PWM_Duty: 占空比變量0~10
  13. void System_Init();   
  14. void Delay_Ms(unsigned int x);
  15. void delayms(uint ms)
  16. {
  17.   uint i,j;
  18.   for (i=ms;i>0;i--)
  19.   for(j=0;j<124;j++);
  20. }
  21. void lcdwc(uchar com)//寫入命令
  22. {
  23.         RS=0;  //選擇寫入命令
  24.         RW=0;  //選擇寫入
  25.         EN=0;  //使能清零
  26.         P0=com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  27.         delayms(5);
  28.         EN=1;  //寫入時序
  29.         delayms(5);
  30.         EN=0;  
  31.         P0=com<<4;//發(fā)送低四位
  32.         delayms(5);
  33.         EN= 1;         //寫入時序
  34.         delayms(5);
  35.         EN= 0;

  36. }

  37. void lcdwd(uchar dat)//寫入數(shù)據(jù)
  38. {
  39.         RS=1; //選擇寫入數(shù)據(jù)
  40.         RW=0; //選擇寫入
  41.         EN=0; //使能清零
  42.         P0=dat;//由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  43.         delayms(5);
  44.         EN=1; //寫入時序
  45.         delayms(5);
  46.         EN=0;
  47.         P0=dat<< 4; //寫入低四位
  48.         delayms(5);
  49.         EN=1; //寫入時序
  50.         delayms(5);
  51.         EN=0;

  52. }

  53. void initlcd()
  54. {
  55.         lcdwc(0x32); //將8位總線轉(zhuǎn)為4位總線
  56.         lcdwc(0x28);//在四位線下的初始化
  57.         delayms(5);
  58.         lcdwc(0x0c);//00001100 顯示開及光標(biāo)設(shè)置
  59.         lcdwc(0x06);//00000110 顯示光標(biāo)移動設(shè)置
  60.         lcdwc(0x01);//00000001 清屏
  61.                
  62. }

  63. void main()
  64. {
  65.         uchar i;
  66.         initlcd();
  67.         lcdwc(0x80);//設(shè)置數(shù)據(jù)指針起點

  68.         for(i=0;i<11;i++)
  69.         {
  70.      lcdwd(tab[i]);               
  71.         }
  72.         
  73.         System_Init();
  74.         while(1)
  75.         {
  76.                
  77.         }
  78. }
  79. void System_Init()
  80. {
  81.         TMOD |= 0X10;   //定時器1 16位計時模式   
  82.         
  83.         TH1=(65536-1000)/256;   //定時1ms中斷一次   生成100HZ 的PWM信號
  84.         TL1=(65536-1000)%256;
  85.         TR1=1;
  86.         ET1=1;
  87.         
  88.         IT0=1;//下降沿觸發(fā)
  89.         EX0=1;//打開中斷0允許
  90.         EA=1;        //打開總中斷

  91.         IRIN=1;//初始化端口        
  92. }
  93. /*******************************************************************************
  94. * 函數(shù)名         : DelayMs()
  95. * 函數(shù)功能                   : 延時
  96. * 輸入           : x
  97. * 輸出                  : 無
  98. *******************************************************************************/

  99. void Delay_Ms(unsigned int x)   //0.14ms誤差 0us
  100. {
  101. unsigned char i;
  102.   while(x--)
  103. {
  104.   for (i = 0; i<13; i++)
  105. {}
  106. }
  107. }

  108. void ReadIr() interrupt 0
  109. {
  110.         unsigned char j,k;
  111.         unsigned int err;
  112.         Time=0;                                         
  113.         Delay_Ms(70);

  114.         if(IRIN==0)                //確認(rèn)是否真的接收到正確的信號
  115.         {         
  116.                
  117.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
  118.                 /*當(dāng)兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
  119.                 侯,程序死在這里*/        
  120.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                  
  121.                 {                        
  122.                         Delay_Ms(1);
  123.                         err--;
  124.                 }
  125.                 if(IRIN==1)                        //如果正確等到9ms低電平
  126.                 {
  127.                         err=500;
  128.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
  129.                         {
  130.                                 Delay_Ms(1);
  131.                                 err--;
  132.                         }
  133.                         for(k=0;k<4;k++)                //共有4組數(shù)據(jù)
  134.                         {                                
  135.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(jù)
  136.                                 {

  137.                                         err=60;               
  138.                                         while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  139. //                                        while (!IRIN)
  140.                                         {
  141.                                                 Delay_Ms(1);
  142.                                                 err--;
  143.                                         }
  144.                                         err=500;
  145.                                         while((IRIN==1)&&(err>0))         //計算高電平的時間長度。
  146.                                         {
  147.                                                 Delay_Ms(1);//0.14ms
  148.                                                 Time++;
  149.                                                 err--;
  150.                                                 if(Time>30)
  151.                                                 {
  152.                                                         EX0=1;
  153.                                                         return;
  154.                                                 }
  155.                                         }
  156.                                         IrValue[k]>>=1;         //k表示第幾組數(shù)據(jù)
  157.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于565us,那么是1
  158.                                         {
  159.                                                 IrValue[k]|=0x80;
  160.                                         }
  161.                                         Time=0;                //用完時間要重新賦值                                                        
  162.                                 }
  163.                         }
  164.                 }
  165.                 IrValue[4]=IrValue[2]>>4;                          //高位
  166.                 IrValue[5]=IrValue[2]&0x0f;                //低位        
  167.                 if(IrValue[4]>9)
  168.                 {                                       
  169.                         lcdwc(0x80+8);//設(shè)置數(shù)據(jù)指針起點
  170.                         lcdwd(0x37+IrValue[4]);        
  171.                 }
  172.                 else
  173.                 {
  174.                         lcdwc(0x80+8);//設(shè)置數(shù)據(jù)指針起點
  175.                         lcdwd(0x30+IrValue[4]);        
  176.                 }        
  177.                 if(IrValue[5]>9)
  178.                 {
  179.                         lcdwc(0x80+9);//設(shè)置數(shù)據(jù)指針起點
  180.                         lcdwd(0x37+IrValue[5]);        
  181.                 }
  182.                 else
  183.                 {
  184.                         lcdwc(0x80+9);//設(shè)置數(shù)據(jù)指針起點
  185.                         lcdwd(0x30+IrValue[5]);        
  186.                 }        
  187.                 if(IrValue[2]==0x0C)
  188.                 {
  189.                         if(PWM_Duty<10)
  190.                                 PWM_Duty+=1;
  191.                 }
  192.                 if(IrValue[2]==0x18)
  193.                 {
  194.                         if(PWM_Duty>0)
  195.                                 PWM_Duty-=1;
  196.                 }
  197.            if(IrValue[2]==0x5E)
  198.                 {
  199.           PWM_Duty=5;                           
  200.                 }
  201.                   
  202.                 if(IrValue[2]!=~IrValue[3])
  203.                 {
  204.                         return;
  205.                 }
  206.         }                        
  207. }
  208. void T1_service() interrupt 3   //定時器1中斷函數(shù)
  209. {
  210.         TH1=(65536-1000)/256;  
  211.         TL1=(65536-1000)%256;
  212.         /*----------------------------------------------
  213.                 PWM控制脈寬:   cnt變量會在  0~~~~~~~~~~10 之間循環(huán)
  214.                                                                                                                                                         ^
  215.                                                                                                                                                         |
  216.                                                                                                                                                 PWM_Duty
  217.         
  218.                 PWM_Duty取0~10中的值會得到不同占空比的PWM波;
  219.                 當(dāng)cnt<PWM_Duty時 IO口輸出高定平,否則為低電平。
  220.        ----------------------------------------------*/
  221.         PWM_Cnt++;    //PWM 變量計數(shù)
  222.         if(PWM_Cnt>=10) //計數(shù)變量限制范圍在0~10
  223.                 PWM_Cnt=0;
  224.         
  225.         if(PWM_Cnt<PWM_Duty)   //控制PWM引腳電平變化
  226.                 PWM_Out=1;
  227.         else
  228.         PWM_Out=0;
  229.         }
復(fù)制代碼

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:566605 發(fā)表于 2019-6-27 15:32 | 顯示全部樓層
那個按鍵控制呀 連接好無法控制
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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