⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.txt

📁 该数控直流电流源以精密压控电流源为核心、用单片机、DAC组成控制电路
💻 TXT
字号:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

#define Key_add 0x01;
#define Key_subb 0x02;
#define Key_switch 0x03;
#define time1 1200

//******************************管脚定义***************************************
sbit ADSCLK=P1^4;			// 驱动时钟位
sbit ADCS=P1^5;				//片选信号位
sbit ADDOUT=P1^6;			//串行数据位

sbit DADIN=P1^0;				//数据输入线
sbit DACLR=P1^1;				//清零位
sbit DASCLK=P1^2;			//时钟线
sbit DACS=P1^3;				//片选位

sbit LED1=P2^7;		//4位LED位选
sbit LED2=P2^6;
sbit LED3=P2^5;
sbit LED4=P2^4;

sbit K1=P2^0;		//按键1,2,3
sbit K2=P2^1;
sbit K3=P2^2;
sbit L_mod_set=P3^4;		//显示模式1,2指示灯
sbit L_mod_test=P3^5;
sbit L_step1=P3^3;		//步进量指示灯
sbit L_step10=P3^6;
sbit L_step100=P3^7;

//*****************************************************************************
unsigned char code dis[12]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0x7f}; 
//预置LED段码
unsigned char code dis2[12]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0x7f};
 //预置LED段码,带小数点
uchar KEY;
uint DAout,DA_step,ADin;
uint sys_time,dis_time;

uint ADC();		//AD转换子程序
void DAC(uint datas);	//DA转换子程序
void key_scan();	//按键子程序


void t2_int() interrupt 5 using 1			//定时器2中断服务程序
{
	static uint dis_buf;
	static uchar c;
	TF2=0;
	sys_time++;
	c++;c=c%4; 					//4位LED显示
	switch (c) 
	{
	case 0:		
		LED4=1;
		P0=dis[dis_buf/1000];LED1=0;
		break;
	case 1:
		LED1=1;	
		P0=dis[(dis_buf%1000)/100];LED2=0;
		break;
	case 2:
		LED2=1;
		P0=dis[(dis_buf%100)/10];LED3=0;
		break;
	case 3:
		LED3=1;
		P0=dis[dis_buf%10];LED4=0;
		break;
	}
	if (sys_time%8==0)key_scan();		//整20ms则进行按键扫描
	dis_time++;
	if (dis_time%2400>=time1)			//每隔3秒切换显示内容
		{dis_buf=DAout>>1;L_mod_test=1;L_mod_set=0;}
	else
		{
			dis_buf=ADin>>1;L_mod_test=0;L_mod_set=1;
			if (sys_time%200==0)
			ADin=ADC();		//每0.5秒进行一次AD转换
		}
}

void init()
{
	TH2=0xF6;
	TL2=0x3c;
	RCAP2H=0xf6;
	RCAP2L=0x3c;
	
	SCON=0x50;
	TMOD=0x21;
	TH1=254;
	TL1=254;
	TR2=1;TR1=1;
	IE=0xa0;
	
	DA_step=20;L_step10=0;
	L_mod_set=0;dis_time=time1;
}
void main()
{
	init();
	DAC(0);
	while (1)
	{
		switch (KEY)		//按键服务
		{
		case 1:		//按下了“+”键则DA输出增加
			dis_time=time1;
			KEY=0;DAout=DAout+DA_step;
			if(DAout>4095)DAout=4095;
			DAC(DAout);
			break;
		case 2: 	//按下了“-”键则DA输出减小
			dis_time=time1;
			KEY=0;DAout=DAout-DA_step;
			if(DAout>4095)DAout=0;
			DAC(DAout);
			break;
		case 3: 	//按下了“步进量切换”键则改变每次按下“+”、“-”键时的步进电流
			KEY=0;
			if (DA_step==2){DA_step=20;L_step1=1;L_step10=0;L_step100=1;}
			else if (DA_step==20){DA_step=200;L_step1=1;L_step10=1;L_step100=0;}
			else if (DA_step==200){DA_step=2;L_step1=0;L_step10=1;L_step100=1;}
			else  {DA_step=20;L_step1=1;L_step10=0;L_step100=1;}
			break;
		}
	}
}
void key_scan()
{
	static uint t;
	static bit k11,k12,k21,k22,k31,k32;		//检测是否有按键动作(即引脚发生负跳变)
	static bit kd1,kd2,kd3;
	k11=!K1;k21=!K2;k31=!K3;
	k12^=k11;k12&=k11;
	k22^=k21;k22&=k21;
	k32^=k31;k32&=k31;
	if (k12){KEY=1;kd1=1;kd2=0;kd3=0;t=0;}		//有则返回相应键值
	else if(k22){KEY=2;kd1=0;kd2=1;kd3=0;t=0;}
	else if(k32){KEY=3;kd1=0;kd2=0;kd3=1;t=0;}

	if(kd1)											//检测是否有键长按不放,有则
		{kd1=k11;t++;if((t%15==0)&&t>50)KEY=1;}		//每0.3秒返回一次相应键值
	if(kd2)
		{kd2=k21;t++;if((t%15==0)&&t>50)KEY=2;}
	k12=k11;k22=k21;k32=k31;
}

void DAC(uint datas)
{
 unsigned char i,dh,dl;	
 	if (datas>4095)datas=4096; 		//当输出量大于DA的最大输出电压时,DA输出
	dl=datas%256; 					//最大电压
	dh=datas/256;
	dh=dh<<4;
	DASCLK=0;
	DACS=0;
	for (i=0;i<4;i++)
	{
		if ((dh&0x80)==0)
			DADIN=0;
		else
			DADIN=1;
		dh=dh<<1;
		DASCLK=1;DASCLK=0;
	}
	for (i=0;i<8;i++)
	{
		if ((dl&0x80)==0)
			DADIN=0;
		else
			DADIN=1;
		dl=dl<<1;
		DASCLK=1;DASCLK=0;
	}
	DACS=1;
}

uint ADC() using 1		//因为该子程序是被中断程序调用的,所以必须与中断服务程序//用同一个寄存器区
{
 unsigned char i;
 uint ADdata=0;
 ADSCLK=0;
 ADCS=0;
 while(ADDOUT!=1); 
 for(i=0;i<11;i++)		//读入12位数据
 {
  ADSCLK=1;
  ADSCLK=0;
  ADdata=ADdata|ADDOUT;
  ADdata=ADdata<<1;
 }
  ADSCLK=1;
  ADSCLK=0;
  ADdata=ADdata|ADDOUT;
  ADSCLK=1;
  ADSCLK=0;
  ADCS=1;
  return(ADdata);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -