📄 mc145170.c
字号:
/**************************************
MC145170D的驱动程序
*************************************/
#include <regx52.h>
#include <intrins.h>
#include<absacc.h>
//#include "lcd1602.H"
/**************************************
MC145170D控制引脚宏定义
*************************************/
sbit CLK = P0^0; /*MC145170时钟*/
sbit DIN = P0^2; /*MC145170输入*/
sbit _ENB = P0^1 ;/*MC145170片选*/
//sbit _ENB = P1^1 ;
#define Uchar unsigned char
#define Uint unsigned int
#define Ulong unsigned long
Uint Frequence=5500;
#define BaseFre 400
#define uint unsigned int
#define uchar unsigned char
uchar code DisplayBuffer[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0xFF}; //显示0到9和不显示和显示“-”负号,和显示乱码
uchar data c[8]={0,10,10,10,10,10,10,10}; //初始值为10是为了让数码管不显示任何数字;c[5],c[4],c[3],c[2],c[1]分别显示的万位,千位,百位,十位,个位
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
while(j--);
};
}
// 短延时
void Delay5Ms(void)
{
Uint i = 552;
while(i--);
}
void delay_1ms() //延时?汇编是1ms
{ int q;
for(q=300;q>0;q--);
}
/**************************************
名称:delay vf
功能:延时模块
输入参数:n要延时的周期数
输出参数:无
*************************************/
/*void delay(uint n)
{
uchar i;
i=n;
while(i--);
}*/
/**************************************
名称:write_MC145170D
功能:MC145170D驱动模块
输出参数:CLK_mode所用时钟数,value为向Register所送数据值
说明:mode=C表示要向C Register送数据,CLK=8;
mode=N表示要向N Register送数据,CLK=16;
mode=R1或R2表示要向R Register送数据,CLK=15或24;
C Register每位定义说明
C7 C7=HIGH时,PDout输出正脉冲,PDout=PHR;C7=LOW时,PDout输出负脉冲,PDout=PHV;PHR,PHV的输出选择,
C7=HIGH时PDout=PHR-PHV,C7=LOW时PDout=PHV-PHR;
C6 鉴相器输出选择 C6=HIGH时,从PDout输出,否则从PHR,PHV输出。
C5 =1时 锁定输出端 LD 有效
C4 C3 C2 REFout Frequency
0 0 0 dc (Static Low)
0 0 1 OSCin
0 1 0 OSCin /2
0 1 1 OSCin /4
1 0 0 OSCin /8 (POR Default)
1 0 1 OSCin /16
1 1 0 OSCin /8
1 1 1 OSCin /16
C1=1时 FVE启动频率输出
C0=1时 fRE启动频率输出
N Register取值范围40 to 65535
R Register取值范围5 to 32767
*************************************/
void writec(unsigned char d)
{
uchar i;
_ENB=1;
_nop_();
_ENB=0;//开始下降沿
_nop_();
for(i=0;i<8;i++)
{ CLK=0;
d=d<<1;
DIN=CY;//将数据放好等待读入
_nop_();
CLK=1;//将数据读入
_nop_();
}
_ENB=1;
}
void write_R15(Uint r15)
{
uchar i,dh,dl;
dh=r15/256;
dl=r15%256;
dh=dh<<1;
_ENB=1;
_nop_();
_ENB=0;//开始下降沿
_nop_();
for(i=0;i<7;i++)
{ CLK=0;
dh=dh<<1;
DIN=CY;//将数据放好等待读入
_nop_();
CLK=1;//将数据读入
_nop_();
}
for(i=0;i<8;i++)
{ CLK=0;
dl=dl<<1;
DIN=CY;//将数据放好等待读入
_nop_();
CLK=1;//将数据读入
_nop_();
}
_ENB=1;
}
void write_N(Uint n)
{
uchar i,dh,dl;
dh=n/256;
dl=n%256;
_ENB=1;
_nop_();
_ENB=0;//开始下降沿
_nop_();
for(i=0;i<8;i++)
{ CLK=0;
dh=dh<<1;
DIN=CY;//将数据放好等待读入
_nop_();
CLK=1;//将数据读入
_nop_();
}
for(i=0;i<8;i++)
{ CLK=0;
dl=dl<<1;
DIN=CY;//将数据放好等待读入
_nop_();
CLK=1;//将数据读入
_nop_();
}
_ENB=1;
}
void write_R24(Uint r24)
{
uchar i,dh,dl;
dh=r24/256;
dl=r24%256;
_ENB=1;
_ENB=0;//开始下降沿
for(i=0;i<8;i++)
{ CLK=0;
DIN=CY;//将数据放好等待读入
_nop_();
CLK=1;//将数据读入
_nop_();
}
for(i=0;i<8;i++)
{ CLK=0;
dh=dh<<1;
DIN=CY;//将数据放好等待读入
_nop_();
CLK=1;//将数据读入
_nop_();
}
for(i=0;i<8;i++)
{ CLK=0;
dl=dl<<1;
DIN=CY;//将数据放好等待读入
_nop_();
CLK=1;//将数据读入
_nop_();
}
_ENB=1;
}
/**************************************
名称:mc145170复位函数
功能:主函数
输入参数:无
输出参数:无
*************************************/
void mc145170reset()
{
unsigned char i;
//4个以上脉冲
ENB=1;
for(i=0;i<10;i++)
{ CLK=0;
_nop_();
DIN=0;
_nop_();
CLK=1;
_nop_();
}
//
ENB=0;
for(i=0;i<8;i++)
{
CLK=0;
_nop_();
if(i==4)
DIN=1;
else
DIN=0;
CLK=1;
_nop_();
}
ENB=1;
}
/**************************************
名称:changefrequence
功能:改变频率的任务函数
输入参数:无
输出参数:无
*************************************/
/*void changefrequence(void)
{
switch(Menu1)
{ case 1: mc145170reset();
Delay5Ms();
writec(0x6f);
Delay5Ms();
write_R24(BaseFre);
Delay5Ms();
write_N(Frequence);
ePutUint(15,1,Frequence);
Delay5Ms();
Menu1=2;
break;
case 2://输入的按键对应的数码从显示屏右端移入
switch(MyKey)
{case 0:break;
case 1:
Frequence=Frequence+1;//递增
write_N(Frequence);
ePutUint(15,1,Frequence);
MyKey=0;
break;
case 2:
Frequence=Frequence-5;//递减
write_N(Frequence);
ePutUint(15,1,Frequence);
MyKey = 0;//清按键缓冲区,表示按键值已经取走
break;
case 3:
MyKey = 0;//清按键缓冲区,表示按键值已经取走
Menu1=1;
break;
}
break;
}
} */
Set_all_Mc145170()
{
mc145170reset();
Delay5Ms();
writec(0x6f);
Delay5Ms();
write_R24(BaseFre);
Delay5Ms();
write_N(Frequence);
Delay5Ms();
}
//////////////////////////////////////////数字各位分离程序/////////////////////////////
void MakeDate(int show_answer)
{ char i;
for(i=0;i<7;i++)
{c[i] = show_answer%10;
show_answer = show_answer/10;
}
if(c[6]==0)
{c[6]=10;
if(c[5]==0)
{c[5]=10;
if(c[4]==0)
{c[4]=10;
if(c[3]==0)
{c[3]=10;
if(c[2]==0)
{c[2]=10;
if(c[1]==0)
{c[1]=10;}
}
}
}
}
}
}
display_fre() //显示频率
{
char j = 0;
MakeDate(Frequence) ; //分离数字
for(j=0;j<8;j++)
{
XBYTE[0x8100]=~(0x80>>j); //选择数码管显示位数
XBYTE[0x8200]=DisplayBuffer[c[j]]; //显示数字
delay_1ms();
}
}
keybord()
{
XBYTE[0x8200] = 0;
if(P1_0 == 0)
{
Delay5Ms();
Delay5Ms();
Delay5Ms();
Delay5Ms();
Frequence = Frequence + 50;
write_N(Frequence);
}
else if(P1_1 == 0)
{
Delay5Ms();
Delay5Ms();
Delay5Ms();
Delay5Ms();
Frequence = Frequence - 50;
write_N(Frequence);
}
}
/**************************************
名称:main
功能:主函数
输入参数:无
输出参数:无
*************************************/
main()
{
//EA = 0;
Set_all_Mc145170(); //一个函数把mc145170所有寄存器设置好
while(1)
{
display_fre();
keybord() ;
}
}
/*05级单片机板程序
main()
{
EA = 0;
Set_all_Mc145170(); //一个函数把mc145170所有寄存器设置好
while(1)
{
P3_7 = 1;
if(P3_2 == 0)
{
P3_7 = 0;
Delay400Ms() ;
Delay400Ms() ;
Frequence = Frequence + 100;
}
if(P3_3 == 0)
{
P3_7 = 0;
Delay400Ms() ;
Delay400Ms() ;
Frequence = Frequence - 100;
}
if(P3_4 == 0)
{
P3_7 = 0;
Delay400Ms() ;
mc145170reset();
Delay5Ms();
writec(0x6f);
Delay5Ms();
write_R24(BaseFre);
Delay5Ms();
write_N(Frequence);
// ePutUint(15,1,Frequence);
Delay5Ms();
}
}
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -