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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6283|回復: 5
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:268765 發表于 2017-12-29 11:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM8紅外程序
單片機源程序如下:
  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;//啟動標志位

  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);//設置PA3為輸出
  13.         PA_CR1 |= (0x01<<3);//設置PA3為推挽輸出,速度為2MHz
  14.         PA_CR2 &=(uchar)(~(0x01<<3));
  15.        
  16.         PA_ODR &=(uchar)(~(0x01<<3)); //關閉led
  17. }


  18. void TIM1_Init(void)
  19. {
  20.         TIM1_CR1 = 0x00;  //向上的計數方向,中斷計數不停
  21.    
  22.         TIM1_IER = 0x01;
  23.    
  24.         TIM1_PSCRH = 0x00;  //進行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. //外中斷接收紅外數據
  34. void EXIT_Init(void)
  35. {
  36.         //01是PA,23是PB,45是PC,67是PD引腳
  37.         //P?IS[1:0] 設置觸發方式,00是下降沿觸發
  38.         EXTI_CR1 &=(uchar)(~(0x03<<4));  // PC下降沿觸發
  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);//打開外部中斷
  48.     EXIT_Init();//RISING and falling EDGE

  49. }

  50. //位反轉算法
  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));//關閉計數器
  66.        
  67.         TIM1_CR1 |= (0x01<<0);  //開啟計數器
  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));//關閉計數器
  77.                
  78.                 return ;
  79.         }
  80.         //13000us
  81.         if(IR_time >= 650)//13ms則啟動成功
  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));//關閉計數器
  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.                         //校驗失敗
  122.                         //PA_ODR ^= (0x01<<3);
  123.                 }
  124.                 else
  125.                 {
  126.                         IR_temp[1] = reverse8(IR_temp[1]);//位反轉算法
  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. //定時器1溢出中斷服務
  150. @far @interrupt void timer1_isr(void)   //10us
  151. {
  152.         //TIM1_CR1 &=~(0x01<<0);  //關閉計數器
  153.         TIM1_SR1 &=~(0x01<<0);  //清除中斷標志
  154.    
  155.         IR_time++;
  156.        
  157.     //TIM1_CR1 |= (0x01<<0);  //開啟計數器
  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));//關閉計數器
  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則啟動成功
  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);//開計數器
  251. }*/

復制代碼
  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.         佛祖保佑          永無BUG
  22.                                  
  23.                 楠A407舍長出品
  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. //--------------------主函數分割線---------------------
  42. //
  43. //
  44. //-----------------------------------------------------
  45. void main(void)
  46. {
  47.         unsigned char re ;
  48.         unsigned char reg;
  49.        
  50.         _asm("sim");//關全部中斷
  51.   
  52.         STM8_CLK_Init();//內部HSI,16MHz
  53.        
  54.         LED_Init();

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

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



評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:373 發表于 2018-4-26 10:42 | 只看該作者
學習下,不知道能不能用上
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

是不對。。定時器是不是開早了。而且沒見到差值或清0 CNTR
回復

使用道具 舉報

6#
ID:439389 發表于 2019-7-9 21:58 | 只看該作者
不錯,學習學習!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品成人一区二区三区四区 | 国产精品久久久久久久久久久免费看 | 欧美成人猛片aaaaaaa | 在线视频成人 | 男女在线网站 | 性生活毛片| 中文字幕免费视频 | 中文字幕第一页在线 | 亚洲精品视频免费观看 | 久久综合伊人一区二区三 | 一道本不卡视频 | 欧美性极品xxxx做受 | 黄色一级电影在线观看 | 精品一区二区三区四区视频 | 亚洲第一在线 | 中国黄色毛片视频 | 久久久久久高清 | 国产高清免费在线 | 久久精品国产亚洲一区二区 | 人人干人人看 | 精品一级| 国产小u女发育末成年 | 亚洲男人天堂2024 | 亚洲国产精品久久久久婷婷老年 | 日韩成人精品一区 | 成人在线视频观看 | 成人高清视频在线观看 | 久久精品 | 久久大全 | 国产一区二区三区视频免费观看 | 亚洲黄色网址视频 | 在线看一区二区三区 | 少妇一区二区三区 | 拍真实国产伦偷精品 | 天天插天天射天天干 | 日韩福利一区 | 看a网站| 国产成人高清在线观看 | 97国产在线观看 | 北条麻妃国产九九九精品小说 | 精品美女视频在线观看免费软件 |