找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2306|回复: 2
打印 上一主题 下一主题
收起左侧

基于51单片机的红外对管计数源程序(LCD1602显示次数)

[复制链接]
跳转到指定楼层
楼主
1、红外对管
红外线对管就是红外线发射与接收。它的发射与接收的方式有两种,一是直射式,二是反射式。直射式指发光二极管和接收管相对安放在发射与受控物的两端,中间相距一定距离;反射式指发光二极管和接收管并排一起,平常接收管始终无光照射,只在发光二极管发出的红外线碰到反射物时,接收管接收到反射回来的红外线才工作。这里我们选用的是后者
2、硬件连接
程序里面我们是用的外部中断0,红外对管OUT脚接单片机的P3^2脚(之前就是因为OUT脚接单片机IO口的问题耽误了很久)
然后用的是普中的开发板

3、程序
这里只截了部分程序,需要的小伙伴自行下载


单片机源程序如下:
  1. #include <REGX52.H>
  2. #include  <math.h>     
  3. #include  <stdio.h>  
  4. #include "intrins.h"

  5. #define uchar unsigned char
  6. #define uint unsigned int       
  7.        
  8. #define DataPort P0         

  9. sbit SCL=P1^0;     
  10. sbit SDA=P1^1;  

  11. #define SlaveAddress   0x46
  12.       
  13. int count = 0;

  14. static int number;

  15. void Delay100ms()                //@11.0592MHz
  16. {
  17.         unsigned char i, j, k;

  18.         _nop_();
  19.         _nop_();
  20.         i = 5;
  21.         j = 52;
  22.         k = 195;
  23.         do
  24.         {
  25.                 do
  26.                 {
  27.                         while (--k);
  28.                 } while (--j);
  29.         } while (--i);
  30. }



  31. void Int0_Init()
  32. {
  33.         IT0=0;
  34.         EX0=1;
  35.         EA=1;
  36. }






  37. sbit LCD_RS=P2^6;
  38. sbit LCD_RW=P2^5;
  39. sbit LCD_E=P2^7;
  40. #define LCD_DataPort P0

  41. /**
  42.   * @brief  LCD1602????,12MHz?????1ms
  43.   * @param  ?
  44.   * @retval ?
  45.   */
  46. void LCD_Delay()                //@12.000MHz 1ms
  47. {
  48.         unsigned char i, j;

  49.         i = 2;
  50.         j = 239;
  51.         do
  52.         {
  53.                 while (--j);
  54.         } while (--i);
  55. }

  56. /**
  57.   * @brief  LCD1602???
  58.   * @param  Command ??????
  59.   * @retval ?
  60.   */
  61. void LCD_WriteCommand(unsigned char Command)
  62. {
  63.         LCD_RS=0;
  64.         LCD_RW=0;
  65.         LCD_DataPort=Command;
  66.         LCD_E=1;
  67.         LCD_Delay();
  68.         LCD_E=0;
  69.         LCD_Delay();
  70. }

  71. /**
  72.   * @brief  LCD1602???
  73.   * @param  Data ??????
  74.   * @retval ?
  75.   */
  76. void LCD_WriteData(unsigned char Data)
  77. {
  78.         LCD_RS=1;
  79.         LCD_RW=0;
  80.         LCD_DataPort=Data;
  81.         LCD_E=1;
  82.         LCD_Delay();
  83.         LCD_E=0;
  84.         LCD_Delay();
  85. }

  86. /**
  87.   * @brief  LCD1602?????
  88.   * @param  ?
  89.   * @retval ?
  90.   */
  91. void LCD_Init(void)
  92. {
  93.         LCD_WriteCommand(0x38);
  94.         LCD_WriteCommand(0x0C);
  95.         LCD_WriteCommand(0x06);
  96.         LCD_WriteCommand(0x01);
  97. }

  98. /**
  99.   * @brief  LCD1602??????
  100.   * @param  Line ???,??:1~2
  101.   * @param  Column ???,??:1~16
  102.   * @retval ?
  103.   */
  104. void LCD_SetCursor(unsigned char Line,unsigned char Column)
  105. {
  106.         if(Line==1)
  107.         {
  108.                 LCD_WriteCommand(0x80|(Column-1));
  109.         }
  110.         else
  111.         {
  112.                 LCD_WriteCommand(0x80|(Column-1)+0x40);
  113.         }
  114. }

  115. /**
  116.   * @brief  ???=X?Y??
  117.   */
  118. int LCD_Pow(int X,int Y)
  119. {
  120.         unsigned char i;
  121.         int Result=1;
  122.         for(i=0;i<Y;i++)
  123.         {
  124.                 Result*=X;
  125.         }
  126.         return Result;
  127. }

  128. /**
  129.   * @brief  ?LCD1602????????????
  130.   * @param  Line ?????,??:1~2
  131.   * @param  Column ?????,??:1~16
  132.   * @param  Number ??????,??:0~65535
  133.   * @param  Length ????????,??:1~5
  134.   * @retval ?
  135.   */
  136. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  137. {
  138.         unsigned char i;
  139.         LCD_SetCursor(Line,Column);
  140.         for(i=Length;i>0;i--)
  141.         {
  142.                 LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
  143.         }
  144. }










  145. void main()
  146. {  
  147.    
  148.         Int0_Init();
  149.         LCD_Init();

  150.         while(1)            
  151.         {

  152.                 LCD_ShowNum(2,1,count,3);
  153.                 number = 1;
  154.                        
  155.    }
  156. }


  157. void Int0()        interrupt 0
  158. {       
  159.      if(number == 1)
  160.          {
  161.       count++;
  162.           number = 0;
  163.           Delay100ms();        //@11.0592MHz

  164.          }
  165. }
复制代码


程序1.png (75.75 KB, 下载次数: 79)

1

1

程序2.png (37.8 KB, 下载次数: 69)

2

2

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1064693 发表于 2023-3-1 15:15 | 只看该作者
你好,请问上面是完整的代码了吗
回复

使用道具 举报

板凳
ID:921711 发表于 2023-8-10 10:16 | 只看该作者
wei520789 发表于 2023-3-1 15:15
你好,请问上面是完整的代码了吗

是的,本来就不多,版主全部放出来了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表