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

📄 dianzifuzai.txt

📁 电子负载程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
#include <iom64v.h>
#include <macros.h>
#include <slavr.h>

/*****常用符号定义 ******/ 
#define uchar unsigned char
#define uint unsigned int 

uchar jsq;                              //计数器,控制负载是否工作
uchar keys;                             //判断键盘输入位数
uchar s[4],sd;                          //键盘输入位数寄存器
uchar fxjd;                             //方向键数值输入位计数器
uchar sx1=0,sx2=0,sx3=0,sx4=18;         //方向键输入位数寄存器
uchar dian=0;                           //小数点输入判断,无法两次输入小数点 
uchar ling=0;                           //零输入判断,在小数点未按下时无法连续两次输入零
uint change=0;                          //电压检测切换标志位
uchar work=0;                           //控制负载是否工作
uchar work_fs;                          //工作方式寄存器
uchar sb[4];                            //设定值寄存器
uchar sj_dy[6];                         //实际电压寄存器
uchar sj_dl[6];                         //实际电流寄存器
uchar data_js;                          //单片机接受PC机发送数据寄存器
uchar data_js_bz;                       //单片机串口接收标志
uint sj_dyz,sj_dlz;                     //实际电压值、实际电流值 
uchar fs_dyz,fs_dlz,fs_dzz,fs_glz;
float sj_dzz,sj_glz;                    //实际采样电流、电压值后计算的电流值
uint sj_dzz_fs,sj_glz_fs;
uint enactment;                         //设定值
uchar fs_enactment;
uint chazhi; 
uint data_yzdl,data_sjdl;
uint data_yzdz,data_sjdz;
uint data_yzdy,data_sjdy;
uint data_yzgl,data_sjgl;

/*****定义MAX7219寄存器*******/
#define NO_OP 0x00                  // 定义空操作 register              控操作寄存器
//#define Digit0 0x01                 // 定义数码管1 register             数码管1寄存器
//#define Digit1 0x02                 // 定义数码管2 register             数码管2寄存器
//#define Digit2 0x03                 // 定义数码管3 register             数码管3寄存器
//#define Digit3 0x04                 // 定义数码管4 register             数码管4寄存器
//#define Digit4 0x05                 // 定义数码管5 register             数码管5寄存器
//#define Digit5 0x06                 // 定义数码管6 register             数码管6寄存器
//#define Digit6 0x07                 // 定义数码管7 register             数码管7寄存器
//#define Digit7 0x08                 // 定义数码管8 register             数码管8寄存器
#define DecodeMode 0x09             // 定义解码控制 register            译码模式寄存器
#define Intensity 0x0a              // 定义显示亮度 register            亮度寄存器
#define ScanLimit 0x0b              // 定义扫描限制 register            扫描位数寄存器 
#define ShutDown 0x0c               // 定义"shutdown"模式 register      低功耗模式寄存器
#define DisplayTest 0x0f            // 定义"display test"模式 register  显示测试寄存器

#define ShutdownMode 0x00      		// 低功耗方式
#define NormalOperation 0x01   		// 正常操作方式

#define ScanDigit 0x07         		// 扫描位数设置,显示8位数码管
#define DecodeDigit 0x00       		// 译码设置,8位均为BCD码
#define IntensityGrade 0x0a    		// 亮度级别设置

#define TestMode 0x01          		// 显示测试模式
#define TextEnd 0x00           		// 显示测试结束,恢复正常工作模式

uchar Digit[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};   //数码管1~8寄存器
/**显示缓存区(数码管显示源代码)**/
uchar DisBuffer[31]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xfe,0xb0,0xed,0xf9,0xb3,0xdb,0xdf,0xf0,0xff,0xfb,0x00,0x01,0x06};// 显示缓存区
                   //0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F    P    U    0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   清屏 -    I
				   //0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
/****** 定义硬件引脚连接******/ 
#define DIN 0;                      //定义PB0连接MAX7219 DIN引脚 
#define LOAD 1;                     //定义PB1连接MAX7219 LOAD引脚 
#define CLK 2;                      //定义PB2连接MAX7219 CLK引脚

#define DIN1 3;                     //定义PB3连接MAX7219 DIN引脚
#define LOAD1 4;                    //定义PB4连接MAX7219 LOAD引脚 
#define CLK1 5;                     //定义PB5连接MAX7219 CLK引脚

#define DIN2 6;                     //定义PB6连接MAX7219 DIN引脚
#define LOAD2 7;                    //定义PB7连接MAX7219 LOAD引脚 
#define CLK2 0;                  //定义PD0连接MAX7219 CLK引脚

void uart0_tx(uchar x);

/******单片机初始化**********/
void port_init(void)
{
 PORTA = 0xE9;
 DDRA  = 0xFF;
 PORTB = 0xFF;
 DDRB  = 0xFF;
 PORTC = 0xFF; //m103 output only
 DDRC  = 0x07;
 PORTD = 0x03;
 DDRD  = 0x03;
 PORTE = 0x00;
 DDRE  = 0x08;
 PORTF = 0x00;
 DDRF  = 0x00;
 PORTG = 0x1F;
 DDRG  = 0x1F;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSR0B = 0x98; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x2F; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x98;
}
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 XDIV  = 0x00; //xtal divider
 XMCRA = 0x00; //external memory
 port_init();
 uart0_init();

 MCUCR = 0x00;
 EICRA = 0x00; //extended ext ints
 EICRB = 0x00; //extended ext ints
 EIMSK = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 ETIMSK = 0x00; //extended timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

/* 延时t微秒 */
void delay_us(int t)
{
	do
	t--;
	while(t>1);	
}

/*延时t毫秒*/
void delay_ms(unsigned int t)
{
	while(t!=0)
	{
		delay_us(1000);
		t--;
	}
}


/* 向第一个MAX7219写入字节(8位)*/
void SendChar (uchar ch)
{
	uchar i,temp;
    NOP();
    for (i=0;i<8;i++)
    {
		temp=ch&0x80;
    	ch=ch<<1;
        if(temp)
        {
        	PORTB|=(1<<0);   //DIN=1
			PORTB&=~(1<<2);  //CLK=0
        	PORTB|=(1<<2);   //CLK=1
        }
        else
        {
        	PORTB&=~(1<<0);  //DIN=0
        	PORTB&=~(1<<2);  //CLK=0
        	PORTB|=(1<<2);   //CLK=1
        }
    }
}

/* 第一个向MAX7219写入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
    PORTB&=~(1<<1);    //LOAD=0
    NOP();
    SendChar(addr);
    NOP();
    SendChar(num);
    NOP();
    PORTB|=(1<<1);				// 锁存进相应寄存器
}

/*第一个MAX7219初始化 */
void InitDisplay (void)
{
    WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
    WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式
    WriteWord (Intensity,IntensityGrade);    // 设置亮度
    WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式
}

/* 向第二个MAX7219写入字节(8位)*/
void SendChar1 (uchar ch)
{
	uchar i,temp;
    NOP();
    for (i=0;i<8;i++)
    {
		temp=ch&0x80;
    	ch=ch<<1;
        if(temp)
        {
        	PORTB|=(1<<3);   //DIN1=1
			PORTB&=~(1<<5);  //CLK1=0
        	PORTB|=(1<<5);   //CLK1=1
        }
        else
        {
        	PORTB&=~(1<<3);  //DIN1=0
        	PORTB&=~(1<<5);  //CLK1=0
        	PORTB|=(1<<5);   //CLK1=1
        }
    }
}

/* 向第二个MAX7219写入字(16位)*/
void WriteWord1 (uchar addr,uchar num)
{
    PORTB&=~(1<<4);    //LOAD=0
    NOP();
    SendChar1(addr);
    NOP();
    SendChar1(num);
    NOP();
    PORTB|=(1<<4);				// 锁存进相应寄存器
}

/* 第二个MAX7219初始化 */
void InitDisplay1 (void)
{
    WriteWord1 (ScanLimit,ScanDigit);         // 设置扫描界限
    WriteWord1 (DecodeMode,DecodeDigit);      // 设置译码模式
    WriteWord1 (Intensity,IntensityGrade);    // 设置亮度
    WriteWord1 (ShutDown,NormalOperation);    // 设置为正常工作模式
}

/* 向第二个MAX7219写入字节(8位)*/
void SendChar2 (uchar ch)
{
	uchar i,temp;
    NOP();
    for (i=0;i<8;i++)
    {
		temp=ch&0x80;
    	ch=ch<<1;
        if(temp)
        {
        	PORTB|=(1<<6);   //DIN1=1
			PORTD&=~(1<<0);  //CLK1=0
        	PORTD|=(1<<0);   //CLK1=1
        }
        else
        {
        	PORTB&=~(1<<6);  //DIN1=0
        	PORTD&=~(1<<0);  //CLK1=0
        	PORTD|=(1<<0);   //CLK1=1
        }
    }
}

/* 向第三个MAX7219写入字(16位)*/
void WriteWord2 (uchar addr,uchar num)
{
    PORTB&=~(1<<7);    //LOAD=0
    NOP();
    SendChar2(addr);
    NOP();
    SendChar2(num);
    NOP();
    PORTB|=(1<<7);				// 锁存进相应寄存器
}

/* 第三个MAX7219初始化 */
void InitDisplay2 (void)
{
    WriteWord2 (ScanLimit,ScanDigit);         // 设置扫描界限
    WriteWord2 (DecodeMode,DecodeDigit);      // 设置译码模式
    WriteWord2 (Intensity,IntensityGrade);    // 设置亮度
    WriteWord2 (ShutDown,NormalOperation);    // 设置为正常工作模式
}

/**测试状态指示灯及蜂鸣器子程序**/
void dkcs(void)
{
	uchar i;
	PORTD&=~(1<<1);
    for(i=0;i<=4;i++)
	{
		PORTG&=~(1<<i);
	}
}

/**关闭测试状态指示灯及蜂鸣器子程序**/
void gbcs(void)
{
	uchar i;
	PORTD|=(1<<1);
    for(i=0;i<=4;i++)
	{
		PORTG|=(1<<i);
	}
}

/**数码管初始化显示子程序**/
void csh(void)
{
	uchar i,j;
	i=28;
	PORTG&=~(1<<0);                           //默认为横流模式 横流模式指示灯点亮
	/**将三个数码管全部关闭**/
	for (j=0;j<=7;j++)
		{
        WriteWord (Digit[j],DisBuffer[i]);
		WriteWord1 (Digit[j],DisBuffer[i]);
		WriteWord2 (Digit[j],DisBuffer[i]);
		}			
		//第一个数码管初始化   显示“-U- 0.000”
		WriteWord (Digit[0],DisBuffer[29]);
        WriteWord (Digit[1],DisBuffer[17]);
		WriteWord (Digit[2],DisBuffer[29]);
		WriteWord (Digit[4],DisBuffer[18]);
		WriteWord (Digit[5],DisBuffer[0]);
		WriteWord (Digit[6],DisBuffer[0]);
		WriteWord (Digit[7],DisBuffer[0]);
        //第二个数码管初始化   显示“-I- 0.000”
		WriteWord1 (Digit[0],DisBuffer[29]);
        WriteWord1 (Digit[1],DisBuffer[30]);
		WriteWord1 (Digit[2],DisBuffer[29]);
		WriteWord1 (Digit[4],DisBuffer[18]);
		WriteWord1 (Digit[5],DisBuffer[0]);
		WriteWord1 (Digit[6],DisBuffer[0]);
		WriteWord1 (Digit[7],DisBuffer[0]);
		//第三个数码管初始化   显示“-CC-0.000”
		WriteWord2 (Digit[0],DisBuffer[29]);
        WriteWord2 (Digit[1],DisBuffer[12]);
		WriteWord2 (Digit[2],DisBuffer[12]);
		WriteWord2 (Digit[3],DisBuffer[29]);
		WriteWord2 (Digit[4],DisBuffer[18]);
		WriteWord2 (Digit[5],DisBuffer[0]);
		WriteWord2 (Digit[6],DisBuffer[0]);
		WriteWord2 (Digit[7],DisBuffer[0]);
}

/****键盘扫描函数****/
uchar keyscan(void)
{
	uchar scancode,tmpcode,PC;
	uchar i;
	tmpcode=0;
    //PORTA = 0xED;
    //DDRA  = 0xFF;
	PORTA|=(1<<6);
	PORTA|=(1<<7);
    PORTC = 0xFF; //m103 output only
    DDRC  = 0x07;
	for(i=0;i<3;i++)                         //扫描前三个口 
	{
		PORTC&=~(1<<i);                      //键盘线扫描
		scancode=PORTC&0x07;                 //屏蔽高五位
		delay_ms(40);                        //延时去抖
		PC=PINC&0xf8;                        //判断是否有按键按下 
		if(PC!=0xf8)                         //该行有按键按下
		{
			tmpcode=PC&0xf8;
			tmpcode=~tmpcode&~scancode;
		}
		PORTC = 0xFF; //m103 output only
		DDRC  = 0x07;
	} 
	for(i=6;i<=7;i++)                        //扫描后两个口 
	{
		PORTA&=~(1<<i);                      //键盘线扫描
        scancode=PORTA&0xc0;                 //屏蔽第六位 
		scancode=scancode>>6;
		scancode=scancode&0x03;
		delay_ms(40);                        //延时去抖
		PC=PINC&0xf8;                        //判断是否有按键按下 
		if(PC!=0xf8)                         //该行有按键按下
		{
			tmpcode=PC&0xf8;
			tmpcode=tmpcode|scancode;
		}
		PORTA|=(1<<6);
	    PORTA|=(1<<7);
		//PORTA = 0xED;
        //DDRA  = 0xFF;
	}
	return(tmpcode);                         //返回键值
}

/**按键CC子函数**/
/*******调用该函数后状态切换到横流模式********/
void ajcc(void)
{
	work_fs=11;
	keys=7;
	sx1=0,sx2=0,sx3=0,sx4=18;
	s[0]=0,s[1]=0,s[2]=0,s[3]=0;
	dian=0,ling=0;
	PORTD&=~(1<<1);
	PORTG&=~(1<<0);
	PORTG|=(1<<1);
	PORTG|=(1<<2);
	PORTG|=(1<<3);
	PORTG|=(1<<4);
	WriteWord2 (Digit[1],DisBuffer[12]);
	WriteWord2 (Digit[2],DisBuffer[12]);
	WriteWord2 (Digit[4],DisBuffer[18]);
	WriteWord2 (Digit[5],DisBuffer[0]);
	WriteWord2 (Digit[6],DisBuffer[0]);
	WriteWord2 (Digit[7],DisBuffer[0]);
	delay_ms(200);
	PORTD|=(1<<1);
}

/**按键CU子函数**/
/*******调用该函数后状态切换到横压模式********/
void ajcu(void)
{
	work_fs=12;
	keys=7;
	sx1=0,sx2=0,sx3=0,sx4=18;
	s[0]=0,s[1]=0,s[2]=0,s[3]=0;
	dian=0,ling=0;
	PORTD&=~(1<<1);
	PORTG&=~(1<<1);
	PORTG|=(1<<0);
	PORTG|=(1<<2);
	PORTG|=(1<<3);
	PORTG|=(1<<4);
	WriteWord2 (Digit[1],DisBuffer[12]);
	WriteWord2 (Digit[2],DisBuffer[17]);
	WriteWord2 (Digit[4],DisBuffer[18]);
	WriteWord2 (Digit[5],DisBuffer[0]);
	WriteWord2 (Digit[6],DisBuffer[0]);
	WriteWord2 (Digit[7],DisBuffer[0]);
	delay_ms(200);
	PORTD|=(1<<1);
}

/**按键CP子函数**/
/*******调用该函数后状态切换到横功率模式********/
void ajcp(void)
{
	work_fs=13;
	keys=7;
	sx1=0,sx2=0,sx3=0,sx4=18;
	s[0]=0,s[1]=0,s[2]=0,s[3]=0;
	dian=0,ling=0;
	PORTD&=~(1<<1);
	PORTG&=~(1<<4);
	PORTG|=(1<<0);
	PORTG|=(1<<1);
	PORTG|=(1<<2);
	PORTG|=(1<<3);
	WriteWord2 (Digit[1],DisBuffer[12]);
	WriteWord2 (Digit[2],DisBuffer[16]);
	WriteWord2 (Digit[4],DisBuffer[18]);
	WriteWord2 (Digit[5],DisBuffer[0]);
	WriteWord2 (Digit[6],DisBuffer[0]);
	WriteWord2 (Digit[7],DisBuffer[0]);
	delay_ms(200);
	PORTD|=(1<<1);
}

/**按键CR子函数**/
/*******调用该函数后状态切换到横阻模式********/
void ajcr(void)
{
	work_fs=14;
	keys=7;
	sx1=0,sx2=0,sx3=0,sx4=18;
	s[0]=0,s[1]=0,s[2]=0,s[3]=0;
	dian=0,ling=0;
	PORTD&=~(1<<1);
	PORTG&=~(1<<3);
	PORTG|=(1<<0);
	PORTG|=(1<<1);
	PORTG|=(1<<2);
	PORTG|=(1<<4);
	WriteWord2 (Digit[1],DisBuffer[12]);
	WriteWord2 (Digit[2],DisBuffer[10]);
	WriteWord2 (Digit[4],DisBuffer[18]);
	WriteWord2 (Digit[5],DisBuffer[0]);
	WriteWord2 (Digit[6],DisBuffer[0]);
	WriteWord2 (Digit[7],DisBuffer[0]);
	delay_ms(200);

⌨️ 快捷键说明

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