仿真图:
芯片/模块的特点:
AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。
AT89C52的主要特点如下:
内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。
RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。
外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。
通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。
定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。
串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。
低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。
宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。
主程序:
#include<reg52.h>
#include <intrins.h>
/*****************宏定义******************/
#define uint unsigned int
#define uchar unsigned char
#define u8 unsigned char
/***********位操作端口定义**************/
sbit speak=P3^3; // 蜂鸣器
sbit JK2=P3^2; // 水位继电器
sbit led3=P1^3; //3/4水位指示灯
sbit led2=P1^2; //1/2水位指示灯
sbit led1=P1^1; //1/4水位指示灯
sbit SW041=P1^4; //1/4水位
sbit SW021=P1^5; //1/2水位
sbit SW043=P1^6; //3/4水位
sbit SW01=P1^7; //满水位
uchar bianma[]={0xc0,0xf6,0xa1,0xa4,0x96};
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/***********************************************************************************************************
按键检测相关函数
***********************************************************************************************************/
//按键
sbit Key1=P3^7;
sbit Key2=P3^6;
#define KEY_SET 1
#define KEY_ADD 2
//========================================================================
// 函数: u8 Key_Scan()
// 应用: temp=u8 Key_Scan();
// 描述: 按键扫描并返回按下的键值
// 参数: NONE
// 返回: 按下的键值
// 版本: VER1.0
// 日期: 2015-05-29
// 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下
//========================================================================
u8 Key_Scan()
{
static u8 key_up=1;//按键按松开标志
if(key_up&&(Key1==0||Key2==0))
{
delay_ms(10);//去抖动
key_up=0;
if(Key1==0) return 1;
else if(Key2==0)return 2;
}
else if(Key1==1&&Key2==1)
key_up=1;
return 0;// 无按键按下
}
uchar Mode=0; //
/**********主函数******************/
void main()
{
u8 j=0;
u8 key;
u8 sd=0;
while(1)
{
key=Key_Scan(); //按键扫描
if(key==KEY_SET)
{
sd=1;
}
if(key==KEY_ADD)
{
sd=0;
}
if(Mode)
{
if(sd==1)
JK2=0;
if(sd==0)
JK2=1;
}
if((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==1)) //0水位 指示 启动水泵加水
{
led1=0;
led2=1;
led3=1;
JK2=0;
j++;
if(j<100)
{
speak=1;
}
else if(j<200)
{
speak=0;
} //
else j=0;
Mode=0;//禁止手动浇水
P2=bianma[0];
delay_ms(3);
}
if((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==0)) //1/4水位指示
{
led1=1;
speak=1;
led2=0;
led3=1;
Mode=1;//允许手动浇水
}
if((SW01==1)&&(SW043==1)&&(SW021==0)&&(SW041==0)) //1/2水位指示
{
led1=1;
speak=1;
led2=0;
led3=1;
Mode=1;//允许手动浇水
P2=bianma[2];
}
if((SW01==1)&&(SW043==0)&&(SW021==0)&&(SW041==0)) //3/4水位指示
{
led1=1;
speak=1;
led2=0;
led3=1;
Mode=1;//允许手动浇水
P2=bianma[3];
}
if((SW01==0)&&(SW043==0)&&(SW021==0)&&(SW041==0)) //如果水满了 指示灯指示 停止加水
{
led1=1;
speak=1;
led2=1;
led3=0;
Mode=0;//禁止手动浇水
JK2=1;
P2=bianma[4];
}
}
}
设计文件: