1、紅外對管
紅外線對管就是紅外線發射與接收。它的發射與接收的方式有兩種,一是直射式,二是反射式。直射式指發光二極管和接收管相對安放在發射與受控物的兩端,中間相距一定距離;反射式指發光二極管和接收管并排一起,平常接收管始終無光照射,只在發光二極管發出的紅外線碰到反射物時,接收管接收到反射回來的紅外線才工作。這里我們選用的是后者
2、硬件連接
程序里面我們是用的外部中斷0,紅外對管OUT腳接單片機的P3^2腳(之前就是因為OUT腳接單片機IO口的問題耽誤了很久)
然后用的是普中的開發板
3、程序
這里只截了部分程序,需要的小伙伴自行下載
中斷
單片機源程序如下:- #include <REGX52.H>
- #include <math.h>
- #include <stdio.h>
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- #define DataPort P0
- sbit SCL=P1^0;
- sbit SDA=P1^1;
- #define SlaveAddress 0x46
-
- int count = 0;
- static int number;
- void Delay100ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Int0_Init()
- {
- IT0=0;
- EX0=1;
- EA=1;
- }
- sbit LCD_RS=P2^6;
- sbit LCD_RW=P2^5;
- sbit LCD_E=P2^7;
- #define LCD_DataPort P0
- /**
- * @brief LCD1602????,12MHz?????1ms
- * @param ?
- * @retval ?
- */
- void LCD_Delay() //@12.000MHz 1ms
- {
- unsigned char i, j;
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- /**
- * @brief LCD1602???
- * @param Command ??????
- * @retval ?
- */
- void LCD_WriteCommand(unsigned char Command)
- {
- LCD_RS=0;
- LCD_RW=0;
- LCD_DataPort=Command;
- LCD_E=1;
- LCD_Delay();
- LCD_E=0;
- LCD_Delay();
- }
- /**
- * @brief LCD1602???
- * @param Data ??????
- * @retval ?
- */
- void LCD_WriteData(unsigned char Data)
- {
- LCD_RS=1;
- LCD_RW=0;
- LCD_DataPort=Data;
- LCD_E=1;
- LCD_Delay();
- LCD_E=0;
- LCD_Delay();
- }
- /**
- * @brief LCD1602?????
- * @param ?
- * @retval ?
- */
- void LCD_Init(void)
- {
- LCD_WriteCommand(0x38);
- LCD_WriteCommand(0x0C);
- LCD_WriteCommand(0x06);
- LCD_WriteCommand(0x01);
- }
- /**
- * @brief LCD1602??????
- * @param Line ???,??:1~2
- * @param Column ???,??:1~16
- * @retval ?
- */
- void LCD_SetCursor(unsigned char Line,unsigned char Column)
- {
- if(Line==1)
- {
- LCD_WriteCommand(0x80|(Column-1));
- }
- else
- {
- LCD_WriteCommand(0x80|(Column-1)+0x40);
- }
- }
- /**
- * @brief ???=X?Y??
- */
- int LCD_Pow(int X,int Y)
- {
- unsigned char i;
- int Result=1;
- for(i=0;i<Y;i++)
- {
- Result*=X;
- }
- return Result;
- }
- /**
- * @brief ?LCD1602????????????
- * @param Line ?????,??:1~2
- * @param Column ?????,??:1~16
- * @param Number ??????,??:0~65535
- * @param Length ????????,??:1~5
- * @retval ?
- */
- void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
- {
- unsigned char i;
- LCD_SetCursor(Line,Column);
- for(i=Length;i>0;i--)
- {
- LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
- }
- }
- void main()
- {
-
- Int0_Init();
- LCD_Init();
- while(1)
- {
- LCD_ShowNum(2,1,count,3);
- number = 1;
-
- }
- }
- void Int0() interrupt 0
- {
- if(number == 1)
- {
- count++;
- number = 0;
- Delay100ms(); //@11.0592MHz
- }
- }
復制代碼
|