📄 phase.c
字号:
/**************** ********************/
/****************TLC5510测量相位 ********************/
/****************作者:张春龙 ********************/
/**************************************************************************/
#include <reg52.h>
#include <math.h>
#include <stdio.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
/**************系统模块地址****************/
#define KEY XBYTE[0x8000] //只能读
#define DATAPORT XBYTE[0x9800] //点阵数据口地址,双向读写
#define COMPORT XBYTE[0x9a00] //点阵命令口地址,双向读写
uchar xdata *Addr;
uchar xdata *Addr2;
/****************系统模块地址****************/
sbit change=P1^3;
sbit P16=P1^6;
sbit game=P1^1;
sbit CE=P1^0;
sbit P15=P1^5;
sbit clear=P1^4;
sbit clr=P1^2;
/*程序可改处*/
/****************功能函数存放处*****************************/
/******DDS直接数字频率合成***********/
#define send_fre XBYTE[0xa000] //送DDS的控制字
//#define fx_l XBYTE[0xa800]
//#define fx_m XBYTE[0xa900]
//#define fx_h XBYTE[0xaa00]
#define fo_l XBYTE[0xc000]
#define fo_m XBYTE[0xc100]
#define fo_h XBYTE[0xc200] //频率地址
#define storge 1020 //定义1K的内存
uchar f[16]={" 1.000K +00.0du "};
bit shang1=0;
bit xia1=0; //定义上升和下降标志
bit shang2=0;
bit xia2=0;
bit state=0; //电压1,频率0状态标志
bit fine=0; //定义完成标志
bit qianhou=0; //0超前 1滞后
bit feng1=0;
bit gu1=0;
bit feng2=0;
bit gu2=0;
bit bzhi=0;
bit change2=0;
uint gao1,di1,gao2,di2;
uchar Cursor=0; //位数标志
uchar leijia=20; //存储频率数据 720KHz
float outfre;
float realfre;
float xiang;
//uchar change=0; //波形转换
bit hk=0; //KHz和 Hz的标志
bit anjian=0; //有按键标志
/************扫频地址和变量************/
/********全局变量**************/
/****************功能函数存放处结尾*****************************/
/**********************************************************************/
/***************汉 字 字 型 码 数 组*****************/
/*****************汉 字 编 码*************/
/* 点阵:16x16
提取点阵方向:横向(先上->下, 再左->右)
字节掉转:否
字节方式:C语言 */
#define NUM 12
uchar code chn[NUM*32]={
0x02,0x02,0x02,0x7F,0x42,0x42,0x7F,0x42, // 电
0x42,0x7F,0x42,0x02,0x02,0x02,0x01,0x00,
0x00,0x00,0x10,0xF8,0x10,0x10,0xF0,0x10,
0x10,0xF0,0x10,0x00,0x04,0x04,0xFC,0x00,
0x00,0x3F,0x00,0x00,0x00,0x01,0x01,0xFF, // 子
0x01,0x01,0x01,0x01,0x01,0x01,0x05,0x02,
0x00,0xF0,0x10,0x20,0x40,0x80,0x04,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x21,0x11,0x11,0x01,0x02,0xF4,0x13, // 设
0x11,0x11,0x10,0x10,0x14,0x18,0x13,0x0C,
0xF0,0x10,0x10,0x10,0x10,0x0E,0x00,0xF8,
0x08,0x10,0x90,0xA0,0x40,0xB0,0x0E,0x04,
0x00,0x20,0x10,0x10,0x00,0x00,0xF7,0x10, // 计
0x10,0x10,0x10,0x12,0x14,0x18,0x10,0x00,
0x40,0x40,0x40,0x40,0x40,0x44,0xFE,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x00,0x02,0x3F,0x00,0x00,0xFF,0x04,0x04, // 武
0x27,0x24,0x24,0x24,0x27,0xF8,0x40,0x00,
0x40,0x50,0x48,0x48,0x40,0xFE,0x40,0x40,
0x40,0x40,0x20,0x20,0xA0,0x12,0x0A,0x06,
0x00,0x40,0x37,0x10,0x82,0x62,0x22,0x09, // 汉
0x11,0x20,0xE0,0x20,0x21,0x22,0x24,0x08,
0x00,0x08,0xFC,0x08,0x08,0x08,0x10,0x10,
0x20,0xA0,0x40,0xA0,0x10,0x08,0x0E,0x04,
0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x02, // 大
0x02,0x02,0x04,0x04,0x08,0x10,0x60,0x00,
0x00,0x00,0x00,0x00,0x04,0xFE,0x00,0x80,
0x80,0x40,0x40,0x20,0x10,0x0E,0x04,0x00,
0x22,0x11,0x11,0x00,0x7F,0x40,0x80,0x1F, // 学
0x00,0x01,0xFF,0x01,0x01,0x01,0x05,0x02,
0x08,0x08,0x10,0x20,0xFE,0x02,0x04,0xE0,
0x40,0x84,0xFE,0x00,0x00,0x00,0x00,0x00,
0x02,0x01,0xFF,0x00,0x1F,0x10,0x10,0x1F, // 高
0x00,0x7F,0x40,0x4F,0x48,0x48,0x4F,0x40,
0x00,0x04,0xFE,0x00,0xF0,0x10,0x10,0xF0,
0x00,0xFC,0x04,0xE4,0x24,0x24,0xE4,0x0C,
0x00,0x40,0x37,0x10,0x07,0x04,0xF4,0x17, // 速
0x14,0x10,0x11,0x12,0x14,0x28,0x47,0x00,
0x40,0x44,0xFE,0x40,0xFC,0x44,0x44,0xFC,
0x44,0xE0,0x58,0x48,0x40,0x46,0xFC,0x00,
0x00,0x40,0x37,0x14,0x84,0x67,0x24,0x0C, // 测
0x17,0x14,0x64,0x27,0x22,0x24,0x28,0x20,
0x04,0x04,0xC4,0x54,0x54,0xD4,0x54,0x54,
0xD4,0x54,0x54,0xC4,0x84,0x44,0x14,0x08,
0x10,0x11,0x11,0x11,0xFD,0x11,0x31,0x39, // 相
0x55,0x51,0x91,0x11,0x11,0x11,0x11,0x11,
0x04,0xFE,0x04,0x04,0x04,0xFC,0x04,0x04,
0x04,0xFC,0x04,0x04,0x04,0x04,0xFC,0x04,
};
/*********************系统的程序/LCD有关*****************/
void Init_Int(void); //中断初始化
void Init_time(void); //定时器初始化
void Display(uchar *Tab); //显示子程序最底层
void Delay(uint Time); //延时子程序
void L_delay(uchar T); //长时间延时程序
void Chars_dis(uchar *s); //英文字符显示送显程序
void Out_data(uchar dat); //向点阵数据口发数据
void Check(void); //检查点阵读写状态
void Out_com(uchar com); //写一个命令
void Out_data_com(uchar dat1,uchar com1);//写一个数据和一个命令
void Out_data2_com(uchar dat1,uchar dat2,uchar com1);//写两个数据和一个命令
void Dis_point_2(uchar x,uchar y,uchar mode); //指定位置描点程序
void Pic_out(void); //图形输出程序
void Init_Dian(void); //点阵初始化
void Clear_Dian(uchar a); //字符显示清屏
void Dis_line(uchar Line_num); //点阵显示一行字符
uchar Disp_Buff[16]; //显示缓冲区
/*********************系统的程序/串口*****************************/
//void Init_Serial_Interrupt(void);
//void Init_Serial_Timer1(void);
//void Init_Serial(void); //初始化串口通讯
//void Outport(uchar i); //发送8位数据
//void Send_Byte(uchar datas); //完整的单字节数据串行发送子程序包括初始化
//void Send_Word(uint datas); //完整的双字节数据串行发送子程序包括初始化
/**********************************************************************/
/**********中 断 设 定***********************/
/*******外部中断***********/
void Init_Int(void)
{
EX0=0; //开外部中断0
IT0=1; //边沿触发
EX1=1; //开外部中断1
IT1=1; //边沿触发
EA=1; //开全局中断
}
/********定时中断********/
void Init_time(void)
{ TMOD=0x31; //00110001设定时器0和计数器1,都为模式1
TR0=0;
TR1=0; //不启动
ET0=1; //允许中断
ET1=1;
TL0=0x30;
TH0=0xf8; //定时初值,时间t=(2^16-T0初值)*振荡周期*12 求T0=63536,t=2ms
TL1=0; //扫描频率
TH1=0;
EA=1; //开中断
}
/***********中断结束************/
/****** 以下为液晶函数**********/
/***************字符显示程序*******************/
/*整体刷以便显示缓冲区,将要显示数字的位用空格填充,
用其他符号填充也可。
入口为字符串首地址 */
void Chars_dis(uchar *s)
{
uchar w;
for(w=0;w<16;w++)
Disp_Buff[w]=s[w];
}
//软件短时间延迟
void Delay(uint Time)
{
while(Time--);
}
//软件长时间延时
void L_delay(uchar T)
{
uchar o;
for(o=0;o<T;o++)
Delay(40000);
}
/*****************************************/
/* 点 阵 相 关 程 序 */
/*****************************************/
/************检查读写状态*******************/
void Check(void)
{uchar sta_1;
do
{
sta_1=COMPORT;
sta_1=sta_1&0x03;
}
while(sta_1!=0x03);
}
/************向数据口发数据*****************/
void Out_data(uchar dat)
{
Check();
DATAPORT=dat;
}
/***********写一个命令**********************/
void Out_com(uchar com)
{
Check();
COMPORT=com;
}
/*************写一个参数及命令**************/
void Out_data_com(uchar dat1,uchar com1)
{
Out_data(dat1);
Out_com(com1);
}
/************写两个参数及命令***************/
void Out_data2_com(uchar dat1,uchar dat2,uchar com1)
{
Out_data(dat1);
Out_data(dat2);
Out_com(com1);
}
/**************点阵初始化程序*******************/
void Init_Dian(void)
{
Out_data2_com(0x00,0x00,0x40);
Out_data2_com(0x10,0x00,0x41);
Out_data2_com(0x00,0x04,0x42);
Out_data2_com(0x10,0x00,0x43);
Out_com(0xa7);
Out_com(0x80);
Out_com(0x9c);
}
/*************清RAM区*********************/
void Clear_Dian(uchar a) //0:清除文本区;1:清除图形区
{
uint l,i;
if(a==0)
{
Out_data2_com(0x00,0x00,0x24);
i=129;
}
if(a==1)
{
Out_data2_com(0x00,0x04,0x24);
i=1025;
}
Out_com(0xb0);
for(l=i;l>0;l--)
{
Out_data(0x00);
}
Out_com(0xb2);
}
/******************************************************/
/**************** 显示一行英文字符*******************/
void Dis_line(uchar Line_num) //显示内容为Disp_Buff内所存内容
{
uchar l;
Out_data2_com(Line_num*16,0x00,0x24);
Out_com(0xb0);
for(l=0;l<16;l++)
{
Out_data(Disp_Buff[l]-0x20);
}
Out_com(0xb2);
}
/**************指定位置描点程序*****************/
void Dis_point_2(uchar x,uchar y,uchar mode)
{
uint StartAddr=0;
uchar dat;
StartAddr=x*16+y/8;
dat=0xf0+7-y%8;
if(mode==1)
dat=dat|0x08;
Out_data2_com((uchar)(StartAddr),(uchar)(StartAddr>>8),0x24);
Out_com(dat);
}
/****************************************************************************/
/*************************汉字字型生成********************/
void Chn_create(void)
{
uint u;
Out_data2_com(0x03,0x00,0x22);
Out_data2_com(0x00,0x1c,0x24);
Out_com(0xb0);
for(u=0;u<NUM*32;u++)
{
Out_data(chn[u]);
}
Out_com(0xb2);
}
/*****************************************************************************/
/*************在指定位置写指定汉字**************/
void Chn_dis(uchar X_chn,uchar Y_chn,uchar Num_chn)
{
uchar Add;
Add=16*Y_chn+X_chn;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -