📄 main.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 + -