基于51单片机的数控稳压电源程序毕业设计模板参考资料
时间:2023-12-14 09:07:02
如下图所示:工程框架:
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;
}