功能:
0.本项目采用STC89C52作为单片机系统的控制MCU
1.系统实时显示当前监测的4路电流,当检测的电流超过阈值时,蜂鸣器报警,并串口上报过流通道电流信息,
用户可通过串口发送命令的方式控制对应通道的继电器,同时关闭报警
2.按键可更改电流阈值,电流阈值掉电不丢失
控制命令:*Cx# 闭合继电器(x对应1/2/3/4/A) *Bx# 断开继电器(x对应1/2/3/4/A) A代表全部
3.采用DC002作为电源接口可直接输入5V给整个系统供电

仿真图:

主程序:

#include "main.h"
#include "math.h"bit refreshFlag = 1;
bit isNewFlag = 1;enum _MODE_DF_ dispMode;
xdata float f_cur[4]; //单位A
float f_curVolt = 0.0; //单位V
int curMax[4]; //过流阈值单位mAunsigned char setIndex = 0; //设定位置
unsigned char setChannel = 0; //设定通道
unsigned char cnt = 0;
unsigned char channel = 0;
unsigned char sendDelay = 0; //串口发送数据延时xdata char dis0[16]; //定义显示区域临时存储数组void main(void)
{EEPROM_Init();ReadData();// isNewFlag = 1;if (isNewFlag != 0) //新芯片{EEPROM_WriteByte(ISNEW_ADDRESS, 0);//给出初始值curMax[0] = 1000;curMax[1] = 1100;curMax[2] = 1200;curMax[3] = 1300;WriteData();}LCD_Init();   //初始化液晶DelayMs(200); //延时有助于稳定UART_Init(); //初始化串口LCD_DispStr(0, 0, "    Welcome!    ");DelayS(1);DelayS(1);Timer0_Init();RELAY1 = CLOSE;RELAY2 = CLOSE;RELAY3 = CLOSE;RELAY4 = CLOSE;BUZZER = OFF;while (1) //主循环{if (refreshFlag == 1) //500ms获取数据并发送{refreshFlag = 0;CD5051_SelChannel(channel);for (cnt = 0; cnt < 50; cnt++) //采集50次数据{f_curVolt = f_curVolt + 5 * (ReadADC(AIN0_GND)-1) / 255; //转换电流 ReadADC(AIN0_GND)-1仿真需要减1,因protues中最小输出code值为1DelayUs10x(10);}f_cur[channel] = f_curVolt / 50 * 2000 / 150; //求平均后计算电流,电阻150欧姆 I = U * 2000 / R (A)f_curVolt = 0;if ((f_cur[channel]*1000) > curMax[channel]) //电流超过阈值范围{BUZZER =  ON;SendData(channel); //发送错误通道电流及阈值电流}//液晶显示if (dispMode == NORMAL){DispNormal();}channel++;if (channel > 3){channel = 0;}}KeyProcess();}
}/************************* 正常显示 *************************/
void DispNormal()
{sprintf(dis0, "1:%4.1fA  2:%4.1fA", (float)f_cur[0], (float)f_cur[1]);LCD_DispStr(0, 0, dis0);sprintf(dis0, "3:%4.1fA  4:%4.1fA", (float)f_cur[2], (float)f_cur[3]);LCD_DispStr(0, 1, dis0);
}/************************* 显示电流阈值 *************************/
void DispSetCurrentLimit(unsigned char channel, unsigned char setIndex)
{sprintf(dis0, "  Max Current %1d ", (int)channel+1); //打印LCD_DispStr(0, 0, dis0);sprintf(dis0, "      %4.1f A    ", (float)curMax[channel]/1000); //打印LCD_DispStr(0, 1, dis0);switch (setIndex){case 1: LCD_SetCursor(9, 1, 1); break;default:;}
}/************************* 串口发送数据 *************************/
void SendData(unsigned char channel)
{sprintf(dis0, "Current %1d:%4.1fA\r\n", (int)channel+1, f_cur[channel]); //串口发送UART_SendStr(dis0, 16); //发送数据DelayMs(10);sprintf(dis0, "Max %1d: %4.1fA\r\n", (int)channel+1, (float)curMax[channel] / 1000); //串口发送UART_SendStr(dis0, 13); //发送数据DelayMs(10);
}/************************* 读取数据 *************************/
void ReadData(void)
{unsigned char i;isNewFlag = EEPROM_ReadByte(ISNEW_ADDRESS);for (i = 0; i < 4; i++){curMax[i] = EEPROM_ReadByte(BASE_ADDRESS + 2*i);curMax[i] = (curMax[i] << 8) | EEPROM_ReadByte(BASE_ADDRESS + 2*i + 1);}
}/************************* 写入数据 *************************/
void WriteData(void)
{unsigned char i;for (i = 0; i < 4; i++){EEPROM_WriteByte(BASE_ADDRESS + 2*i, ((curMax[i] & 0xFF00) >> 8));EEPROM_WriteByte(BASE_ADDRESS + 2*i + 1, (curMax[i] & 0x00FF));}
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void Timer0_Init(void)
{TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0 = (65536 - 10000) / 256; //重新赋值 10msTL0 = (65536 - 10000) % 256;EA = 1;  //总中断打开PT0 = 1;ET0 = 1; //定时器中断打开TR0 = 1; //定时器开关打开
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_Interrupt(void) interrupt 1
{static unsigned char time10ms = 0;TH0 = (65536 - 10000) / 256; //重新赋值 10msTL0 = (65536 - 10000) % 256;time10ms++;if (time10ms > 50) // 0.5s{refreshFlag = 1;time10ms = 0; }}/************************* 串口配置 *************************/
void UART_Init(void)
{SCON = 0x50;TH2 = 0xFF;TL2 = 0xFD;RCAP2H = 0xFF;  //(65536-(FOSC/32/BAUD))   BAUD = 115200 FOSC = 11059200RCAP2L = 0xFD;/*****************/TCLK = 1;RCLK = 1;C_T2 = 0;EXEN2 = 0;/*****************/TR2 = 1;ES   = 1; //关闭串口中断EA   = 1; //打开总中断}/************************* 串口发送字节 *************************/
void UART_SendByte(unsigned char dat) //串口发送单字节数据
{unsigned char time_out;time_out = 0;SBUF = dat;                        //将数据放入SBUF中while ((!TI) && (time_out < 100)) //检测是否发送出去{time_out++;DelayUs10x(2);}      //未发送出去 进行短暂延时TI = 0; //清除ti标志
}/************************* 串口发送字符串 *************************/
void UART_SendStr(unsigned char *s, unsigned char length)
{unsigned char num;num = 0x00;while (num < length) //发送长度对比{UART_SendByte(*s); //放松单字节数据s++;            //指针++num++;            //下一个++}
}/************************* 串口中断 *************************/
void UART_Interrupt(void) interrupt 4 //串行中断服务程序
{static unsigned char i = 0;static unsigned char firstBit = 0;static unsigned char R_buf[4];if (RI)//判断是接收中断产生{RI = 0; //标志位清零SBUF = SBUF;if (SBUF == '*'){firstBit = 1; //接收标志成功i = 0;R_buf[1] = 0;R_buf[2] = 0;R_buf[3] = 0;}if (firstBit == 1){R_buf[i] = SBUF;i++;if (i >= 4){i = 0;if (R_buf[0] == '*' && R_buf[3] == '#'){if (R_buf[1] == 'C') //继电器闭合命令{switch (R_buf[2]){case '1': RELAY1 = CLOSE; break;case '2': RELAY2 = CLOSE; break;case '3': RELAY3 = CLOSE; break;case '4': RELAY4 = CLOSE; break;case 'A': RELAY1 = CLOSE; RELAY2 = CLOSE; RELAY3 = CLOSE; RELAY4 = CLOSE; break;default:break;}BUZZER = OFF;}else if (R_buf[1] == 'B') //继电器断开命令{switch (R_buf[2]){case '1': RELAY1 = BREAK; break;case '2': RELAY2 = BREAK; break;case '3': RELAY3 = BREAK; break;case '4': RELAY4 = BREAK; break;case 'A': RELAY1 = BREAK; RELAY2 = BREAK; RELAY3 = BREAK; RELAY4 = BREAK; break;default:break;}BUZZER = OFF;}}firstBit = 0;}}}if (TI)//判断是中断产生{TI = 0; //标志位清零}
}

仿真演示视频:
https://www.bilibili.com/video/BV1c44y1Q7JX/

基于51单片机的4路交流电机电流监测系统Protues仿真相关推荐

  1. 基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统实时监测当前温湿度/土壤湿度/环境光强并显示 2.温湿度超过设定阈值范围,蜂鸣器响,同时开启对应控制继电器 3.土壤湿度低于设定下限,开启 ...

  2. 基于51单片机的多功能洗碗机(Protues仿真)

    本项目是以AT89C51最小系统为核心,外接DS18B20温度传感器.OVEN加热棒.LCD1604显示屏.ADC0832模数转换器模拟浊度传感器.L298和MOTOR当电机模块.电机模块用于模拟洗碗 ...

  3. 基于51单片机的八路多路温度测控系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时滚动显示8路温度传感器检测的温度值及设定温度值 2.当8路平均温度超过设定温度阈值范围,蜂鸣器报警,同时启动加热或降温装 ...

  4. 基于51单片机及NB-IoT的水箱水位监测系统原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统采用LCD1602实时显示水箱水位等信息 2.通过四个功能按键可设置水位等阈值 3.水位检测传感器采用的是声学的方式,超声波模块使用的是H ...

  5. 【003】基于51单片机的宠物自动定时、喂食系统的proteus仿真设计

    一.压缩包资料(私信获取) (1). 包含基于51单片机的宠物自动定时.喂食系统的proteus仿真设计一份: (2).包含基于51单片机的宠物自动定时.喂食系统keil源代码工程文件一份: (3). ...

  6. 单片机六位抢答器c语言程序,八路电子抢答器(基于51单片机的8路抢答器设计C语言程序)...

    哥,你还有AT89C51单片机8路抢答器的资料吗 哥,你还有AT89C51单片机8路抢答器的资料吗 AT89C51单片机8路抢答器的资料 源程序如下 #include #define uchar un ...

  7. 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真

    基于51单片机的74HC164驱动数码管显示程序与仿真 基于51单片机的74HC164驱动一位数码管显示程序与仿真 #include #include #define uchar unsigned c ...

  8. 【033】基于51单片机的步进电机角度测量与速度设定Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的步进电机角度测量与速度设定proteus仿真设计一份: (2).基于51单片机的步进电机角度测量与速度设定proteus仿真设计keli源代码一份: (3) ...

  9. 基于51单片机的双机串口通信排队叫号系统(LCD显示)设计

    基于51单片机的双机串口通信排队叫号系统(LCD显示)设计 1 开发环境 视频讲解 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 设计要求及 ...

最新文章

  1. 打造属于自己的underscore系列(五)- 偏函数和函数柯里化
  2. svn 命令行创建和删除 分支和tags
  3. Ajax同步和异步的区别
  4. 【Git】Git 本地的撤销修改和删除操作
  5. 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
  6. python 获取文件大小,创建时间和访问时间
  7. 32 多线程同步值Semaphore(信号量)
  8. linux系统基础调优32条技巧
  9. block size在equipment download中的用法
  10. Chrome浏览器无法观看视频,一直提示“adobe flash player 已过期” ?
  11. NAR | 陈加余/陈亮合作建立R-loop全基因组分布与调控的专家数据库
  12. 科研项目 | 深度参与前沿课题研究,全英华人教授协会(ABCP)资深学者亲授
  13. c语言单片机串口通讯,单片机C语言之串口通信协议
  14. java core 之 异常处理详解
  15. plextv 找不到服务器,【Apple TV教程】从Plex流式传输
  16. VS+Qt应用开发-设置鼠标光标
  17. android 自定义字体 ttf,Android利用TTF文件设置字体
  18. Apache 301转向技巧
  19. “碟中碟”虚拟光驱软件开发者——万春读《寒江》
  20. 手势识别原来还可以这样控制电脑,你知道怎么做到的吗?

热门文章

  1. YubiKey USB安全密钥也出现臭虫可免费换新
  2. 网络流__5 多源汇最大流
  3. 华为OD机试真题 C 实现【最长回文字符串】【2023 Q1 | 100分】
  4. vue3+echarts+地图(3D立体)
  5. [查询]计算机信息系统集成项目经理资质名单网址
  6. 刘韧:支持一个创业项目就像写了一条新闻
  7. element-ui el-table表格出现抖动闪动问题的解决
  8. Vegas Moive Studio 18 视频剪辑软件
  9. J2ME触摸屏的模拟器
  10. jquery 搜索like_10个jQuery Flash Like菜单