锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于51单片机的数控稳压电源程序毕业设计模板参考资料

时间:2023-12-14 09:07:02 51单片机稳压电源电路

如下图所示:工程框架:

math.c

#include "reg52.h"
#include "math.h"
#define uchar unsigned char
#define uint unsigned int

void draw(uchar x,uchar y);//画点函数
void clear_xy(uchar x,uchar y);///清点函数

/*画正弦波函数 */
void sin_lcd(void)
{
float x,y;
for(x=0;x<128;x =0.15)
{
draw(x,y=20*sin(x*1/4) 32);
}
for(x=0;x<128;x =0.15)
{
clear_xy(x,y=20*sin(x*1/4) 32);
}
}
/*画圆函数 */
void round(uchar x,uchar y,uchar r)
{
float angle;
uchar dx,dy;
for(angle=0;angle<3.14/4;angle =0.03)//0.03
{
dx=r*sin(angle);
dy=r*cos(angle);
draw(x dx,y dy);
draw(x-dx,y dy);
draw(x dx,y-dy);
draw(x-dx,y-dy);
draw(x dy,y dx);
draw(x-dy,y dx);
draw(x dy,y-dx);
draw(x-dy,y-dx);
}
}
/*画椭圆函数 */
void ellipsoid(uchar x,uchar y,uchar a,uchar b)
{
float angle;
uchar dx,dy;
for(angle=0;angle<6.28;angle =0.06)
{
dx=a*sin(angle);
dy=b*cos(angle);
draw(x dx,y dy);
draw(x dx,y-dy);
draw(x-dx,y-dy);
draw(x-dx,y dy);
}
}
/*抛物线 */
void parabalo(float x)
{
for(;x<128;x =0.4)
draw(x,x*x/256);
}
/*对数 */
void fan(float x)
{
for(;x<128;x =0.2)
draw(x,30*log10(x));
}
/**/
void nn(uchar x,uchar y,uchar R)
{
float angle,x0,y0,r1=15,r2=5;
for(angle=0;angle<2*3.14*3;angle =0.03)
{
x0=(R-r1)*sin(angle)-r2*sin(R/r1*angle);
y0=(R-r1)*cos(angle) r2*cos(R/r1*angle);
draw(x x0,y y0);
}
}
/*
void beenline(float x,float y,float xe,float ye)
{
float dx,k;
k=(ye-y)/(xe-x);
dx=(xe-x)/128;
for(;x<=xe;x =dx)
{
draw(x,k*x y);
}
}
*/
void Lin(uchar x1,uchar y1,uchar x2,uchar y2)
{
uint x=x1<<8,y=y1<<8; //高8位为坐标值,低8位为积分累加器
char dx=x2-x1,dy=y2-y1,mm,nn;

while( abs(dx)<64 && abs(dy)<64 && dx*dy!=0 ) {dx*=6;dy*=6;} ///调整插补速度 //2

while( (x>>8)!=x2 || (y>>8)!=y2)
{
draw(mm=x>>8,nn=y>>8);
x =dx;
y =dy;
}

draw(x>>8,y>>8); //画终点
}

12864.c

#include"reg52.h"
#include"math.h"
#include"intrins.h"
#include"function.h"

#define DB P0

sbit RS = P1^4;
sbit RW = P1^5;
sbit E = P1^6;

uchar code logo[] = {

/*-- 调入图像:I:\液晶屏BMP图\菜单.bmp --*/
/*-- 宽度x高度=128x64 --*/
0x00,0x00,0x00,0x20,0x20,0x08,0x20,0x20,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x20,0x17,0xFC,0x13,0xF0,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x78,0x20,0x50,0x08,0x12,0x20,0x24,0x90,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x4B,0xFC,0x40,0x08,0x02,0x20,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
0x70,0x00,0x48,0x20,0x47,0xC8,0x02,0x1C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x48,0x20,0x44,0x48,0xF4,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x79,0x20,0x44,0x48,0x1B,0xF0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x48,0xA0,0x47,0xC8,0x11,0x10,0x1F,0xE0,0x00,0x00,0x0,0x00,0x00,0x00,
0x10,0x00,0x48,0xA0,0x44,0x48,0x11,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x48,0x20,0x44,0x48,0x14,0xA0,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x78,0x20,0x47,0xC8,0x18,0x40,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x60,0x48,0x20,0x40,0x08,0x10,0xA0,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x7C,0x60,0x40,0xA0,0x40,0x28,0x03,0x1C,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x40,0x40,0x10,0x0C,0x08,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x10,0x00,0x10,0x20,0x20,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xF8,0x3F,0xF8,0x13,0xF0,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x10,0x00,0x00,0x12,0x20,0x24,0x90,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x00,0x1F,0xF0,0x00,0x00,0x02,0x20,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x00,0x10,0x10,0x00,0x08,0x02,0x1C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x00,0x1F,0xF0,0x7F,0xFC,0xF4,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,
0x02,0x00,0x10,0x10,0x01,0x00,0x1B,0xF0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x00,0x04,0x80,0x09,0x40,0x11,0x10,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x44,0x88,0x09,0x20,0x11,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x24,0x90,0x11,0x10,0x14,0xA0,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x00,0x14,0xA0,0x21,0x08,0x18,0x40,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x60,0x14,0xC0,0x41,0x08,0x10,0xA0,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x7E,0x60,0x04,0x88,0x05,0x00,0x03,0x1C,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFC,0x02,0x00,0x0C,0x08,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x08,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1C,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xF0,0x40,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x00,0x11,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x00,0xFD,0x48,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x00,0x11,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x00,0x32,0x44,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x00,0x3A,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x00,0x52,0x48,0x09,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x02,0x00,0x50,0x10,0x18,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x00,0x90,0x20,0x28,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x60,0x10,0x40,0xC9,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x60,0x11,0x80,0x0A,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x16,0x00,0x0C,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0x08,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x17,0xFC,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x48,0x08,0x3C,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x42,0x08,0x41,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x5F,0xE8,0x41,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x00,0x42,0x08,0xF9,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x28,0x00,0x4F,0xC8,0xA1,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x48,0x00,0x4A,0x48,0x21,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x48,0x00,0x4A,0x48,0xFD,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7E,0x00,0x4A,0x48,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x4A,0xC8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x60,0x42,0x08,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1E,0x60,0x42,0x28,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x10,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

                     };

/************************************************************************************
                   查忙函数          
************************************************************************************/
void busy(void)//RS=0;RW=1;wait=0闲;wait!=0忙 
{
    uchar wait;
    RS = 0;
    RW = 1;
    E = 1;
    for(;;)
    {
        wait = DB;
        wait &= 0x80;
        if(wait == 0)break;
    }
    E = 0;
}

/************************************************************************************
                   写指令函数         
************************************************************************************/
void w_code(uchar c)//RS=0;RW=0;E下降沿 
{
    busy();
    RS = 0;
    RW = 0;
    DB = c;
    E = 1;
    E = 0;
    DB = 0xff;
}

/************************************************************************************
                   写数据函数        
************************************************************************************/
void w_data(uchar d)//RS=1;RW=0;E下降沿 
{
    busy();
    RS = 1;
    RW = 0;
    DB = d;
    E = 1;
    E = 0;
    DB = 0xff;
}

/************************************************************************************
                         读数据函数         
************************************************************************************/
uchar r_data(void)//RS=1;RW=1;E下降沿 
{
    uchar rd_lcd;
    busy();
    RS = 1;
    RW = 1;
    E = 1;
    rd_lcd = DB;
    E = 0;
     return rd_lcd;
}

/************************************************************************************
                   写DGRAM:x_lcd横坐标,y_lcd纵坐标         
************************************************************************************/
void address(uchar x_lcd,uchar y_lcd)// 
{
    w_code(y_lcd);//垂直坐标 
    w_code(x_lcd);//水平坐标 
}

/************************************************************************************
                   初始化液晶屏 
                   0:字库  1:绘图       
************************************************************************************/
void  lcd_rst(bit a)
{  
    if(a)
    {
    w_code(0x01);//   清屏  
    w_code(0x32);//   功能设置---8BIT控制界面,绘图显示ON  
    w_code(0x36);//   功能设置---8BIT控制界面,扩充指令集  
    }
    else
    {
    w_code(0x30);// 功能设置---8BIT控制界面,基本指令集 
    w_code(0x0c);//显示打开,光标关,反白显示关 
    w_code(0x01);// 清除屏幕显示,将DDRAM的地址计数器归零 
    }
}

/************************************************************************************
---------------------------写整屏点阵数据 
---------------------------x :图像数据的起始地址        
************************************************************************************/

void  write_lcd_full(uint x )
{
      
      uchar  i,j,a;
      j = 0x80; //Y地址寄存器   
      for(a = 0;a < 32;a++)
          {
        w_code(j);
        j++;
        w_code(0x80);//X地址寄存器 
          for(i = 0;i < 16;i ++)
              {
            w_data(logo[x]);
            x++;
            }
        }

      j = 0x80; //Y地址寄存器  
      for(a = 0;a < 32;a++)
          {
        w_code(j);
        j++;
        w_code(0x88);//X地址寄存器 
          for(i = 0;i < 16;i ++)
              {
            w_data(logo[x]);
            x++;
            }
        }
}

 

main.c

#include"reg52.h"
//#include"math.h"
#include"stdlib.h"
#include"function.h"


sbit RS = P1^4;
sbit RW = P1^5;
sbit E  = P1^6;

#define DBUS P0
sbit clk_574_1 = P2^3;
//sbit clk_574_2 = P1^3;
//sbit lcd_rs    = P1^4; 

uint idac;
    

idata uchar GOUT[7];
idata float temp1;
idata float dac_temp; 
idata float sheding_temp; 
idata float sheding_temp1;
char  code dx516[3] _at_ 0x003b;//这是为了仿真设置的(大虾仿真器) 

/************************************************************************************
                              把浮点数拆开存储指针型数据  
                              输入浮点数,方式0:设定值,1:检测值  
************************************************************************************/
void chai(float x,bit y)  
{
    uint i;
    for(i = 0;i < 7;i ++)
        GOUT[i] = 0;
    if(y == 0)
    {
        i = x / 10;
        if(i == 0)
            GOUT[0] = ' ';
        else
            GOUT[0]    = i + '0';
        GOUT[1] = (int)x % 10 + '0';
        x = x * 10;
        GOUT[3] = (int)x % 10 + '0';

        x = x * 10;
        if(((int)x % 10) >= 5 )// 防止后面大于4的数被舍去  
        {GOUT[3] = GOUT[3] + 1;}
        else
        {;}

        GOUT[4] = ' ';
        GOUT[5] = ' ';
    }
    else
    {
        i = x / 10;
        if(i == 0)
            GOUT[0] = ' ';
        else
            GOUT[0] = i + '0';
        GOUT[1] = (int)x % 10 + '0';
        x = x * 10;
        GOUT[3] = (int)x % 10 + '0';
        x = x * 10;
        GOUT[4] = (int)x % 10 + '0';
        x = (x * 10);
        GOUT[5] = (unsigned int)x % 10 + '0';
    }
    GOUT[2] =  '.';
    GOUT[6] =  '\0';
}

/************************************************************************************

//向LCM发送一个字符串,长度64字符之内。  

************************************************************************************/
void lcm_w_word(uchar x,uchar y,uchar *str)
{
   x = x+y;
   w_code(x);
  while(*str != '\0')
  {
       w_data(*str++);
   }
  *str = 0;
}
/************************************************************************************
                              显示设定电压  
************************************************************************************/
void  disp_sheding()
{
    lcm_w_word(0x90,0x00,"设定:");
    sheding_temp1 = sheding_temp + 0.0005;//------加0.0005修正有时显示.0999 
    chai(sheding_temp1,1);  
    lcm_w_word(0x90,3,GOUT);
    w_code(0x96);
    w_data('V');    
}
/************************************************************************************
                 AD的16位整形数转换成浮点电压或电流值  
************************************************************************************/
float adjisuan_U(uint x)
{
    temp1 = 11.990 / 0x5e1f;
    temp1 = x * temp1;
    return temp1;
}

float adjisuan_I(uint x)  //
{
    temp1 = 0.899 / 0x253d;
    temp1 = (x * temp1)-0.005;
    return temp1;
}
/************************************************************************************
*
*函数功能:输入浮点数  
*
************************************************************************************/
float scanf_float(void)
{
    static uchar i = 0;
    static uchar x[5] = {'0','0','0','0','0'};
    static bit k = 1;
    uchar temp1,temp2;
    temp1 = key_sm();
    temp2 = key_sm();
    if((temp2 == 0xff) || (temp1 != temp2))
    {
        k = 1;
        return(atof(x));
    }
    else if(k)
    {
        k = 0;
        x[i] = temp1;
        i ++;
        if((temp1 == key_esc) || (i == 4))
        {
            x[0] = '0';
            x[1] = '0';
            x[2] = '0';
            x[3] = '0';
            x[4] = '0';
            i = 0;
        }
        return(atof(x));
    }
}

/************************************************************************************

                              扫描按键,并根据键值修改DAC的电压  

************************************************************************************/
void key_dac()
{
        uchar key_qiao;
       key_qiao = key_sm();
    switch(key_sm())
        {
    case key_shang:dac_temp = dac_temp + 1.0;break;//---按下上键电压加1V 
    case key_xia  :dac_temp = dac_temp - 1.0;break;//---按下下键电压减1 
    case key_zuo  :dac_temp = dac_temp - 0.1;break;//---按下左键电压减0.1
    case key_you  :dac_temp = dac_temp + 0.1;break;//---按下右键电压加0.1 
    case key_0    :dac_temp = 0;             break;//---按下0键电压归0 
    default: key_qiao = 0xff;
         }
        if(key_qiao != 0xff)  //  10月1日 这里原来是0x00就读AD不正常        
               {
               RS  =  1;            
               RW  =  0;    //--------避免液晶屏干扰数据总线 
               if(dac_temp < 0){dac_temp = 0;}    //----判断电压低于0大于30时把数据归0 
            if(dac_temp >= 30.10){dac_temp = 0;}    
            sheding_temp = dac_temp ;
            disp_sheding();
            idac = conver(dac_temp);  
              dac(idac);
            delay(50000);
            }
}
/************************************************************************************
                                     主函数    
************************************************************************************/
main()
{
 
            lcd_rst(0);
            rst_ad();    
            dac_temp = 0 ;
               RS  =  1;            
               RW  =  0;    //--------避免液晶屏干扰数据总线          
                 dac(conver(dac_temp));       //吸合低压继电器并输出0V 
               LED_ONOFF(1);//  打开背光源   
              set_7705_ch(0);
            read_AD_data(0x38);
            set_7705_ch(1);
            read_AD_data(0x39);

           disp_sheding();//显示设定电压   
           while(1)
           {
           lcm_w_word(0x80,0x02,"稳压电源"); 
           lcm_w_word(0x90,0x00,"设定:");          
           lcm_w_word(0x88,0x00,"电压:");   
           lcm_w_word(0x98,0x00,"电流:"); 
               
           write_ad(0x10);
           write_ad(0x04);
           adjisuan_U(read_AD_data(0x38));
           chai(temp1,1);  
           lcm_w_word(0x88,3,GOUT);
           key_dac();

           write_ad(0x11);
           write_ad(0x14); 
           adjisuan_I(read_AD_data(0x39));
           chai(temp1,1);  
           lcm_w_word(0x98,3,GOUT);
           key_dac();
           
           }
                                                                          
}
 

 

DAC.C

#include"reg52.h"
#include"function.h"

#define DBUS P0
sbit clk_574_1 = P2^3;
//sbit clk_574_2 = P1^3;
//sbit lcd_rs    = P1^4;
static uchar data_574;  //74574输出数据 
static uchar data_5741 = 0x10;//------------加了临时保存数据的寄存器才避免了DA操作时干扰背光  

/************************************************************************************
                              DAC输出转换函数 
************************************************************************************/
void dac(uint c)
{
    uint i;    
    data_574 =  data_5741;

    data_574 &= 0xfe;
    DBUS = data_574;
    clk_574_1 = 0;
    clk_574_1 = 1;//574输出存数据,选通DAC      9月8日加上的,以前忘记了 

    for(i = 0x8000;i > 0;i >>= 1)
    {
        if((c & i) == 0)
        {data_574 &= 0xFB;}//数据输出为0还是1    //0xf7      
        else
        {data_574 |= 0x04;}//if和else后的大括号我后加的   
        DBUS = data_574;    
        clk_574_1 = 0;    
        clk_574_1 = 1;
                 
        data_574 &= 0xFD;
        DBUS = data_574;    
        clk_574_1 = 0;                                    
        clk_574_1 = 1;        
        data_574 |= 0x02;
        DBUS = data_574;    
        clk_574_1 = 0;    
        clk_574_1 = 1;

    }
    data_574 |= 0x01;
    DBUS = data_574;
    clk_574_1 = 0;
    clk_574_1 = 1;//574输出锁存数据,选通DAC

    if(c <= 0x06c9) 
       RL_ONOFF(0);  //吸合低压继电器 0 ~ 15  
    else 
       RL_ONOFF(1);  //吸合高压继电器  15 ~ 30
               
}

/************************************************************************************
                   继电器切换 1: 高压吸合   0: 低压吸合     
************************************************************************************/
void  RL_ONOFF(bit i)
{
    if(i==1)
    {
        data_574  |= 0x20;
        data_574  &= 0xbf;
        DBUS      =  data_574;    
        clk_574_1 =  0;    
        clk_574_1 =  1;
    }
    else
    {
        data_574  |= 0x40;
        data_574  &= 0xdf;
        DBUS      =  data_574;    
        clk_574_1 =  0;    
        clk_574_1 =  1;
        data_5741 =  data_574;
    }      
}

/************************************************************************************
                   蜂鸣器    1: 开   0: 关      
************************************************************************************/
void  BELL_ONOFF(bit i)
{
    if(i == 0)
    {
        data_574  |= 0x10;
        DBUS      =  data_574;    
        clk_574_1 =  0;    
        clk_574_1 =  1;
    }
    else
    {
        data_574  &= 0xef;
        DBUS      =  data_574;    
        clk_574_1 =  0;    
        clk_574_1 =  1;
        data_5741 =  data_574;
    }      
}
/************************************************************************************
                   实际输出电压转换成DA输出值 ,返回整形数        
************************************************************************************/
uint conver(float x)
{
    float temp;
    temp = 14.995 / 0x0745;
    temp = x / temp;
    return(uint)temp;
}

/************************************************************************************
                   控制背光开关 1:开   0:关         
************************************************************************************/
void  LED_ONOFF(bit i)
{
    if(i==1)
    {
        data_574  |= 0x80;
        DBUS      =  data_574;    
        clk_574_1 =  0;    
        clk_574_1 =  1;
    }
    else
    {
        data_574  &= 0x7f;
        DBUS      =  data_574;    
        clk_574_1 =  0;    
        clk_574_1 =  1;
    } 
    data_5741 =  data_574; 
}

/************************************************************************************
                   输出补偿调整          
************************************************************************************/
void change(void)
{
    
}

 

fun.c

#ifndef _FUNCTION_H_
#define _FUNCTION_H_
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

#define key_shang 0x18
#define key_xia   0x19
#define key_zuo   0x1b
#define key_you   0x1a
#define key_enter 0x2f
#define key_1     0x31
#define key_2     0x32
#define key_3     0x33
#define key_4     0x34
#define key_5     0x35
#define key_6     0x36
#define key_7     0x37
#define key_8     0x38
#define key_9     0x39
#define key_esc   0x0c
#define key_0     0x30
#define key_dian  0x2e

extern void  busy(void);//查忙函数 
extern void  w_code(uchar c);//写指令函数 
extern void  w_data(uchar d);//写数据函数  
extern uchar r_data(void);//读数据函数      
extern void  address(uchar x_lcd,uchar y_lcd);//写DGRAM:x_lcd横坐标,y_lcd纵坐标     
extern void  dac(uint c);//DAC数据转换函数 
extern uint  conver(float x);//实际输出电压转换成DA输出值 
extern void  LED_ONOFF(bit i);//控制LCD背光   
extern void  RL_ONOFF(bit i); // 控制继电器吸合  
extern void  BELL_ONOFF(bit i);//蜂鸣器控制 
extern void  lcd_rst(bit a); 
extern void  rst_ad();
extern write_ad(uchar i);
extern void  delay(uint i);
extern float adjisuan(uint x);
extern uint read_AD_data(uchar y);
extern void set_7705_ch(bit a);
extern uchar key_sm();
extern void key_dac();
extern void  write_lcd_full(uint x );
#endif

 

AD.C

#include"reg52.h"
#include"function.h"
#include "intrins.h"

/****************AD端口定义****************/
sbit  AD_CLK  = P3^2;
sbit  AD_RST  = P3^3;
sbit  AD_DIN  = P3^7;
sbit  AD_DOUT = P3^6;
sbit  AD_DRDY = P3^5;
 
/************************************************************************************
                              延时  
************************************************************************************/
void  delay(uint i)
{
    for(;i > 0;i--);

/************************************************************************************
                              复位AD7705 
************************************************************************************/
void rst_ad()
{
    AD_DRDY = 1;
    AD_CLK  = 1;
    AD_DIN  = 1;
    AD_DOUT = 1;
    AD_RST  = 0;
    delay(300);
    AD_RST  = 1;     //  复位电路可以接5V电   
    delay(500); 
}

/************************************************************************************
                              写1字节到AD7705
************************************************************************************/
write_ad(uchar i)
{
    uchar a;
    for(a = 8;a > 0;a--)
    {
        
        if((i & 0x80) == 0)
           {AD_DIN = 0;}
        else
           {AD_DIN = 1;}
        i <<= 1;
        AD_CLK = 0;
        _nop_();
        _nop_();
        _nop_();
        AD_CLK = 1;     
    }
}

/************************************************************************************
                              设置AD7705通道 
*  0 为第一通道 
*  1 为第二通道  

    //MD1(0)  工 作 模 式 
    //MD0(0)     工 作 模 式   
    //G2(0)     增益选择    0       0     0     0      1       1    1     1
    //G1(0)     增益选择      0       0        1     1      0       0    1     1
    //G0(0)     增益选择      0       1        0     1      0       1    0     1
    //                         1      2        4     8      16   32    64     128
    //B/U(0)     单极性/双极性工作。“0”表示选择双极性操作,“1”表示选择单极性工作  
    //BUF(0)     缓冲器控制。“0”表示片内缓冲器短路,缓冲器短路后,电源电流降低  
    //          此位处于高电平时,缓冲器与模拟输入串联,输入端允许处理高阻抗源  
    //FSYNC(1) 滤波器同步  
      
************************************************************************************/

void set_7705_ch(bit a)
{
    if(a == 0)
    {
        write_ad(0x20);//write_ad(0x20);
        write_ad(0x05);
        write_ad(0x10);//write_ad(0x10);
        write_ad(0x44);//write_ad(0x46);//设置40H 双极性方式 44H 单极性方式
    }
    else
    {
        write_ad(0x20);//write_ad(0x20);
        write_ad(0x05);
        write_ad(0x10);//write_ad(0x10);
        write_ad(0x44);//write_ad(0x46);//设置40H 双极性方式 44H 单极性方式
    }        
}


/************************************************************************************
                              读1字节到AD7705   
************************************************************************************/
uchar read_ad()
{
    uchar temp2;
    uchar a;
    for(a = 8;a > 0;a--)
    {
        AD_CLK = 0;
        _nop_();
        _nop_();
        _nop_();
        AD_CLK = 1;
        _nop_();
        _nop_();
        _nop_();
        temp2 <<= 1;
        if(AD_DOUT == 0)
           {temp2 &= 0xfe;}
        else
           {temp2 |= 0x01;}
     }
     return temp2;
}

/************************************************************************************
                  读AD7705转换后的数据  
// 把DRDY位换为读内部寄存器状态位,显示不正常  
************************************************************************************/

uint read_AD_data(uchar y)
{
    uint  temp;
    uchar i;
    write_ad(y);
    while(AD_DRDY);
    for(i = 16;i > 0;i--)
    {
        AD_CLK = 0;
        _nop_();
        _nop_();
        _nop_();
        AD_CLK = 1;
        _nop_();
        _nop_();
        _nop_();
        temp <<= 1;
        if(AD_DOUT == 0)
           {temp &= 0xfffe;}
        else
           {temp |= 0x0001;}
   }
   return temp;            
}

 

KEY.C

#include "reg52.h"
#include"function.h"

sbit clk_574_2 = P1^3;
sbit lcd_rs    = P1^4;
sbit RS = P1^4;
sbit RW = P1^5;

sbit key1 = P1^1;
sbit key2 = P1^2;

uchar key_data;

#define DBUS P0
/************************************************************************************
*按键扫描 
*返回键值    
************************************************************************************/
uchar key_sm()
{
    RS  =  1;            
    RW  =  0;    //--------避免液晶屏干扰数据总线 
    key1 = 1;
    key2 = 1;    //--------按键置高电平  
    key_data = 0xff;
       DBUS = 0xff;
       clk_574_2 = 0;    
       clk_574_2 = 1;
    if(key1 == 0){key_data = key_enter;}
       DBUS = 0xfe;
       clk_574_2 = 0;    
       clk_574_2 = 1;
    if(key1 == 0){key_data = key_9;}
    if(key2 == 0){key_data = key_dian;}
       DBUS = 0xfd;
       clk_574_2 = 0;    
       clk_574_2 = 1;
    if(key1 == 0){key_data = key_6;}
    if(key2 == 0){key_data = key_3;}
       DBUS = 0xfb;
       clk_574_2 = 0;    
       clk_574_2 = 1;
    if(key1 == 0){key_data = key_5;}
    if(key2 == 0){key_data = key_2;}
       DBUS = 0xf7;
       clk_574_2 = 0;    
       clk_574_2 = 1;
    if(key1 == 0){key_data = key_8;}
    if(key2 == 0){key_data = key_0;}
       DBUS = 0xef;
       clk_574_2 = 0;    
       clk_574_2 = 1;
    if(key1 == 0){key_data = key_4;}
    if(key2 == 0){key_data = key_1;}
        DBUS = 0xdf;
        clk_574_2 = 0;    
        clk_574_2 = 1;    
    if(key1 == 0){key_data = key_7;}
    if(key2 == 0){key_data = key_esc;}
        DBUS = 0xbf;
        clk_574_2 = 0;    
        clk_574_2 = 1;    
    if(key1 == 0){key_data = key_you;}
    if(key2 == 0){key_data = key_xia;}
        DBUS = 0x7f;
        clk_574_2 = 0;    
        clk_574_2 = 1;        
    if(key1 == 0){key_data = key_zuo;}
    if(key2 == 0){key_data = key_shang;}

    return     key_data;        
}
 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章