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

📄 main.c

📁 基于AT89C51的三相方波
💻 C
字号:
/****************************************************************************************************
* 文件名:	main.c																					*
* Copyright (c) 2008 *********武汉理工大学信息工程学院电信系										*
* 创建人:	王康																					*
* 日 期:	2008.8.8																				*
* 修改人:	王康																					*
* 日 期:	 																						*
* 描 述:	本工程完成了相位发生器的作用,能产生频率和相位均步进可调的两相方波信号,并对频率和相位进  *
*			行数码管显示.用定时计数器0来产生方波的频率值,用定时计数器1来产生相位值,4个按键用来调	*
*			频率和相位,频率步进1Hz,相位步进1度														*	
* 接口定义:	P1.0---frequency up																		*
*			P1.1---frequency down																	*
*			P1.2---phase up																			*
*			P1.3---phase down																		*
*			P0---Data Bus																			*
*			P2---Bit choose																			*
* 版 本:	KEIL uV2																				*
****************************************************************************************************/


//头文件
#include "reg52.h"


//宏定义
#define	uchar	unsigned	char
#define	uint	unsigned	int
#define	ulong	unsigned	long


//接口定义
sbit	freq_up		= 	P1^0;								//频率增加	
sbit	freq_down	=	P1^1;								//频率减少
sbit	phase_up	=	P1^2;								//相位增加
sbit	phase_down	=	P1^3;								//相位减少
sbit	OUT0		=	P3^0;								//波形输出1
sbit	OUT1		=	P3^1;								//波形输出2


//变量声明
bit		g_KeyFlg;											//有键按下标志位

uchar	g_KeyVal;											//键值
uint	g_FreqVal;											//方波的频率值
uint	g_PhsVal;											//相位值
uchar	g_TH0;												//频率值缓存
uchar	g_TL0;
uchar	g_TH1;												//相位值缓存
uchar	g_TL1;
uchar	g_cor;												//计数器校正值
uchar	dis_buf[8];											//显示缓冲

uchar	code	num[]	=									//数码管数据定义
{0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0x30,0x25,0xA7,0x26,0xA1,0xB1,0xFF};
// 0    1	 2	  3	   4	5    6    7	   8	9    a	  b	   c	d	 e	  f   空显


//延时子函数,1ms
void Delay(uchar z)
{
	uchar	x;
	uchar	y;
	for(x = z; x > 0; x--)
		for(y = 72; y > 0 ; y--);	
}


//初始化子函数
void Initiate(void)
{
	g_KeyFlg = 1;											//有键按下标志位
	g_KeyVal = 0;											//键值
	g_FreqVal = 100;										//方波的初始频率值
	g_PhsVal = 45;											//初始相位值
	OUT0 = 0;
	OUT1 = 0;
	TMOD = 0x11;											//T0,T1均工作在定时方式1
	IE = 0x8a;												//开T0,T1和总中断
	TR0 = 1;												//打开T0定时
}


//显示子函数
void Display(void)
{
	uchar 	i;
	for(i = 0; i < 8; i++)
	{
		P2 = 0xff;
		P2 = ~(0x01 << i);
		P0 = num[dis_buf[i]];
		Delay(5);
		P2 = 0xff;
	}
}


//键盘扫描子函数
void ScanKey()
{
	uchar	key;
	P1 = 0xff;
	key = P1;
	if((P1 & 0x0f) < 0x0f)
	{
		Delay(5);
		if((P1 & 0x0f) < 0x0f)
		{
			g_KeyFlg = 1;
			while(P1 != 0xff)
			{
				Display();	
			}
			switch(key & 0x0f)
			{
				case 0x0e:	g_KeyVal = 1;
							break;
				case 0x0d:	g_KeyVal = 2;
							break;
				case 0x0b:	g_KeyVal = 3;
							break;
				case 0x07:	g_KeyVal = 4;
							break;
				default:	break;							
			}		
		}
	}
	else
	{
		g_KeyFlg = 0;	
	}
}


//按键处理子函数
void Process(void)
{
	switch(g_KeyVal)
	{
		case 1:		g_FreqVal++;							//频率加
					if(g_FreqVal == 0xffff)
					{
						g_FreqVal = 0;
					}
					break;
		case 2:		g_FreqVal--;							//频率减
					if(g_FreqVal == 0xffff)
					{
						g_FreqVal = 1000;
					}
					break;
		case 3:		g_PhsVal++;								//相位加
					if(g_PhsVal == 360)
					{
						g_PhsVal = 0;
					}
					break;
		case 4:		g_PhsVal--;								//相位减
					if(g_PhsVal == 0xffff)					//减到0后,继续减
					{
						g_PhsVal = 359;	
					}
					break;
		default:	break;
	}
	
	//以下是向定时计数器T0,T1计数缓存中存数
	g_TH0 = (uint)(65536 - 500000 / g_FreqVal + g_cor) / 256;
	g_TL0 = (uint)(65536 - 500000 / g_FreqVal + g_cor) % 256;

	g_TH1 = (uint)(65536 - g_PhsVal % 180 * 2777.778 / g_FreqVal) / 256;
	g_TL1 = (uint)(65536 - g_PhsVal % 180 * 2777.778 / g_FreqVal) % 256;

	//8为数码管高四位显示当前方波的频率值,低三位显示当前波形的相位值
	dis_buf[0] = g_FreqVal / 1000;
	dis_buf[1] = g_FreqVal / 100 % 10;
	dis_buf[2] = g_FreqVal / 10 % 10; 
	dis_buf[3] = g_FreqVal % 10;
	dis_buf[4] = 0x10;										//空显,分隔符
	dis_buf[5] = g_PhsVal / 100;
	dis_buf[6] = g_PhsVal % 100 /10;
	dis_buf[7] = g_PhsVal % 10;
}


//主函数
void main(void)
{
	Initiate();
	while(1)
	{
		if(g_KeyFlg == 1)
		{
			Process();
		}
		ScanKey();
		Display();
	}
}


//定时计数器0中断函数
void Timer0_int() interrupt 1
{
	TH0 = g_TH0;
	TL0 = g_TL0;
	if(OUT0 == 1 )
	{
		TH1 = g_TH1;
		TL1 = g_TL1;
		OUT1 = 1;
		TR1 = 1;
	}
	else
	{
		TH1 = g_TH1;
		TL1 = g_TL1;
		TR1 = 1;
	}

	OUT0 = !OUT0;
}


//定时计数器1中断函数
void Timer1_int() interrupt 3
{
	if(OUT1 == 1)
	{
		OUT1 = 0;
		TR1 = 0;
	}
	else
	{
		OUT1 = 1;
 	    TR1 = 0;
	}
}





⌨️ 快捷键说明

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