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

📄 main.c

📁 采用1*4,4*4键盘同时控制,带有8位数码显示的数控直流电源驱动及应用程序(Keil c51)
💻 C
📖 第 1 页 / 共 2 页
字号:


/***************Copyright (c)*****************************************                             
**                                     
** Description: Made By KDQX in Hebust
** Email:	shirenwei2003@163.com
**                               
**--------------File Info--------------------------------------------
**
** File Name: 数据直流电源(digtal power)
** Last modified Date: 2006-12-01 
** Last Version: V1.1
** Description: 河北科技大学2005年大学生创新项目
**
**-------------------------------------------------------------------
**
** Created By: 侍任伟(tigerots)
** Company: 科大七星工作室(KDQX)
** Created date: 2003-11-16
** Version: V1.0
** Descriptions:用AT89S52单片机实现电压电流的数字化控制
**
**-------------------------------------------------------------------
**
** Modified by:侍任伟(tigerots)
** Company: 科大七星工作室(KDQX)
** Modified date: 2006-12-01
** Version:V1.1
** Descriptions:增加用户存储/调用功能(RAM)
**
**-------------------------------------------------------------------
**
** Modified by:
** Company: 
** Modified date: 
** Version:
** Descriptions:
**
**********************************************************************/

//头文件
#include "reg51.h"
#include "intrins.h"
#include "disp.c"
#include "key.c"
#include "delay.c"
#include "tlc5615.c"
#include "tlc1549.c"
//#include "x5045.c"

//4mul4键盘功能键
#define USER 10
#define CALL 11
#define SETi 12
#define SETu 13
#define ESC  14
#define OK   15

//1mul8键盘功能键
#define ISET 19
#define ISEL 18
#define IADD 17
#define ISUB 16

#define USET 23
#define USEL 22
#define VADD 21
#define VSUB 20

//系统状态定义
#define IDLE_STA 		0xf0
#define U_SET_STA 		0xf1
#define I_SET_STA		0xf2
#define U_SETu   		0xf3
#define I_SETi			0xf4
#define USER_SET_STA 	0xf5
#define CALL_USER_STA 	0xf6

//函数声明
void IDLE_Mange(void);
void U_SET_Mange(void);
void I_SET_Mange(void);
void Disp_I_Real(void);
void Disp_U_Real(void);
void U_SETu_Mange(void);
void I_SETi_Mange(void);
void USER_SET_Mange(void);
void CALL_USER_Mange(void);


//外部变量声明
extern unsigned char Disp_Buf[8];

//外部函数声明
extern void Init(void);
extern void Disp (void);
extern unsigned char Key(void);
extern void Delay(unsigned int N);
extern unsigned int Read1549_U(void);
extern unsigned int Read1549_I(void);
extern void SEND_5615_U(unsigned int dd);
extern void SEND_5615_I(unsigned int dd);

//全局变量
unsigned int U_data=500,I_data=300;//电流电压设定数据
unsigned int U_temp=0,I_temp=0;//电流电压显示数据
unsigned char Sys_sta;//系统状态
unsigned char keytemp;//键值
unsigned char U_Buf[4];

struct store{
				unsigned int U;
				unsigned int I;
			};
struct store user[7]={0};//0~~6 七组用户数据;7,8,9组作为系统预设数据

//标志位
unsigned char uset_bit=3;
unsigned char iset_bit=7;

unsigned int dis=0;
unsigned int disi=0;

unsigned long int flashbuf = 0;//显示刷新频率

unsigned char ubit=0;
unsigned char ibit=0;

unsigned char userbit=0;//用户已存储组数

//状态位
bit u_ds=0;
bit i_ds=0;
bit uset=0;
bit flash=0;

//函数初始化
void Init (void)
{
	AD_CLK = 0;
	AD_CS1 = 1;
	AD_CS2 = 1;

	Sys_sta=IDLE_STA;

	SEND_5615_U(U_data);
	Delay(50);
	SEND_5615_I(I_data);
	Delay(50);

	Disp_U_Real();
	Disp_I_Real();
	Delay(50);
	Sys_sta=IDLE_STA;
}

//显示设置电流电压
void Disp_U_set(unsigned int du)
{
	Disp_Buf[0]=du/1000;
	Disp_Buf[1]=du%1000/100;
	Disp_Buf[2]=du%100/10;
	Disp_Buf[3]=du%10;

	Disp();
}
void Disp_I_set(unsigned int di)
{
	Disp_Buf[4]=di/1000;
	Disp_Buf[5]=di%1000/100;
	Disp_Buf[6]=di%100/10;
	Disp_Buf[7]=di%10;

	Disp();
}
//显示实际电流电压值
void Disp_U_Real(void)
{
	dis=dis++;
	if(dis == 20)
	{
		dis = 0;
		AD_CLK = 0;
		AD_CS1 = 1;
		AD_CS2 = 1;
		U_temp = Read1549_U();
		Delay(30);

		if(U_temp == 0)
		{
			Delay(10);
			U_temp = Read1549_U();
		}

		Disp_Buf[0]=U_temp%10000/1000;
	    if(Disp_Buf[0]==0)
	    {
	        Disp_Buf[0]=18;
	    }
		Disp_Buf[1]=U_temp%1000/100;
		Disp_Buf[2]=U_temp%100/10;
		Disp_Buf[3]=U_temp%10;

	}
	Disp();
}

void Disp_I_Real(void)
{
	disi=disi++;
	if(disi == 20)
	{
		disi = 0;
		I_temp = Read1549_I();
		Delay(10);
		I_temp = Read1549_I();
	}

	Disp_Buf[4]=I_temp%10000/1000;
	Disp_Buf[5]=I_temp%1000/100;
	Disp_Buf[6]=I_temp%100/10;
	Disp_Buf[7]=I_temp%10;

	Disp();
}
//移位显示
void Disp_change(unsigned char dc)
{
	Disp_Buf[0]=Disp_Buf[1];
	Disp_Buf[1]=Disp_Buf[2];
	Disp_Buf[2]=Disp_Buf[3];
	Disp_Buf[3]=dc;

	Disp();
}

void Disp_changei(unsigned char di)
{
	Disp_Buf[4]=Disp_Buf[5];
	Disp_Buf[5]=Disp_Buf[6];
	Disp_Buf[6]=Disp_Buf[7];
	Disp_Buf[7]=di;

	Disp();
}
//IDLE状态下的服务程序
void IDLE_Mange(void)
{
	unsigned int temp;
	temp = U_data;
	keytemp = Key();

	Sys_sta=IDLE_STA;
	switch(keytemp)
	{
		//微调键
		case VADD:
		{
			if(U_data >= 0x03ff)
			{}
			else
			{
				U_data=U_data+1;
				SEND_5615_U(U_data);
				Delay(5);
			}
		}break;

		case VSUB:
		{
			if(U_data <= 5 || U_data >= 0x03ff)
			{}
			else
			{
				U_data=U_data-1;
				SEND_5615_U(U_data);
				Delay(5);
			}
		}break;

		case IADD:
		{
			if(I_data >= 0x03ff)
			{}
			else
			{
				I_data=I_data+1;
				SEND_5615_I(I_data);
				Delay(5);
			}
		}break;

		case ISUB:
		{
			if(I_data <= 5 || I_data >= 0x03ff)
			{
				SEND_5615_I(I_data);
				Delay(5);
			}
			else
			{
				I_data=I_data-1;
				SEND_5615_I(I_data);
				Delay(5);
			}
		}break;
		//功能键
		case USET://1*8
		{
			Sys_sta = U_SETu;
		}break;

		case SETu://4*4
		{
			Sys_sta = U_SET_STA;
		}break;

		case ISET://1*8
		{
			Sys_sta = I_SETi;
		}break;

		case SETi://4*4
		{
			Sys_sta = I_SET_STA;
		}break;

		case USER://4*4
		{
			Sys_sta = USER_SET_STA;
		}break;

		case CALL://4*4
		{
			Sys_sta = CALL_USER_STA;
		}break;

		default:break;
	}

	while(keytemp!=0xff)
	{
		keytemp = Key();
		Disp();
		Delay(5);
	}
	
	Disp_U_Real();
	Delay(20);
	Disp_I_Real();

}
//4mul4电压设定状态下的服务程序
void U_SET_Mange(void)
{
	unsigned int temp;
	temp = U_data;
	if(u_ds==0)
	{
		u_ds=1;
		Disp_Buf[0]=16;
		Disp_Buf[1]=18;
		Disp_Buf[2]=18;
		Disp_Buf[3]=18;
		Disp();
	}
	Disp_I_Real();

	keytemp = Key();
	switch(keytemp)
	{
		case 0:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=0;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 1:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=1;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 2:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=2;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 3:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=3;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 4:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=4;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 5:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=5;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 6:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=6;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 7:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=7;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 8:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=8;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 9:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=9;
				Disp_change(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case ESC:
		{
			U_data = temp;
			u_ds=0;
			ubit=0;
			Sys_sta = IDLE_STA;
		}break;

		case OK:
		case USET:
		{
			if (ubit == 4)
			{
				if((U_Buf[0]==1 && U_Buf[2]==2 && U_Buf[3]>=4) || U_Buf[0]>=2)
				{
					U_data = U_Buf[1]*100+U_Buf[2]*10+U_Buf[3];	
				}
				else
				{	
					U_data = U_Buf[0]*1000+U_Buf[1]*100+U_Buf[2]*10+U_Buf[3];
				}
			}
			else if(ubit == 3)
			{
				U_data = U_Buf[0]*100+U_Buf[1]*10+U_Buf[2];
			}
            else if(ubit == 2)
            {
				U_data = U_Buf[0]*10+U_Buf[1];
			}
            else if(ubit  == 1)
            {
				U_data = U_Buf[0];
			}
			SEND_5615_U(U_data);

			U_Buf[0]=0;
			U_Buf[1]=0;
			U_Buf[2]=0;
			U_Buf[3]=0;

			u_ds=0;
			ubit=0;
			Sys_sta = IDLE_STA;
		}break;
	}
	while(keytemp!=0xff)
	{
		keytemp = Key();
		Disp();
		Delay(10);
	}
}
//4mul4电流设定状态下的服务程序
void I_SET_Mange(void)
{
	unsigned int temp;
	temp = I_data;
	if(i_ds==0)
	{
		i_ds=1;
		Disp_Buf[4]=1;
		Disp_Buf[5]=18;
		Disp_Buf[6]=18;
		Disp_Buf[7]=18;
		Disp();
	}
	Disp_U_Real();
	keytemp = Key();

	switch(keytemp)
	{
		case 0:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=0;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 1:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=1;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 2:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=2;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 3:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=3;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 4:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=4;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 5:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=5;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 6:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=6;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 7:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=7;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 8:
		{
			if(ubit<=3)
			{
				U_Buf[ubit]=8;
				Disp_changei(U_Buf[ubit]);
				ubit=ubit+1;
			}
			else
			{
				ubit=0;
			}
		}break;

		case 9:

⌨️ 快捷键说明

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