|
楼主 |
发表于 2013-11-18 11:25:41
|
显示全部楼层
今日烧友为贴正名,谢之,为名副其实,补C 码一段。 |
段选P2口gfabced-dp.{0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0,0x7f} |
unsigned char code num[]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0,0x7f}; |
int s=0,m=0,h=0; //定义三个全局变量s,m,h,用于存放秒分时的数值 |
void timer(void) interrupt 1 using 1{ |
if(i==19) //若i=20,则是1秒,我的如果是20的话会稍慢,所以改为19 |
if(s==60) //如果到了60秒,则对秒数清零,并同时分加一 |
if(m==60) //如果到了60分,则对分数清零,并同时时数加一 |
if(h==24) //如果到了24q时,则对时数清零 |
TH0=(65536-52800)/256; //再给定时器赋初始值 |
void init(void)//定时器初始函数,对定时器初始化 |
TMOD=0x01; //设定时器0的工作模式为方式1 即16位定时器 |
TH0=(65536-52800)/256; //定时时间为50ms,初始值要根据具体情况微调 |
unsigned int i; //定义一个变量,用于数码管延时 |
init(); //调用定时器初始化函数,对定时器进行初始化 |
SEG2=0; //三极管导通,只让该位显示,其他段关闭 |
P2=num[h/10]; //分离出时的十位,让数码管显示 |
while(i--); //延时一下,让眼睛视觉残留 |
SEG3=0; //三极管导通,只让该位显示,其他段关闭 |
P2=num[h%10]; //分离出时的个位,让数码管显示 |
while(i--); //延时一下,让眼睛视觉残留 |
SEG4=0; //三极管导通,只让该位显示,其他段关闭 |
P2=num[m/10]; //分离出分的十位,让数码管显示 |
while(i--); //延时一下,让眼睛视觉残留 |
SEG5=0; //三极管导通,只让该位显示,其他段关闭 |
P2=num[m%10]; //分离出分的个位,让数码管的显示 |
while(i--); //延时一下,让眼睛视觉残留 |
SEG6=0; //三极管导通,只让秒十位显示,其他段关闭 |
P2=num[s/10]; //分离出秒的十位,让数码管的显示 |
while(i--); //延时一下,让眼睛视觉残留 |
SEG7=0; //三极管导通,只让秒个位显示,其他段关闭 |
P2=num[s%10]; //分离出秒的个位,让数码管显示 |
while(i--); //延时一下,让眼睛视觉残留 |
/////////////////////////////////////////////////////////////////////////////////////////////////////这 |
uchar code tab[]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0,0x7f}; //数码管段码表 /////些 |
sbit led1=P1^4; //频率显示的数码管位选端口 100兆,P2.4端口 /////是 |
sbit led2=P1^5; //频率显示的数码管位选端口 10兆,P2.5端口 /////端 |
sbit led3=P1^6; //频率显示的数码管位选端口 1兆,P2.6端口 /////口 |
sbit led4=P1^7; //频率显示的数码管位选端口 0.1兆,P2.7端口 /////, |
sbit SDA=P3^2; //接在TEA5767的数据端口 /////可 |
sbit SCL=P3^1; //接在TEA5767的时钟端口 /////以 |
sbit KEY1=P1^2; //频率增加按键端口 /////自 |
sbit KEY2=P1^1; //频率减小按键端口 /////行 |
#define duan P2 //频率显示的数码管段选P0端口 /////修 |
/////////////////////////////////////////////////////////////////////////////////////////////////////改 |
//unsigned char radio_write_data[5]={0x33,0x8e,0x70,0x16,0x80}; //要写入TEA5767的数据,107.9M江苏旅游台 |
//unsigned char radio_write_data[5]={0x32,0x8e,0x70,0x16,0x80}; //要写入TEA5767的数据,105.8M 南京音乐台 |
//unsigned char radio_write_data[5]={0x31,0xd7,0x70,0x16,0x80}; //要写入TEA5767的数据,104.3M南京体育台 |
//unsigned char radio_write_data[5]={0x30,0x9a,0x70,0x16,0x80}; //要写入TEA5767的数据,101.7M南京经济台城市调频 |
unsigned char radio_write_data[5]={0x30,0x50,0x70,0x16,0x80}; //要写入TEA5767的数据,101.1M江苏交通广播网 |
//unsigned char radio_write_data[5]={0x2f,0xa5,0x70,0x16,0x80}; //要写入TEA5767的数据,99.7M江苏金色调频 |
//unsigned char radio_write_data[5]={0x2c,0xc9,0x70,0x16,0x80}; //要写入TEA5767的数据,97.5M江苏文艺台 |
//unsigned char radio_write_data[5]={0x2c,0xc9,0x70,0x16,0x80}; //要写入TEA5767的数据,93.7M江苏经济台居家广播 |
//unsigned char radio_write_data[5]={0x2b,0xb0,0x70,0x16,0x80}; //要写入TEA5767的数据,91.4M江苏广播 |
//unsigned char radio_write_data[5]={0x2a,0xe1,0x70,0x16,0x80}; //要写入TEA5767的数据,89.7M江苏音乐台 |
unsigned long frequency=101100; //开机初始化的电台频率为101.1MHz |
unsigned int pll=101100; //计算频率合成时用的变量 |
void Delayus(unsigned char x) |
void iic_write8bit(unsigned char input) |
for(temp=8;temp>0;temp--) |
SDA=(bit)(input&0x80); |
void delays (unsigned char b) //按键消抖用的延时程序 |
iic_write8bit(0xc0); //TEA5767写地址 |
iic_write8bit(radio_write_data | );
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%256; //将算好的频率低位数据写入TEA5767
radio_write_data[2]=0x70; //这是TEA5767开立体声,关静音
radio_write_data[3]=0x16; //中国制式,采用32768晶振,软静音关,立体声消噪声开
radio_write_data[4]=0x80; //6.5M锁相环开,去加重时间75US
radio_write();
}
void delay()
{
uchar k;
for(k=0;k<100;k++);
}
void desplay(uint aa)
{
duan=tab[aa/1000]|0x80; //关这位数码管的小数点
led1=0;
delay();
led1=1;
duan=tab[aa%1000/100]|0x80; //关这位数码管的小数点
led2=0;
delay();
led2=1;
duan=tab[aa%100/10]&0x7f; //点亮这位数码管的小数点
led3=0;
delay();
led3=1;
duan=tab[aa%10]|0x80; //关这位数码管的小数点
led4=0;
delay();
led4=1;
}
void main()
{
radio_write(); //写入初始化电台频率
while(1)
{
if(!KEY1) //手动设置频率,+0.1MHz;
{
delays(250); //延时消抖
frequency+=100;
if(frequency>108500) //频率如果大于108.5MHz
frequency=87500; //频率设定为87.5MHz
search();
desplay(frequency/100); //调用显示
}
if(!KEY2) //手动设置频率,-0.1MHz;
{
delays(250); //延时消抖
frequency-=100;
if(frequency<87500) //频率如果小于87.5MHz
frequency=108500; //频率设定为108.5MHz
search();
desplay(frequency/100); //调用显示
}
desplay(frequency/100); //调用显示
}
}
|
|