收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx
《收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx》由会员分享,可在线阅读,更多相关《收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx(15页珍藏版)》请在冰豆网上搜索。
收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统
大家好!
我是威虎小熊,。
下面这个就是我最近做的数字收音机+温度+时间+液晶显示+红外遥控=功放显示系统,(初稿,后续会完善其他功能),希望能和大家一起分享(哈哈)。
功能说明:
液晶显示(时间.温度,收音机频率)
2.红外遥控(mini红外遥控器)
3.温度检测(ds18b20)
4.时间显示(ds1302)
5.收音机(TEA5767>>无线功放)
电路图:
PDF图,DXP原图请到下载电路图/功放显示下载。
PCB图,用处不大,在此贴上,威虎科技集团是我将来的公司名字,呵呵
PCB打样成品:
5cm*非常小巧,很容易嵌入其他东西,
需要的朋友可以找我联系,我去打样的成本8元一片,不过快递运费自付。
(好像不划算哦)
Pcb资源:
见上图,很多吧,除了现在已经调试的功能外,还可以做315M/无线遥控
AD采集,DA控制,LCD数码管口可以用作与其他器件的嵌入通讯。
好了,该上程序了。
+++++++++++++++++++++++++后面内容为中内容+++++++++++++++++++++++++
#include""
#include<>
#include<>
#include<>
#include<>
#include<>
#defineuintunsignedint
#defineucharunsignedchar
uintkey,nt,t05s,t2s;
voidio_init(void);
voidint_init(void);
voidInitTimer0(void);
show_time(uintwei){nt++."};
unsignedcharcodeline1[]={"2012/06/1509:
52"};
unsignedcharcodeline2[]={"FM:
T:
"};
unsignedcharcodeL1[]={"20//:
"};
voidWlcd595(uchardat595){
unsignedcharnt;
HC595CLK=0;
HC595RCK=0;
for(nt=8;nt>0;nt--){
LCM_Data=(dat595&0x80);
dat595<<=1;
HC595CLK=0;
HC595CLK=1;
HC595CLK=1;
HC595CLK=1;
HC595CLK=0;}
HC595RCK=1;;
DisplayOneChar(7,2,(((frequency%100000)%10000)%1000)/100+0x30);
}
voidradio_write(void)
{
unsignedchari;
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();
}
//由频率计算PLL
voidget_pll(void)
{
unsignedcharhlsi;
//unsignedinttwpll=0;
hlsi=radio_write_data[2]&0x10;//HLSI位
if(hlsi)
pll=(unsignedint)((float)((frequency+225)*4)/(float);//频率单位:
k
else
pll=(unsignedint)((float)((frequency-225)*4)/(float);//频率单位:
k
}
//由PLL计算频率
voidget_frequency(void)
{
unsignedcharhlsi;
unsignedintnpll=0;
npll=pll;
hlsi=radio_write_data[2]&0x10;
if(hlsi)
frequency=(unsignedlong)((float)(npll)*(float);//频率单位:
KHz
else
frequency=(unsignedlong)((float)(npll)*(float)+225);//频率单位:
KHz
}
//读TEA5767状态,并转换成频率
voidradio_read(void)
{
unsignedchari;
unsignedchartemp_l,temp_h;
pll=0;
iic_start();
iic_write8bit(0xc1);//TEA5767读地址
if(!
iic_testack())
{
for(i=0;i<5;i++)
{
radio_read_data[i]=iic_read8bit();
iic_ack();
}
}
iic_stop();
temp_l=radio_read_data[1];
temp_h=radio_read_data[0];
temp_h&=0x3f;
pll=temp_h*256+temp_l;
get_frequency();
}
//手动设置频率,mode=1,+;mode=0:
不用考虑TEA5767用于搜台的相关位:
SM,SUD
voidsearch(bitmode)
{
radio_read();
if(mode)
{
frequency+=25;
if(frequency>max_freq)
frequency=min_freq;
}
else
{
frequency-=25;
if(frequencyfrequency=max_freq;
}
get_pll();
radio_write_data[0]=pll/256;
radio_write_data[1]=pll%256;
radio_write_data[2]=0x41;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;
radio_write();
}
//自动搜台,mode=1,频率增加搜台;mode=0:
频率减小搜台,不过这个好像不能循环搜台
voidauto_search(bitmode)
{
radio_read();
if(mode)
{
radio_write_data[2]=0xa0;//b1
frequency+=40;
if(frequency>max_freq)
frequency=min_freq;
}
else
{
radio_write_data[2]=0x20;//41
frequency-=40;
if(frequencyfrequency=max_freq;}
get_pll();
radio_write_data[0]=pll/256+0x40;//加0x40是将SM置为1为自动搜索模式
radio_write_data[1]=pll%256;
radio_write_data[3]=0x11;//SSL1和SSL0控制搜索停止条件
radio_write_data[4]=0x40;
radio_write();
radio_read();
while(!
(radio_read_data[0]&0x80))//搜台成功标志
{
radio_read();
}
}
#endif
++++++++++++++++++++++++的内容+++++++++++++++++++++++
#ifndef_ykong_H
#define_ykong_H
#include<>
#include<>
#defineuintunsignedint
#defineucharunsignedchar
uintkey,rkey,numkey;
ucharRIGHT=0,LEFT=0;
uchartimewei=1;
sbitYK=P3^2;
ucharstime[11]={0,1,2,0,6,1,5,2,3,5,7};//年月日时分各2位
//数据存放位置无年月日时分
voidshowkey(){
/*DisplayOneChar(0,2,0x30+key/10);
DisplayOneChar(1,2,0x30+key%10);
*/
}
showsstime(){
WriteComLCM(0x0f);//0x0c不显示光标,0e光标显示,0d光标闪动
DisplayListChar(0,2,"***TIMESET***");
DisplayListChar(1,1,"0");
if(ET0==1){DisplayListChar(0,2,line2);//设置完毕后恢复显示;
DisplayListChar(0,1,L1);//设置完毕后恢复显示;
showfm();//恢复显示频率
WriteComLCM(0x0C);//关光标,恢复显示。
write_1302(0x8e,0x00);//允许写,禁止写保护
if(timewei>9)write_1302(0x82,stime[9]*16+stime[10]);//分钟数据
if(timewei>7)write_1302(0x84,stime[7]*16+stime[8]);//小时数据
if(timewei>5)write_1302(0x86,stime[5]*16+stime[6]);//日期数据
if(timewei>3)write_1302(0x88,stime[3]*16+stime[4]);//月份数据
if(timewei>1)write_1302(0x8c,stime[1]*16+stime[2]);//年份数据
write_1302(0x8e,0x80);//打开写保护
timewei=1;
}
}
voidpkey(){
if(rkey!
=key){
switch(key){
case70:
ET0=~ET0;showsstime();break;//mode//进入和退出时间设置
case64:
LEFT=1;search(0);showfm();break;//<<;向下微调FM
case67:
RIGHT=1;search
(1);showfm();break;//>>向上微调FM
case21:
auto_search(0);showfm();break;//--自动向下搜台
case9:
auto_search
(1);showfm();break;//++自动向上搜台
case68:
showfm();break;//>||
case7:
if(ET0==0)ds1302_init();break;//EQ//在时间设置状态时初始化1302
case22:
numkey=0;break;//0
case12:
numkey=1;break;//1
case24:
numkey=2;break;//2
case94:
numkey=3;break;//3
case8:
numkey=4;break;//4
case28:
numkey=5;break;//5
case90:
numkey=6;break;//6
case66:
numkey=7;break;//7
case82:
numkey=8;break;//8
case74:
numkey=9;break;//9
}};
}
/******************遥控中断****************************/
voidint_init(void){EX0=1;EA=1;}
/*******************遥控服务程序*****************************/
voidinterrupt0()interrupt0
{uchari3=0,j3=0,k3=0,us=0;
ucharaddr[4]={0};
EX0=0;
for(i3=0;i3<255;i3++)//9ms内有高电平认为是干扰
{if(YK)//255的值实际时间为800us
{EX0=1;
return;
}
}
while(!
(YK));//等待9ms低电平过去
for(i3=0;i3<4;i3++){
for(j3=0;j3<8;j3++){
while(YK);//等待高电平过去
while(!
(YK));//等待低电平后面的高电平
while(YK)//计算这个高电平的时间
{for(us=0;us<=32;us++);//100us的延时语句
if((k3++)>=30)//高电平时间过长退出程序
{EX0=1;
return;
}
}
addr[i3]=addr[i3]>>1;//接收一位数据
if(k3>=8)
addr[i3]=addr[i3]|0x80;//高电平大于,则为1
k3=0;
}
}
key=(addr[2]);//二进制键值
EX0=1;
pkey();
showkey();
}
#endif
++++++++++++++++++++++++++ds18b20内容+++++++++++++++++++++++++++++++++++
#ifndef_DS18B20_H
#define_DS18B20_H
#include<>
sbitDQ=P3^3;//ds18b20与单片机连接口
uchardatadisdata[5];
uinttvalue;//温度值
uchartflag;//温度正负标志
/******************************ds1820程序***************************************/
voiddelay_18B20(unsignedinti9)//延时1微秒
{while(i9--);}
voidds1820rst()/*ds1820复位*/
{
DQ=1;delay_18B20(4);//延时
DQ=0;delay_18B20(100);//精确延时大于480us
DQ=1;delay_18B20(40);
}
uchards1820rd()/*读数据*/
{unsignedchari9=0;
unsignedchardat2=0;
for(i9=8;i9>0;i9--)
{DQ=0;dat2>>=1;
DQ=1;if(DQ)dat2|=0x80;
delay_18B20(10);
}
return(dat2);
}
voidds1820wr(ucharwdata)/*写数据*/
{unsignedchari9=0;
for(i9=8;i9>0;i9--)
{DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()//读取温度值并转换
{
ucharda1,da2;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号
ds1820wr(0x44);//*启动温度转换
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号
ds1820wr(0xbe);//*读取温度
da1=ds1820rd();
da2=ds1820rd();
tvalue=da2;
tvalue<<=8;
tvalue=tvalue|da1;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*;//温度值扩大10倍,精确到1位小数
return(tvalue);
}
#endif
后记:
由于时间比较急,很多地方没有优化。
基础程序来源于网络,现在我也将资源回放给网络!
希望大家能一起探讨。