找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机PIR人体红外感应和DAC0832信号发生器源程序与电路

[复制链接]
跳转到指定楼层
楼主
信号发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。 本设计采用STC89C52单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM358)、按键和LCD12864液晶显示电路。电路采用单片机和一片DAC0832数模转换器组成数字式低频信号发生器,可产生正弦波、矩形波和三角波三种波形。系统通过单片机产生数字信号,通过DAC0832转换为模拟信号,再通过放大器LM358就可以得到双极性的各种波形,最终由示波器显示出来。通过键盘来控制四种波形的类型选择、频率变化,其中频率调节范围为5HZ-100HZ,并通过液晶12864显示其各自的波形类型以及频率数值。
外加红外热释电传感器(PIR)现在最常见的就是楼道内的自动风扇基本用到的就是这种方案。

电路原理图如下:


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "hcsr501.h"
  4. #include "lcd12864.h"
  5. #include "Function Generator.h"
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. /**********主题显示*****************/
  9. uchar code Theme_one[]="凄凄切切群群瞧瞧";
  10. uchar code Theme_two[]="亲戚去去去去瞧瞧";
  11. uchar code Theme_thr[]="凄凄切切群群瞧瞧";
  12. uchar code Theme_fou[]="亲亲我群群去瞧瞧";
  13. /**********内容显示****************/
  14. uchar code SOURCE_WAVE[]     ="波形:          ";
  15. uchar code SOURCE_FREQUENCY[]="频率:        HZ";
  16. uchar code SOURCE_AMPLITUDE[]="  水龙头的状态  ";
  17. uchar code SOURCE_STATE[]    ="                ";


  18. /****************1ms延时函数********************/
  19. void DIS_theme()
  20. {
  21.         set_LCD12864_pos(0,0);
  22.         write_12864str(Theme_one);//"桂林电子科技大学""
  23.         set_LCD12864_pos(1,0);
  24.         write_12864str(Theme_two);//学号
  25.         set_LCD12864_pos(2,0);
  26.         write_12864str(Theme_thr);
  27.         set_LCD12864_pos(3,0);
  28.         write_12864str(Theme_fou);
  29.         delay_ms(1000);
  30.         set_LCD12864_pos(0,0);
  31.         write_12864str(SOURCE_WAVE);     //波形
  32.         set_LCD12864_pos(1,0);
  33.         write_12864str(SOURCE_FREQUENCY);//频率
  34.         set_LCD12864_pos(2,0);
  35.         write_12864str(SOURCE_AMPLITUDE);////状态
  36.         set_LCD12864_pos(3,0);
  37.         write_12864str(SOURCE_STATE);       

  38. }

  39. /****************主函数************************/
  40. void main()
  41. {
  42.                   Timer0Init();//初始化定时器0
  43.               Timer1Init();//初始化定时器1
  44.                   EA=1;
  45.                   LCD12864_init();//初始化液晶
  46.                   LCD12864_Busy();//液晶判忙
  47.                   DIS_theme();//主题显示
  48.                 while(1)
  49.                 {
  50.                        
  51.                         PUTOUT_WAVE();//波形输出
  52.             check_option();//水龙头感应检测
  53.                 }
  54. }
复制代码
  1. #include "reg52.h"
  2. #include "hcsr501.h"
  3. #include "lcd12864.h"
  4. #define PEOPLE_NEAR_THRESHOLD        10        //人体接近判断阀值
  5. #define PEOPLE_LEAVE_THRESHOLD        5        //人体离开判断阀值
  6. uchar PeopleNear = 0;                                  //人体接近判断标示,0:无人接近或人离开;1:人接近
  7. uchar OutUpCount = 0;                                //HC-SR501输出高电平计数
  8. uchar OutDowmCount = 0;                                //HC-SR501输出低电平计数
  9. //uchar IR_flag=0;                    //标志位
  10. //uchar num=0;
  11. /****************1ms延时函数********************/
  12. void delay_ms(uint del)
  13. {
  14.     uint i;
  15.     for(;del>0;del--)
  16.         for(i=124;i>0;i--);
  17. }
  18. /*****************************************************
  19. ** 函数名称:Timer0Init
  20. ** 函数功能:单片机定时器0初始化,每50MS产生1次中断
  21. ** 参    数:无
  22. ** 函数返回:无
  23. ******************************************************/
  24. void Timer0Init(void)                //50毫秒@12MHz
  25. {

  26.         TMOD |= 0x01;                //设置定时器模式
  27.         TH0 = (65536 - 50000) / 256;    // 设置定时器0为工作方式1(M1M0为01)
  28.     TL0 = (65536 - 50000) % 256;    // 装初值12M晶振定时50ms数位50000
  29.         //EA  = 1;                            // 开总中断
  30.         TR0 = 1;                //定时器0开始计时
  31.         ET0 = 1;
  32. }
  33. /*****************************************************
  34. ** 函数名称:check_option()
  35. ** 函数功能:判断人是否走进还是离去
  36. ** 参    数:无
  37. ** 函数返回:无
  38. ******************************************************/
  39. void check_option()
  40. {
  41.         if(PeopleNear)  //热释电红外端口有输出为0,无输出为1.
  42.                         {
  43.                                
  44.                                 relay=1;//继电器吸合
  45.                                 set_LCD12864_pos(3,0);
  46.                                 write_12864str(" OPEN ! Welcome!");//显示字符串Welcome!
  47.                                 delay_ms(2500);delay_ms(2500);
  48.                                
  49.                         }
  50.                                 else
  51.                                 //IR_flag=0;
  52.                                 relay=0;                //继电器断开                                                                          
  53.                                 set_LCD12864_pos(3,0);
  54.                                 write_12864str("CLOSE ! See you!");//显示字符串See you!
  55. //                                delay_ms(2500);delay_ms(2500);
  56. //                                set_LCD12864_pos(3,4);
  57. //                                write_12864str("no one !");//显示字符串Welcome!
  58. }
  59. /*****************************************************
  60. ** 函数名称:Timer0IntPro
  61. ** 函数功能:单片机定时器0中断处理函数
  62.                          ①连续10次采集到HC-SR501高电平输出,判断
  63.                            为有人体接近。
  64.                          ②当已判断有人体接近年后,连续10次采集到
  65.                            HC-SR501低电平输出,判断为人体离开
  66. ** 参    数:无
  67. ** 函数返回:无
  68. ******************************************************/
  69. void Timer0IntPro(void)                interrupt 1        using 0
  70.        
  71. {
  72.         TH0 = (65536-50000)/256;//装初值,50ms申请一次中断
  73.         TL0 = (65536-50000)%256;
  74. //  num++;   //申请一次中断num加1一次
  75. //        if(num==100)
  76. //        {num=0;IR_flag=1;}
  77.         if(Out)
  78.         {
  79.                  OutUpCount++;
  80.                  if(OutUpCount >= PEOPLE_NEAR_THRESHOLD)
  81.                  {
  82.                          PeopleNear = 1;
  83.                          
  84.                  }
  85.         }
  86.         else
  87.         {
  88.                 if(PeopleNear)
  89.                 {
  90.                         OutDowmCount++;
  91.                         if(OutDowmCount >= PEOPLE_LEAVE_THRESHOLD)
  92.                         {
  93.                                 PeopleNear = 0;
  94.                                 OutUpCount = 0;
  95.                                 OutDowmCount = 0;
  96.                         }       
  97.                 }
  98.         }
  99. }
复制代码


所有资料51hei提供下载:

dac0832中文资料.pdf

324.08 KB, 下载次数: 21, 下载积分: 黑币 -5

dac0832中文数据手册

源程序.rar

61.88 KB, 下载次数: 33, 下载积分: 黑币 -5

源程序

Sheet1.rar

18.17 KB, 下载次数: 25, 下载积分: 黑币 -5

原理图

dac0832.pdf

1.82 MB, 下载次数: 12, 下载积分: 黑币 -5

dac0832数据手册

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:422637 发表于 2018-11-19 21:37 | 只看该作者
贴主看到可以回复吗,我现在要设计一个人体红外感应系统,题目是:当没有人时,LCD1602显示“nobody”,LED灯每秒亮1次,当系统感应到有人靠近时,LED灯亮10秒,在液晶LCD1602上显示10秒倒计时,并显示“Somebody IN”。
回复

使用道具 举报

板凳
ID:422637 发表于 2018-11-19 21:37 | 只看该作者
如果可以做,我可以付费的,因为课设需要
回复

使用道具 举报

地板
ID:748365 发表于 2020-5-11 07:18 来自手机 | 只看该作者
下载打不开啊
回复

使用道具 举报

5#
ID:328014 发表于 2020-5-15 03:07 | 只看该作者

可以打开,我打开了 正在看程序
回复

使用道具 举报

6#
ID:668601 发表于 2020-5-15 09:45 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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