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

📄 powercontrol.c

📁 基于C8051F020的稳压电源控制程序(2A
💻 C
字号:
/******************************************************************************************
**  文    件:  Power.C (包含文件为IAP.C)
**  功    能:  稳压电源控制程序
**  作    者:  
**  创建时间:  2006.3.23
**  修    改:  
**  修改时间:  2006.5.9  键盘+LCD功能实现,(仅串行口没调)
*******************************************************************************************/
#include "reg51.h"
#include "intrins.h"            //C51库函数
#include "iap.c"

#define  uint8   unsigned  char
#define  uint16  unsigned  int


sbit Lcd_RS = P1^2;    //开漏 LCD_RS
sbit Lcd_RW = P1^1;    //开漏 LCD_RW
sbit Lcd_E  = P1^0;    //开漏 LCD_E
          
uint8 code   Welcome[32]  ={" Welcome to YCIT  Version 1.0   "};//开始菜单
uint8 idata     disp[32]  ={" 00.00V  0.000A  00.00V  0.000A "};//显示缓存=在高端内存
uint8 code Power_Off[32]  ={" ALL OUTPUT OFF  YB3202  2006.5 "};//待机界面
uint8 code  disp_err[14]  ={"--Set  Error--"};                  //出错界面-(上一行)
uint8 code disp_save[16]  ={"-- Save... -- "};                  //出错界面-(上一行)
uint8 code restore_sys[32]={"    RESTORE        Num=1 (1-9)  "};//系统参数恢复界面
uint8 code   store_sys[32]={"     STORE         Num=1 (1-9)  "};//系统参数存贮界面

uint16 code EEprom=0x1f00;     //EEPROM 存贮首地址


uint8 code Cgram[32] ={                       //自定义字符
    0x00,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,  //上点
    0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0e,  //下点
    0x00,0x0e,0x0e,0x0e,0x00,0x0e,0x0e,0x0e,  //上下点
    } ;


uint8 code Key_Num[16] ={14,6,5,4,15,9,8,7,12,11,10,0,13, 3, 2, 1,} ;  // 键位表
                       // 0 1 2 3  4 5 6 7  8  9 10 11 12 13 14 15     // 键值

uint8 code set_disp[7]={"CH1-U ="};                                 //设定菜单

uint8 idata com,Run_Flag;         //当前运行参数


uint8 Lcd_add,Lcd_data,i,i1,i2,t,k1;         //Lcd地址,数据,全局变量

uint8   bdata Z_bit;                //全局可位寻址的变量

uint8   code *zhou_dptr;            //程序存贮器指针(000H-1fffH)

uint16  idata CH1_I,CH1_U,CH2_I,CH2_U;                  //参数-测量值
uint16  idata CH1I_set,CH1U_set,CH2I_set,CH2U_set;      //参数-设定值
uint16  idata CH1I_set1,CH1U_set1,CH2I_set1,CH2U_set1;  //参数-设定值
uint8   idata Buf_Rxd;

sfr     Lcd_port = 0x80;     //LCD端口==P0(0x80)
sbit    err      = Z_bit^0;  //
sbit    CH12_On  = Z_bit^1;  //主电源开关标志   0=CH1/2 OFF   1=CH1/2 ON
sbit    CH3_On   = Z_bit^2;  //辅助电源开关标志 0=3.3V  1=5V
sbit    U5_33    = Z_bit^3;  //0=CH3关闭
sbit    track    = Z_bit^4;  //1=跟踪   0=不跟踪
sbit    track_add= Z_bit^5;  //串/并输出标志 =0/1
sbit    EA_flag  = Z_bit^6;  //中断标志
sbit    Set_Flag = Z_bit^7;  //参数修改标志(如果为1则说明修改了参数要存贮)

uint8 zhou,set_set,system_set;


//******************************************************************************
//
//  延  时: Ys10ms(uint8 t)
//
//   2006.3.23
//
//******************************************************************************

void DelayNS(uint8 t)
{
       uint16   d1,d2;
       for(d2=0; d2<t; d2++)
          for (d1=0;d1<500;d1++);
}


/*
***********************************************************************************
** 函数名称:Wait5us()
** 函数功能:延时
** 入口参数:定时时间长度:8位
** 出口参数:无
**
** 修改时间: 2006.4.3   
**
**
*********************************************************************************************************
*/
void Wait5us(uint16 dly){for(;dly>0;dly--);}



/*=================================================================
** 函数名称:uint8 WaitForEnable( void )
** 函数功能:等LCD空闲
** 入口参数:NO
** 出口参数:NO
** 说明: 正常读写操作之前必须检测LCD控制器状态:	CS=1 RS=0 RW=1
**       DB7= 0  LCD控制器空闲; DB7= 1  LCD控制器忙
**	创建时间:2006.3.28   
**  修改时间:2006.4.29
==================================================================*/
uint8 Lcd_Busy( void )
 {
        uint8 Lcd1;
        
	Lcd_RS=0;  			//RS=0,RW=1
	Lcd_RW=1;
	Wait5us(5);
	Lcd_E=1;
	Wait5us(5);
	Lcd1=Lcd_port;           //从LCD读状态
	Lcd_E=0;	       //读数据,操作允许脉冲信号

	if(( Lcd1 & 0x80 )==0) return 0 ;   //LCD不忙,返回0
	return 1;					        //LCD忙,返回1
}


/*=======================================================
** 函数名称:void LcdWriteCommand( uint8 comm )
** 函数功能:写控制字符子程序: E=1 RS=0 RW=0
** 入口参数:NO
** 出口参数:NO

**	创建时间:2006.4.3

**  修改时间:2006.4.3    
=======================================================*/

void LcdWriteCommand( uint8 comm)
{
    while(Lcd_Busy()==1);       //等LCD空闲
	Lcd_RS=0; 					//Lcd_RS=0,Lcd_RW=0
	Lcd_RW=0;
	Wait5us(2);
	Lcd_E=1;
	Wait5us(5);
	Lcd_port=comm;   		    // 送控制字到LCD
	Wait5us(5);
	Lcd_E=0;	       	        // 下降沿打入数据,操作允许脉冲信号
	Wait5us(2);
}



/*
*********************************************************************************************************
** 函数名称:void  Lcd_Ram_Write(uint8 Lcd_data)
** 函数功能:送一个字节到LCD-RAM
** 入口参数:NO
** 出口参数:NO

**	创建时间:2006.4.3

**	修改时间:2006.4.25  
*********************************************************************************************************
*/

void Lcd_Ram_Write(uint8 Lcd_a,uint8 Lcd_d)
{

	if(Lcd_a > 0xf) Lcd_a=Lcd_a+0x30;
	if(Lcd_a!=0xf0)	LcdWriteCommand( 0x80+Lcd_a); 	//置AC
	while (Lcd_Busy()==1);			// 检测LCD忙信号,等LCD不忙
	Lcd_RS=1; 		//RS=1,RW=0  数据写入LCD
	Lcd_RW=0;
	Lcd_E=1;
	Wait5us(5);
	Lcd_port=Lcd_d;             //向LCD写数据
	Lcd_E=0;					// 下降沿打入数据
}

/*
**********************************************************************************
** 函数名称:void  Lcd_reset(void)
** 函数功能:初始化LCD,2*16(2行) 8位数据宽度
** 入口参数:NO
** 出口参数:NO

**	创建时间:2006.4.6

**	修改时间:2006.4.6   

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

void Lcd_reset()

{
	uint8 idata i,addr=0;
    LcdWriteCommand( 0x38);	//写命令字0x38,8位数据宽度,2行/16  5*8
    LcdWriteCommand( 0x01);	//写命令字0x01,清显示
    LcdWriteCommand( 0x06);	//输入方式设定  AC自动加1
    LcdWriteCommand( 0x0d);	//开显示,光标+闪动  D2,D1(0=无光标),D0(1=闪动)
    LcdWriteCommand( 0x80);	//送地址:00H  一行:(00-27H) 二行:(40-67H)
    for(i=0;i<16;i++) Lcd_Ram_Write(addr+i,0x20);	//消显示
 	LcdWriteCommand( 0x80); //置AC=0
}


/*
*********************************************************************************************************
** 函数名称:void disp_flash(uint8)
** 函数功能:LCD刷新
** 入口参数:显示内容 0=welcome;1=disp;2=err
** 出口参数:NO
**
** 创建时间: 2006.3.19
**
** 修改时间: 2006.4.5
**
*********************************************************************************************************
*/
void disp_flash(uint8 t)
{
		uint8 i;
		if(t==0)
		{
 		Lcd_add=0;
 		i=0;
		while(i<32)
			{
    		Lcd_Ram_Write(Lcd_add,Welcome[i]);	//写入 LCD_RAM
 			if(Lcd_add==0x0f) LcdWriteCommand( 0xc0); //置AC=0x40 (第二行首位)
 			if(Lcd_add==0x1f) LcdWriteCommand( 0x80); //置AC=0x00 (第一行首位)
   			Lcd_add++;i++;
   			}
		}
		else if(t==1)
		{
 		Lcd_add=0;
 		i=0;
		while(i<32)
			{
    		Lcd_Ram_Write(Lcd_add,disp[i]);	//写入 LCD_RAM
 			if(Lcd_add==0x0f) LcdWriteCommand( 0xc0); //置AC=0x40 (第二行首位)
 			if(Lcd_add==0x1f) LcdWriteCommand( 0x80); //置AC=0x00 (第一行首位)
   			Lcd_add++;i++;
   			}

        }
        else if(t==2)
		{
 		Lcd_add=0;
 		i=0;
		while(i<32)
			{
    		Lcd_Ram_Write(Lcd_add,Power_Off[i]);	//写入 LCD_RAM
 			if(Lcd_add==0x0f) LcdWriteCommand( 0xc0); //置AC=0x40 (第二行首位)
 			if(Lcd_add==0x1f) LcdWriteCommand( 0x80); //置AC=0x00 (第一行首位)
   			Lcd_add++;i++;
   			}
        }
}

/*
*********************************************************************************************************
** 函数名称:void  Lcd_Cg_Write(uint8 Lcd_a,uint8 Lcd_d)
** 函数功能:向CG RAM写一个行自定义字符字模
** 入口参数:CG_RAM地址,字模数据
** 出口参数:NO

**	创建时间:2006.4.3

**	修改时间:2007.7.19  

*********************************************************************************************************
*/
 void Lcd_Cg_Write(uint8 Lcd_a,uint8 Lcd_d)
{
    uint8 Lcd_z,z1;
    z1=1;
    while(z1==1)
      {
        LcdWriteCommand(0x40+Lcd_a); 	 //置 CG RAM 地址
        while (Lcd_Busy()==1);	         // 检测LCD忙信号,等LCD不忙
 	Wait5us(10);
	Lcd_RS=1; 		         //RS=1,RW=0  16个数据写入LCD 的CG_RAM
	Lcd_RW=0;
	Lcd_E=1;
	Lcd_port=Lcd_d;                   //向LCD写数据
	Wait5us(10);
        Lcd_E=0;       				// 下降沿打入数据
	while (Lcd_Busy()==1);			// 检测LCD忙信号,等LCD不忙
	Lcd_E=1;
	Lcd_RS=1; 		                //RS=1,RW=1  数据读到D0-D7
	Lcd_RW=1;
	Wait5us(10);
	Lcd_z=Lcd_port;
	if(Lcd_z!=Lcd_d) z1=1;
          else z1=0;  //退出
     }

}



/*
*********************************************************************************************************
** 函数名称:
** 函数功能:
** 入口参数:NO
** 出口参数:NO
**	创建时间:2006.4.3
**	修改时间:2006.4.25 
*********************************************************************************************************
*/
void Lcd_set_CG(void)
{
    for(i=0;i<24;i++)
    {
    Lcd_Cg_Write(i,Cgram[i]);    //向CG RAM 地址set_i中写入Cgram[set_i]
    }
}





/******************************************************
**
**               主程序开始
**
**                
**
**              2006年5月1日
**  修改:       2006.9.6   
**
******************************************************/

void main(void)
{

    while (Lcd_Busy()==1);	// 检测LCD忙信号,等LCD不忙
    Lcd_reset();
    LcdWriteCommand( 0x0c);     //消光标并不闪
    DelayNS(50);



    disp_flash(0);             /* 0=刷新WELCOME 1=刷新set  2=刷新 OFF   */


/*----------------------- 主程序循环体开始  ----------------------------------*/

 while(1)
 {
     DelayNS(5);              //延时---!!!!不能过长,否则会复位
 }    //主程序循环体结束
}       //主程序结束


⌨️ 快捷键说明

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