收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx

上传人:b****4 文档编号:24636183 上传时间:2023-05-29 格式:DOCX 页数:17 大小:993.65KB
下载 相关 举报
收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx_第1页
第1页 / 共17页
收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx_第2页
第2页 / 共17页
收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx_第3页
第3页 / 共17页
收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx_第4页
第4页 / 共17页
收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx

《收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx》由会员分享,可在线阅读,更多相关《收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx(17页珍藏版)》请在冰豆网上搜索。

收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统.docx

收音机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(frequency

frequency=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(frequency

frequency=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

 

后记:

由于时间比较急,很多地方没有优化。

基础程序来源于网络,现在我也将资源回放给网络!

希望大家能一起探讨。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1