找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

STM8紅外程序(外中斷接收)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:268765 發(fā)表于 2017-12-29 11:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
STM8紅外程序
單片機(jī)源程序如下:
  1. #include "stm8s.h"
  2. #include "stm8s003f3p.h"
  3. #include "STM8_IR.h"
  4. #include "STM8_DELAY.h"

  5. #define IR_READ (PC_IDR&(0x01<<7))
  6. volatile uchar Flag_ir_start = 0;//啟動(dòng)標(biāo)志位

  7. volatile uint IR_time = 0;

  8. volatile unsigned long IR_data;

  9. volatile uchar IR_temp[4];


  10. void LED_Init(void)
  11. {
  12.         PA_DDR |= (0x01<<3);//設(shè)置PA3為輸出
  13.         PA_CR1 |= (0x01<<3);//設(shè)置PA3為推挽輸出,速度為2MHz
  14.         PA_CR2 &=(uchar)(~(0x01<<3));
  15.        
  16.         PA_ODR &=(uchar)(~(0x01<<3)); //關(guān)閉led
  17. }


  18. void TIM1_Init(void)
  19. {
  20.         TIM1_CR1 = 0x00;  //向上的計(jì)數(shù)方向,中斷計(jì)數(shù)不停
  21.    
  22.         TIM1_IER = 0x01;
  23.    
  24.         TIM1_PSCRH = 0x00;  //進(jìn)行16分頻
  25.         TIM1_PSCRL = 0x0f;  //16Mhz/(15+1)=1Mhz-->1us
  26.    
  27.         TIM1_ARRH = 0x00;
  28.         TIM1_ARRL = 20;   //20us
  29.    
  30.         TIM1_CR1 |=0x01;
  31.    
  32. }

  33. //外中斷接收紅外數(shù)據(jù)
  34. void EXIT_Init(void)
  35. {
  36.         //01是PA,23是PB,45是PC,67是PD引腳
  37.         //P?IS[1:0] 設(shè)置觸發(fā)方式,00是下降沿觸發(fā)
  38.         EXTI_CR1 &=(uchar)(~(0x03<<4));  // PC下降沿觸發(fā)
  39.         EXTI_CR1 |= (0x01<<5);
  40. }

  41. void IR_Init(void)
  42. {
  43.        
  44.         PC_DDR &=(uchar)(~(0x01<<7));
  45.         PC_CR1 &=(uchar)(~(0x01<<7));
  46.         //PC_CR1 |= (0x01<<7);//上拉輸入
  47.         PC_CR2 |= (0x01<<7);//打開(kāi)外部中斷
  48.     EXIT_Init();//RISING and falling EDGE

  49. }

  50. //位反轉(zhuǎn)算法
  51. uchar reverse8( uchar c )
  52. {
  53.      c = ( c & 0x55 ) << 1 | ( c & 0xAA ) >> 1;
  54.      c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;
  55.      c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;
  56.      return c;
  57. }

  58. void IR_rx(void)
  59. {
  60.         static uchar Flag_end=0;
  61.         static uchar IR_num = 0;
  62.        
  63.         uchar i,temp;
  64.        
  65.         //TIM1_CR1 &=(uchar)(~(0x01<<0));//關(guān)閉計(jì)數(shù)器
  66.        
  67.         TIM1_CR1 |= (0x01<<0);  //開(kāi)啟計(jì)數(shù)器
  68.        
  69.         //800us,17000us
  70.         if(IR_time<=40)////雜波
  71.         {
  72.                 IR_data=0;
  73.                 IR_num=0;
  74.                 IR_time=0;
  75.                
  76.                 //TIM1_CR1 &=(uchar)(~(0x01<<0));//關(guān)閉計(jì)數(shù)器
  77.                
  78.                 return ;
  79.         }
  80.         //13000us
  81.         if(IR_time >= 650)//13ms則啟動(dòng)成功
  82.         {
  83.                 Flag_ir_start = 1;
  84.                 IR_num = 0;
  85.                 IR_data=0;
  86.         }
  87.        
  88.         if((Flag_ir_start==1)&&(IR_time<=130))//2600us
  89.         {
  90.                
  91.                 IR_data<<=1;
  92.                 if(IR_time>=85)//1700us
  93.                 {
  94.                         IR_data |= (0x01<<0);
  95.                 }
  96.                 IR_num++;
  97.                 if(IR_num>31)
  98.                 {
  99.                         Flag_end = 1;
  100.                         Flag_ir_start=0;
  101.                         IR_time = 0;
  102.                 }
  103.         }
  104.        
  105.         if(Flag_end)
  106.         {
  107.                 Flag_end = 0;
  108.                
  109.                 TIM1_CR1 &=(uchar)(~(0x01<<0));//關(guān)閉計(jì)數(shù)器
  110.                
  111.                 IR_temp[0] = (uchar)((IR_data>>0)&0xff);
  112.                 IR_temp[1] = (uchar)((IR_data>>8)&0xff);
  113.                 IR_temp[2] = (uchar)((IR_data>>16)&0xff);
  114.                 IR_temp[3] = (uchar)((IR_data>>24)&0xff);
  115.                
  116.                 IR_data=0;
  117.                 IR_num=0;
  118.                
  119.                 if(IR_temp[0]!=(uchar)(~IR_temp[1]))
  120.                 {
  121.                         //校驗(yàn)失敗
  122.                         //PA_ODR ^= (0x01<<3);
  123.                 }
  124.                 else
  125.                 {
  126.                         IR_temp[1] = reverse8(IR_temp[1]);//位反轉(zhuǎn)算法
  127.                        
  128.                         if(IR_temp[1]==0x45)//0xa2
  129.                         {
  130.                                 //PA_ODR ^= (0x01<<3);
  131.                                 PA_ODR |= (0x01<<3);
  132.                         }
  133.                         if(IR_temp[1]==0x46)
  134.                         {
  135.                                 PA_ODR &=(uchar)(~(0x01<<3));
  136.                                 //PA_ODR |= (0x01<<3);
  137.                         }
  138.                         //PA_ODR &=(uchar)(~(0x01<<3));
  139.                 }
  140.                
  141.         }
  142.        
  143.         IR_time = 0;
  144. }

  145. @far @interrupt void EXTI_PORTC_IRQHandler(void)
  146. {
  147.         IR_rx();
  148. }


  149. //定時(shí)器1溢出中斷服務(wù)
  150. @far @interrupt void timer1_isr(void)   //10us
  151. {
  152.         //TIM1_CR1 &=~(0x01<<0);  //關(guān)閉計(jì)數(shù)器
  153.         TIM1_SR1 &=~(0x01<<0);  //清除中斷標(biāo)志
  154.    
  155.         IR_time++;
  156.        
  157.     //TIM1_CR1 |= (0x01<<0);  //開(kāi)啟計(jì)數(shù)器
  158.    
  159.         //PA_ODR |= (0x01<<3);
  160.        
  161.         //return ;
  162. }



  163. /*
  164. void IR_rx(void)
  165. {
  166.         static uchar Flag_end=0;
  167.         static uchar IR_num = 0;
  168.        
  169.        
  170.         TIM1_CR1 &=(uchar)(~(0x01<<0));//關(guān)閉計(jì)數(shù)器
  171.        
  172.         //800us,17000us
  173.         if(IR_time<=80)////雜波
  174.         {
  175.                 IR_data=0;
  176.                 IR_num=0;
  177.                 IR_time=0;
  178.                 //PA_ODR ^= (0x01<<3);
  179.                 return ;
  180.         }//
  181.         //13000us
  182.         if(IR_time >= 1300)//13ms則啟動(dòng)成功
  183.         {
  184.                 Flag_ir_start = 1;
  185.                 IR_num = 0;
  186.                 IR_data=0;
  187.                 //
  188.                 //PA_ODR |= (0x01<<3);
  189.         }
  190.        
  191.         //
  192.         if((Flag_ir_start==1)&&(IR_time<=260))//2600us
  193.         {
  194.                
  195.                 IR_data<<=1;
  196.                 if(IR_time>=170)//1700us
  197.                 {
  198.                         IR_data |= (0x01<<0);
  199.                 }
  200.                 IR_num++;
  201.                 if(IR_num>31)
  202.                 {
  203.                         Flag_end = 1;
  204.                         Flag_ir_start=0;
  205.                        
  206.                         //PA_ODR ^= (0x01<<3);
  207.                        
  208.                 }
  209.                
  210.         }
  211.        
  212.         if(Flag_end)
  213.         {
  214.                 Flag_end = 0;
  215.                
  216.                 IR_temp[0] = (uchar)((IR_data>>0)&0xff);
  217.                 IR_temp[1] = (uchar)((IR_data>>8)&0xff);
  218.                 IR_temp[2] = (uchar)((IR_data>>16)&0xff);
  219.                 IR_temp[3] = (uchar)((IR_data>>24)&0xff);
  220.                
  221.                 IR_data=0;
  222.                 IR_num=0;
  223.                
  224.                 if(IR_temp[0]!=(uchar)(~IR_temp[1]))
  225.                 {
  226.                        
  227.                 }
  228.                 else
  229.                 {
  230.                         //PA_ODR ^= (0x01<<3);
  231.                        
  232.                        
  233.                         if(IR_temp[1]==0xa2)
  234.                         {
  235.                                 //PA_ODR ^= (0x01<<3);
  236.                                 PA_ODR |= (0x01<<3);
  237.                         }
  238.                         if(IR_temp[1]<0x7f)
  239.                         {
  240.                                 PA_ODR &=(uchar)(~(0x01<<3));
  241.                                 //PA_ODR |= (0x01<<3);
  242.                         }
  243.                         //PA_ODR &=(uchar)(~(0x01<<3));
  244.                 }
  245.                
  246.         }
  247.        
  248.         IR_time = 0;
  249.        
  250.         TIM1_CR1 |= (0x01<<0);//開(kāi)計(jì)數(shù)器
  251. }*/

復(fù)制代碼
  1. /********************************************\

  2.                    _ooOoo_
  3.                   o8888888o
  4.                   88" . "88
  5.                   (| -_- |)
  6.                   O\  =  /O
  7.                ____/`---'\____
  8.              .'  \\|     |//  `.
  9.             /  \\|||  :  |||//  \
  10.            /  _||||| -:- |||||-  \
  11.            |   | \\\  -  /// |   |
  12.            | \_|  ''\---/''  |   |
  13.            \  .-\__  `-`  ___/-. /
  14.          ___`. .'  /--.--\  `. . __
  15.       ."" '<  `.___\_<|>_/___.'  >'"".
  16.      | | :  `- \`.;`\ _ /`;.`/ - ` : | |
  17.      \  \ `-.   \_ __\ /__ _/   .-` /  /
  18. ======`-.____`-.___\_____/___.-`____.-'======
  19.                    `=---='
  20. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  21.         佛祖保佑          永無(wú)BUG
  22.                                  
  23.                 楠A407舍長(zhǎng)出品
  24.                                                        
  25. \********************************************/

  26. #include "stm8s.h"
  27. #include "stm8s003f3p.h"


  28. #include "STM8_IR.h"


  29. #define uchar unsigned char
  30. #define uint  unsigned int

  31. _Bool Flag_ir = 0;





  32. void STM8_CLK_Init(void)
  33. {
  34.    
  35.     CLK_HSICmd(ENABLE);//HSI = 16MHz
  36.    
  37.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //f_psc = 16MHz/1
  38.    
  39.    
  40. }

  41. //--------------------主函數(shù)分割線---------------------
  42. //
  43. //
  44. //-----------------------------------------------------
  45. void main(void)
  46. {
  47.         unsigned char re ;
  48.         unsigned char reg;
  49.        
  50.         _asm("sim");//關(guān)全部中斷
  51.   
  52.         STM8_CLK_Init();//內(nèi)部HSI,16MHz
  53.        
  54.         LED_Init();

  55.         IR_Init();
  56.        
  57.         TIM1_Init();
  58.        
  59.         _asm("rim");//開(kāi)全部中斷
  60.        
  61.         while(1)
  62.         {
  63.                
  64.                 //IR_test();
  65.                
  66.                
  67.         }
  68. }
復(fù)制代碼

所有資料51hei提供下載:
STM8_IR_test.rar (4.02 MB, 下載次數(shù): 79)



評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:373 發(fā)表于 2018-4-26 10:42 | 只看該作者
學(xué)習(xí)下,不知道能不能用上
回復(fù)

使用道具 舉報(bào)

板凳
ID:106794 發(fā)表于 2018-7-23 08:55 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:538350 發(fā)表于 2019-5-22 15:54 | 只看該作者
樓主程序不對(duì)呀
回復(fù)

使用道具 舉報(bào)

5#
ID:146191 發(fā)表于 2019-6-1 15:48 | 只看該作者
Null520 發(fā)表于 2019-5-22 15:54
樓主程序不對(duì)呀

是不對(duì)。。定時(shí)器是不是開(kāi)早了。而且沒(méi)見(jiàn)到差值或清0 CNTR
回復(fù)

使用道具 舉報(bào)

6#
ID:439389 發(fā)表于 2019-7-9 21:58 | 只看該作者
不錯(cuò),學(xué)習(xí)學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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