找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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