• 基于单片机预费电表控制系统(proteus仿真+源程序)


    一、系统方案
    1、本设计采用这51单片机作为主控器。
    2、采集电量值送到液晶1602显示。
    3、按键设置预设值,实际使用电量超过设置,蜂鸣器报警
    在这里插入图片描述

    二、硬件设计
    原理图如下:
    在这里插入图片描述

    三、单片机软件设计
    1、首先是系统初始化
    void LCD_init(void)
    {
    delay_n10us(10);
    LCD_write_command(0x38);//设置8位格式,2行,5x7
    delay_n10us(10); LCD_write_command(0x0c);//开显示,关光标,不闪烁
    delay_n10us(10); LCD_write_command(0x06);//设定输入方式,增量不移位
    delay_n10us(10); LCD_write_command(0x01);//清除屏幕显示
    delay_n10us(100); //延时清屏,延时函数,延时约n个10us
    }

    2、液晶显示程序
    void LCD_write_command(uchar dat)
    {
    delay_n10us(10);
    LCD_RS=0; //指令
    LCD_RW=0; //写入
    LCD_E=1; //允许
    LCD_DB=dat; delay_n10us(10); //实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
    LCD_E=0; delay_n10us(10); //实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
    }

    void LCD_write_data(uchar dat)
    {
    delay_n10us(10);
    LCD_RS=1; //数据
    LCD_RW=0; //写入
    LCD_E=1; //允许
    LCD_DB=dat; delay_n10us(10);
    LCD_E=0; delay_n10us(10);
    }

    void LCD_disp_char(uchar x,uchar y,uchar dat)
    {
    uchar address;
    if(y==1)
    address=0x80+x;
    else
    address=0xc0+x;
    LCD_write_command(address);
    LCD_write_data(dat);
    }

    void LCD_disp_str(uchar x,uchar y,uchar *str)
    {
    uchar address;
    if(y==1)
    address=0x80+x;
    else
    address=0xc0+x;
    LCD_write_command(address);
    while(*str!=‘\0’)
    {
    LCD_write_data(*str);
    str++;
    }
    }

    3、按键程序
    void keyscan()
    {

    if(K1==0)//设定设定使用量+
    {
    	if(flag_KEY==1)	//按键只响应1次
    	{
    		flag_KEY=0;
    		
    		if(Set<9900)	Set=Set+10;
    	}
    }
    
    if(K2==0)//设定设定使用量-
    {
    	if(flag_KEY==1)	//按键只响应1次
    	{
    		flag_KEY=0;
    		
    		if(Set>10)	Set=Set-10;
    	}
    }
    
    
    //全部按键松开
    if(K1&&K2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    {
    flag_KEY=1;
    }

    }

    4、核心算法程序
    /-------------------------------------
    主函数
    ---------------------------------------
    /
    void main(void)
    {
    TIM0init();//定时器配置
    EX0=1;//打开外部中断0
    IT0=1;//下降沿触发

    LCD_init();//LCD初始化              
    LCD_disp_str(0,1," Check:000.0Kwh "); //显示
    LCD_disp_str(0,2,"000.0  000.0yuan"); //显示 设定使用量
    while(1)
    {
    	keyscan(); //按键扫描
    	Check();//测速程序
    	DisPlay();//LCD显示
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    }
    四、 proteus仿真设计
    Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
    在这里插入图片描述

  • 相关阅读:
    互斥锁、条件变量、信号量以及适用场景
    pandas Series矢量化的字符串函数——Series.str
    python+pygame+opencv+gpt实现虚拟数字人直播(一)
    Kamiya丨Kamiya艾美捷抗冷休克结构域蛋白E1说明书
    BUUCTF [BJDCTF2020]藏藏藏 1
    Tuxera2023最新版本新功能特性
    破解仓储难题?WMS仓储管理系统解决方案
    【红日靶场】vulnstack1-完整渗透过程
    Redis性能测试怎么做?看看大佬写的测试总结
    Stable Diffusion7
  • 原文地址:https://blog.csdn.net/bbxyliyang/article/details/134540710