附录A
程序代码及注释
#include
Uchar code tab[]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};//数码管段码表
sbit led1=P2^4; sbit led2=P2^5; sbit led3=P2^6;
//频率显示的数码管位选端口 100兆,P2.4端口 //频率显示的数码管位选端口 10兆,P2.5端口 //频率显示的数码管位选端口 1兆,P2.6端口
sbit led4=P2^7; //频率显示的数码管位选端口 0.1兆,P2.7端口sbit SDA=P3^0; //接在TEA5767的数据端口
sbit SCL=P3^1; //接在TEA5767的时钟端口 sbit KEY1=P1^0;//频率增加按键端口 sbit KEY2=P1^1;//频率减小按键端口 #define duan P0
//频率显示的数码管段选P0端口
//开机初始化的电台频率为101.1MHz
unsigned long frequency=101100; unsigned int pll=101100;
//计算频率合成时用的变量
void Delayus(unsigned char x) {
for(;x>0;x--); }
void iic_start() { SDA=1; Delayus(4); SCL=1;
25
Delayus(4); SDA=0; Delayus(4); SCL=0; Delayus(4); }
void iic_stop() { SCL=0; Delayus(4); SDA=0; Delayus(4); SCL=1; Delayus(4); SDA=1; Delayus(4); }
void iic_ack() { SDA=0; Delayus(4); SCL=1; Delayus(4); SCL=0; Delayus(4); SDA=1; Delayus(4); }
bit iic_testack() {
26
bit ErrorBit; SDA=1; Delayus(4); SCL=1; Delayus(4); ErrorBit=SDA; Delayus(4); SCL=0; return ErrorBit; }
void iic_write8bit(unsigned char input) {
unsigned char temp; for(temp=8;temp>0;temp--) {
SDA=(bit)(input&0x80); Delayus(4); SCL=1; Delayus(4); SCL=0; Delayus(4); input=input<<1; } }
void delays (unsigned char b) //按键消抖用的延时程序 {
unsigned char i; for(b;b>0;b--) for(i=0;i<250;i++); }
27
void radio_write(void) {
unsigned char i; iic_start();
iic_write8bit(0xc0); //TEA5767写地址 if(!iic_testack()) {
for(i=0;i<5;i++) {
iic_write8bit(radio_write_data[i]); iic_ack(); } }
iic_stop();
}//将显示的频率算好后写到TEA5767芯片里面实现调节,不用考虑TEA5767用于搜台的相关位:SM,SUD
void search() {
pll=(unsigned int) ((float)((frequency+225)) /(float)8.192); //计算合成频率数据,频率单位:k radio_write_data[0]=pll/256;
//将算好的频率高位数据写入TEA5767
radio_write_data[1]=pll%6; //将算好的频率低位数据写入TEA5767 radio_write_data[2]=0x70; //这是TEA5767开立体声,关静音
radio_write_data[3]=0x16; //中国制式,采用32768晶振,软静音关,立体声消噪
声开
radio_write_data[4]=0x80; radio_write(); }
void delay() {
28
//6.5M锁相环开,去加重时间75US
}
uchar k;
for(k=0;k<100;k++);
void desplay(uint aa) {
duan=tab[aa00/100]|0x80; //关这位数码管的小数点 led2=0; delay(); led2=1;
duan=tab[aa0/10]&0x7f; //点亮这位数码管的小数点 led3=0; delay(); led3=1;
duan=tab[aa]|0x80; led4=0; delay(); led4=1;}
//关这位数码管的小数点
duan=tab[aa/1000]|0x80; led1=0; delay(); led1=1;
//关这位数码管的小数点
void main() {
radio_write(); while(1) {
if(!KEY1) {
delays(250); //延时消抖
29
//写入初始化电台频率
//手动设臵频率,+0.1MHz;