资讯详情

基于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;         }  

标签: 51单片机稳压电源电路

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

锐单商城 - 一站式电子元器件采购平台