找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的电压电流温度检测显示仿真+程序

[复制链接]
跳转到指定楼层
楼主
具备AD检测功能,LCD1602显示功能。运放检测,mcu处理,附件包含仿真proteus8  和源程序,造福小白

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:

#include <reg51.h>
#include <stdio.h>
#include<intrins.h>


/*****************************程序引脚定义***********************************************/
/*定义LCD控制信号线*/
sbit SCL = P2^5;
sbit SDA = P2^6;

/*定义AD采集IC信号线*/
sbit ADE=P2^7;            //输出使能
sbit ADEOC=P3^7;        //转换完毕信号输出1
sbit ADST=P3^6;            //AD复位及开始信号
sbit ADSCK=P3^5;        //时钟信号输入
sbit ADA=P2^2;
sbit ADB=P2^1;
sbit ADC=P2^0;


sbit DQ=P2^3;//定义DS18B20接口
#define KEYValueShowEN 0

bit ack;

unsigned char LCD_data=0x08;




#define uchar unsigned char
#define uint unsigned int



/*dat用于存储AD采集回来的数字变量,范围为0-255*/
unsigned int dat;


/***********************************************************************************************************************/
/***********************************************************************函数声明*****************************************/
/************************************************************************************************************************/

/*LCD驱动函数名声明*/
void LCD_Init(void);         //初始化函数,设置LCD的显示模式
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);              //写入字符函数
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);              //写入字符串函数
void LCD_Clear(void);                                                                   //清屏函数
void LCD_Write_Data(unsigned char Data);                                                 //写入数据函数
void LCD_Write_Com(unsigned char com);                                                  //     写入命令函数
void LCD_PrintChar(unsigned char ucIdxX, unsigned char ucIdxY, unsigned char cData);  //向LCD中写入一个Char型数据
void LED_PrintValueI(unsigned char x, unsigned char y, int Data);                      //向LCD写入一个整形数据
void LED_PrintValueF(short int x, unsigned short int y, float ddata, unsigned short int num);//向LCD中写入一个浮点型数据

/*延时函数声明*/
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);




/*AD采样函数声明*/
void ADinit();                                //定时器和AD初始化
void ADdress(unsigned char add);            //八路模拟输入选择(0~7)add最大值为7
unsigned int readad(unsigned char add);                //AD转换函数

/***********************************************************************************************************************/
/***********************************************************************函数实现*****************************************/
/************************************************************************************************************************/


//*****************延时************************
void delay_nus(unsigned int n) //N us延时函数
{
    unsigned int i=0;
        for (i=0;i<n;i++)
            _nop_();
}
void delay_nms(unsigned int n) //N ms延时函数
{
    unsigned int i,j;
        for (i=0;i<n;i++)
            for (j=0;j<1140;j++);
}

/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
}
}
//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void Delay_ms(unsigned int n)
{
    unsigned int  i,j;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}

void nop4()
{
     _nop_();     //等待一个机器周期
     _nop_();     //等待一个机器周期
     _nop_();     //等待一个机器周期
     _nop_();     //等待一个机器周期
}
//***************************************
void Start()
{
     SDA=1;
    _nop_();
    SCL=1;
    nop4();
    SDA=0;
    nop4();
    SCL=0;
    _nop_();
    _nop_();
}
void Stop()
{
     SDA=0;
    _nop_();
    SCL=0;
    nop4();//>4us后SCL跳变
    SCL=1;
    nop4();
    SDA=1;
    _nop_();
    _nop_();
}
//******************************************
void  Write_A_Byte(unsigned char c)
{
unsigned char BitCnt;
  for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
    {
     if((c<<BitCnt)&0x80)  SDA=1;   //判断发送位
     else  SDA=0;               
     _nop_();
     SCL=1;               //置时钟线为高,通知被控器开始接收数据位
     nop4();
     _nop_();      
     SCL=0;
    }  
    _nop_();
    _nop_();
    SDA=1;               //8位发送完后释放数据线,准备接收应答位
    _nop_();
    _nop_();  
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    if(SDA==1)ack=0;     
       else
       {
       ack=1;        //判断是否接收到应答信号
      // P1=0x00;
       }                  
    SCL=0;
    _nop_();
    _nop_();
}

bit Write_Random_Address_Byte(unsigned char add,unsigned char dat)
{
     Start();    //启动总线
    Write_A_Byte(add<<1|0); //发送器件地址
    if(ack==0)return(0);
    Write_A_Byte(dat);   //发送数据
    if(ack==0)return(0);
    Stop(); //结束总线
    return(1);
}
//********************液晶屏使能*********************
void Enable_LCD_write()
{
    LCD_data|=(1<<(3-1));//E=1;
    Write_Random_Address_Byte(0x27,LCD_data);  //
    delay_nus(2);
    LCD_data&=~(1<<(3-1));//E=0;
    Write_Random_Address_Byte(0x27,LCD_data);
}

//*************写命令****************************
void LCD_write_command(unsigned char command)
{
    delay_nus(16);
    LCD_data&=~(1<<(1-1));//RS=0;
    LCD_data&=~(1<<(2-1));//RW=0;
    //LCD_data&=~(1<<(4-1));
    Write_Random_Address_Byte(0x27,LCD_data);

    LCD_data&=0X0f; //清高四位
    LCD_data|=command & 0xf0; //写高四位
    Write_Random_Address_Byte(0x27,LCD_data);
    Enable_LCD_write();

    command=command<<4; //低四位移到高四位
    LCD_data&=0x0f; //清高四位
    LCD_data|=command&0xf0; //写低四位
    Write_Random_Address_Byte(0x27,LCD_data);
    Enable_LCD_write();
}
//*************写数据****************************
void LCD_write_data(unsigned char value)
{
    delay_nus(16);
    LCD_data|=(1<<(1-1));//RS=1;
    LCD_data&=~(1<<(2-1));//RW=0;
    Write_Random_Address_Byte(0x27,LCD_data);

    LCD_data&=0X0f; //清高四位
    LCD_data|=value&0xf0; //写高四位
    Write_Random_Address_Byte(0x27,LCD_data);
    Enable_LCD_write();            

    value=value<<4; //低四位移到高四位
    LCD_data&=0x0f; //清高四位
    LCD_data|=value&0xf0; //写低四位
    Write_Random_Address_Byte(0x27,LCD_data);
    Enable_LCD_write();
}

//**********************设置显示位置*********************************
void set_position(unsigned char x,unsigned char y)
{
    unsigned char position;
    if (y == 0)
        position = 0x80 + x;
    else
        position = 0xc0 + x;
    LCD_write_command(position);
}
/***************************************************
*函数名:  void LCD_Clear(void)
*参数:无
*功能说明:清屏函数
****************************************************/
void LCD_Clear(void)
{
     LCD_write_command(0x01);
     DelayMs(5);
}

Keil代码与Proteus仿真下载: 基于51单片机的温度、电压电流检测系统程序 仿真.rar (244.72 KB, 下载次数: 47)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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