信号发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。 本设计采用STC89C52单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM358)、按键和LCD12864液晶显示电路。电路采用单片机和一片DAC0832数模转换器组成数字式低频信号发生器,可产生正弦波、矩形波和三角波三种波形。系统通过单片机产生数字信号,通过DAC0832转换为模拟信号,再通过放大器LM358就可以得到双极性的各种波形,最终由示波器显示出来。通过键盘来控制四种波形的类型选择、频率变化,其中频率调节范围为5HZ-100HZ,并通过液晶12864显示其各自的波形类型以及频率数值。
外加红外热释电传感器(PIR)现在最常见的就是楼道内的自动风扇基本用到的就是这种方案。
电路原理图如下:
单片机源程序如下:
代码:
- #include <reg52.h>
- #include <intrins.h>
- #include "hcsr501.h"
- #include "lcd12864.h"
- #include "Function Generator.h"
- #define uchar unsigned char
- #define uint unsigned int
- /**********主题显示*****************/
- uchar code Theme_one[]="凄凄切切群群瞧瞧";
- uchar code Theme_two[]="亲戚去去去去瞧瞧";
- uchar code Theme_thr[]="凄凄切切群群瞧瞧";
- uchar code Theme_fou[]="亲亲我群群去瞧瞧";
- /**********内容显示****************/
- uchar code SOURCE_WAVE[] ="波形: ";
- uchar code SOURCE_FREQUENCY[]="频率: HZ";
- uchar code SOURCE_AMPLITUDE[]=" 水龙头的状态 ";
- uchar code SOURCE_STATE[] =" ";
- /****************1ms延时函数********************/
- void DIS_theme()
- {
- set_LCD12864_pos(0,0);
- write_12864str(Theme_one);//"桂林电子科技大学""
- set_LCD12864_pos(1,0);
- write_12864str(Theme_two);//学号
- set_LCD12864_pos(2,0);
- write_12864str(Theme_thr);
- set_LCD12864_pos(3,0);
- write_12864str(Theme_fou);
- delay_ms(1000);
- set_LCD12864_pos(0,0);
- write_12864str(SOURCE_WAVE); //波形
- set_LCD12864_pos(1,0);
- write_12864str(SOURCE_FREQUENCY);//频率
- set_LCD12864_pos(2,0);
- write_12864str(SOURCE_AMPLITUDE);////状态
- set_LCD12864_pos(3,0);
- write_12864str(SOURCE_STATE);
- }
- /****************主函数************************/
- void main()
- {
- Timer0Init();//初始化定时器0
- Timer1Init();//初始化定时器1
- EA=1;
- LCD12864_init();//初始化液晶
- LCD12864_Busy();//液晶判忙
- DIS_theme();//主题显示
- while(1)
- {
-
- PUTOUT_WAVE();//波形输出
- check_option();//水龙头感应检测
- }
- }
代码:
- #include "reg52.h"
- #include "hcsr501.h"
- #include "lcd12864.h"
- #define PEOPLE_NEAR_THRESHOLD 10 //人体接近判断阀值
- #define PEOPLE_LEAVE_THRESHOLD 5 //人体离开判断阀值
- uchar PeopleNear = 0; //人体接近判断标示,0:无人接近或人离开;1:人接近
- uchar OutUpCount = 0; //HC-SR501输出高电平计数
- uchar OutDowmCount = 0; //HC-SR501输出低电平计数
- //uchar IR_flag=0; //标志位
- //uchar num=0;
- /****************1ms延时函数********************/
- void delay_ms(uint del)
- {
- uint i;
- for(;del>0;del--)
- for(i=124;i>0;i--);
- }
- /*****************************************************
- ** 函数名称:Timer0Init
- ** 函数功能:单片机定时器0初始化,每50MS产生1次中断
- ** 参 数:无
- ** 函数返回:无
- ******************************************************/
- void Timer0Init(void) //50毫秒@12MHz
- {
- TMOD |= 0x01; //设置定时器模式
- TH0 = (65536 - 50000) / 256; // 设置定时器0为工作方式1(M1M0为01)
- TL0 = (65536 - 50000) % 256; // 装初值12M晶振定时50ms数位50000
- //EA = 1; // 开总中断
- TR0 = 1; //定时器0开始计时
- ET0 = 1;
- }
- /*****************************************************
- ** 函数名称:check_option()
- ** 函数功能:判断人是否走进还是离去
- ** 参 数:无
- ** 函数返回:无
- ******************************************************/
- void check_option()
- {
- if(PeopleNear) //热释电红外端口有输出为0,无输出为1.
- {
-
- relay=1;//继电器吸合
- set_LCD12864_pos(3,0);
- write_12864str(" OPEN ! Welcome!");//显示字符串Welcome!
- delay_ms(2500);delay_ms(2500);
-
- }
- else
- //IR_flag=0;
- relay=0; //继电器断开
- set_LCD12864_pos(3,0);
- write_12864str("CLOSE ! See you!");//显示字符串See you!
- // delay_ms(2500);delay_ms(2500);
- // set_LCD12864_pos(3,4);
- // write_12864str("no one !");//显示字符串Welcome!
- }
- /*****************************************************
- ** 函数名称:Timer0IntPro
- ** 函数功能:单片机定时器0中断处理函数
- ①连续10次采集到HC-SR501高电平输出,判断
- 为有人体接近。
- ②当已判断有人体接近年后,连续10次采集到
- HC-SR501低电平输出,判断为人体离开
- ** 参 数:无
- ** 函数返回:无
- ******************************************************/
- void Timer0IntPro(void) interrupt 1 using 0
-
- {
- TH0 = (65536-50000)/256;//装初值,50ms申请一次中断
- TL0 = (65536-50000)%256;
- // num++; //申请一次中断num加1一次
- // if(num==100)
- // {num=0;IR_flag=1;}
- if(Out)
- {
- OutUpCount++;
- if(OutUpCount >= PEOPLE_NEAR_THRESHOLD)
- {
- PeopleNear = 1;
-
- }
- }
- else
- {
- if(PeopleNear)
- {
- OutDowmCount++;
- if(OutDowmCount >= PEOPLE_LEAVE_THRESHOLD)
- {
- PeopleNear = 0;
- OutUpCount = 0;
- OutDowmCount = 0;
- }
- }
- }
- }
所有资料51hei提供下载: