此电路的控制软件
//10米调频机控制软件 v1.0
//at89c2051+mc145170 display mc4511*2
//编写人:张樱繁
//日期:2004年10月28日
#include <at892051.h>
//pin definitiont 管脚定义
#define up p3_0 //频率上升键
#define down p3_1 //频率下降键
#define ptt p3_2 //按下发射键
#define din p3_5 //din mc145170第5脚
#define enb p3_4 //enb mc145170第6脚
#define clk p3_3 //clk mc145170第7脚
#define trchange p3_7 //收发转换控制低电平1为发。高电平0为收
#define displaydata p1 //显示到数码管的数据
//variable definition 变量定义
unsigned char c_reg = 0x6f; //为c寄存器的变量,初值使fv,fr有输出,失锁有指示,参考输出为时钟的1/4
unsigned char r_reg[3] = {0x00,0x02,0x58}; //为r寄存器的变量,初值为600,0x0258,步进10k
unsigned char tn_reg[2] = {0x0b,0x90}; //发射v寄存器的变量,初值为2960,0x0b90
unsigned char rn_reg[2] = {0x0f,0xbe}; //接收时v寄存器的变量4030,0x0fbe
unsigned char freq = 60; //开机时显示频率为29.6mhz
//subroutines 子程序
void send_one( unsigned char dta ) // send one byte msb first
{
unsigned char x;
for(x=0; x<8; x++) // do all bits
{
if(dta & 0x80)
din = 1;
else
din = 0;
clk = 1; // generate clock pulse
dta <<= 1; // move next bit
clk = 0;
}
}
void c_reg_load()
{
clk=0;
enb=1;
enb=0;
send_one(c_reg); //c_reg
enb=1;
}
void r_reg_load()
{
unsigned char x;
clk=0;
enb=1;
enb=0;
for (x=0;x<3;x++)
send_one(r_reg[x]);
enb=1;
}
void rn_load() //设置接收频率
{
unsigned char x;
clk=0;
enb=1;
enb=0;
for (x=0;x<2;x++)
send_one(rn_reg[x]);
enb=1;
}
void tn_load() //设置发射频率
{
unsigned char x;
clk=0;
enb=1;
enb=0;
for (x=0;x<2;x++)
send_one(tn_reg[x]);
enb=1;
}
void display() //显示频率
{
unsigned char temp1,temp2;
temp2=freq/10; //取出频率值的十位
temp1=(freq-temp2*10);//取出频率值的个位
displaydata=(temp2*16+temp1);
}
void init() //初始化程序,对各个输出端口,mc145170内部的三个寄存器等
{
display(); //开机时显示29.6
trchange=0; //开机设置为接收状态
c_reg_load();
r_reg_load();
rn_load();
}
void delay() //延时200 ms
{
int i,j;
for (i=0; i< 200; i++)
for (j=0; j< 60; j++)
{
;
} //delay some time
}
//main goes here主程序
main()
{
init();
do
{
if (up==0)
{
delay();
if (up==0)
{
if (freq<=98)
{
freq++;
display();
rn_reg[1]++;
rn_load();
tn_reg[1]++;
}
}
}
if (down==0)
{
delay();
if (down==0)
{
if (freq>=1)
{
freq--;
display();
rn_reg[1]--;
rn_load();
tn_reg[1]--;
}
}
}
if (ptt==0)
{
delay();
if (ptt==0)
{
trchange=1;//发
tn_load();
while (ptt==0)
delay();
}
}
else
{
rn_load();
trchange=0;//收
}
}
while (1);
}
__________________