1、收音机tea5767+温度18b20+时间ds1302+1602液晶显示+红外遥控功放显示系统大家好!我是威虎小熊, 。 下面这个就是我最近做的数字收音机+温度+时间+液晶显示+红外遥控=功放显示系统,(初稿,后续会完善其他功能),希望能和大家一起分享(哈哈)。 功能说明:液晶显示 (时间.温度,收音机频率) 2.红外遥控 (mini红外遥控器) 3.温度检测 (ds18b20)4.时间显示 (ds1302)5.收音机 (TEA5767 无线功放)电路图:PDF 图,DXP原图请到下载 电路图/功放显示 下载。PCB图,用处不大,在此贴上,威虎科技集团是我将来的公司名字 ,呵呵PCB打样成品:
2、5cm* 非常小巧,很容易嵌入其他东西, 需要的朋友可以找我联系 ,我去打样的成本8元一片,不过快递运费自付。(好像不划算哦)Pcb资源:见上图,很多吧, 除了现在已经调试的功能外,还可以做315M/无线遥控AD采集,DA控制,LCD数码管口可以用作与其他器件的嵌入通讯。好了,该上程序了。 +后面内容为中内容+#include#include#include#include#include#include#define uint unsigned int#define uchar unsigned charuint key,nt,t05s,t2s;void io_init(void);void
3、 int_init(void); void InitTimer0(void);show_time(uint wei) nt+. ;unsigned char code line1 = 2012/06/15 09:52;unsigned char code line2 = FM: T:;unsigned char code L1 = 20 / / : ; void Wlcd595(uchar dat595 ) unsigned char nt; HC595CLK=0;HC595RCK=0;for(nt=8;nt0;nt-)LCM_Data=(dat595&0x80);dat595=1;HC595
4、CLK=0; HC595CLK=1;HC595CLK=1; HC595CLK=1; HC595CLK=0; HC595RCK=1; ;DisplayOneChar(7,2,(frequency%100000)%10000)%1000)/100+0x30); void radio_write(void) unsigned char i; iic_start(); iic_write8bit(0xc0); /TEA5767写地址 if(!iic_testack() for(i=0;i5;i+) iic_write8bit(radio_write_datai); iic_ack(); iic_sto
5、p(); /由频率计算PLLvoid get_pll(void) unsigned char hlsi; / unsigned int twpll=0; hlsi=radio_write_data2&0x10; /HLSI位 if (hlsi) pll=(unsigned int)(float)(frequency+225)*4)/(float); /频率单位:k else pll=(unsigned int)(float)(frequency-225)*4)/(float); /频率单位:k/由PLL计算频率void get_frequency(void) unsigned char hls
6、i; unsigned int npll=0; npll=pll; hlsi=radio_write_data2&0x10; if (hlsi) frequency=(unsigned long)(float)(npll)*(float); /频率单位:KHz else frequency=(unsigned long)(float)(npll)*(float)+225); /频率单位:KHz/读TEA5767状态,并转换成频率void radio_read(void) unsigned char i; unsigned char temp_l,temp_h; pll=0; iic_start
7、(); iic_write8bit(0xc1); /TEA5767读地址 if(!iic_testack() for(i=0;imax_freq) frequency=min_freq; else frequency-=25; if(frequencymax_freq) frequency=min_freq; else radio_write_data2=0x20; /41 frequency-=40; if(frequencymin_freq) frequency=max_freq; get_pll(); radio_write_data0=pll/256+0x40; /加0x40是将SM置
8、为1 为自动搜索模式 radio_write_data1=pll%256; radio_write_data3=0x11; /SSL1和SSL0控制搜索停止条件 radio_write_data4=0x40; radio_write(); radio_read(); while(!(radio_read_data0&0x80) /搜台成功标志 radio_read(); #endif+ 的内容+#ifndef _ykong_H#define _ykong_H#include#include#define uint unsigned int#define uchar unsigned charu
9、int key,rkey,numkey;uchar RIGHT=0, LEFT=0; uchar timewei=1;sbit YK=P32; uchar stime11=0,1,2,0,6,1,5,2,3,5,7;/年月日时分各2位 /数据存放位置 无 年 月 日 时 分 void showkey() /*DisplayOneChar(0,2,0x30+key/10);DisplayOneChar(1,2,0x30+key%10); */ showsstime() WriteComLCM(0x0f); /0x0c不显示光标,0e光标显示,0d光标闪动 DisplayListChar(0, 2
10、, *TIME SET* ); DisplayListChar(1, 1, 0); if(ET0=1) DisplayListChar(0, 2, line2); / 设置完毕后恢复显示; DisplayListChar(0, 1, L1); / 设置完毕后恢复显示; showfm(); /恢复显示频率 WriteComLCM(0x0C); /关光标 ,恢复显示。 write_1302(0x8e,0x00); /允许写,禁止写保护 if(timewei9)write_1302(0x82,stime9*16+stime10);/分钟数据if(timewei7)write_1302(0x84,st
11、ime7*16+stime8);/小时数据if(timewei5)write_1302(0x86,stime5*16+stime6);/日期数据if(timewei3)write_1302(0x88,stime3*16+stime4);/月份数据if(timewei1)write_1302(0x8c,stime1*16+stime2);/年份数据 write_1302(0x8e,0x80); /打开写保护 timewei=1; void pkey()if(rkey!=key) switch(key) case 70 : ET0=ET0;showsstime();break; / mode /进
12、入和退出时间设置 case 64 : LEFT=1;search(0);showfm();break; / 向上微调FM case 21 : auto_search(0); showfm(); break; / - 自动向下搜台 case 9 : auto_search(1); showfm(); break; / + 自动向上搜台 case 68 : showfm();break; / | case 7 : if(ET0=0)ds1302_init(); break; / EQ /在时间设置状态时初始化1302 case 22 : numkey=0; break; /0 case 12 :
13、numkey=1; break; /1 case 24 : numkey=2; break; /2 case 94 : numkey=3; break; /3 case 8 : numkey=4; break; /4 case 28 : numkey=5; break; /5 case 90 : numkey=6; break; /6 case 66 : numkey=7; break; /7 case 82 : numkey=8; break; /8 case 74 : numkey=9; break; /9 ; /*遥控中断*/void int_init(void)EX0=1; EA=1;
14、/*遥控服务程序*/void interrupt0()interrupt 0 uchar i3=0,j3=0,k3=0,us=0; uchar addr4=0; EX0=0; for(i3=0;i3255;i3+) /9ms内有高电平认为是干扰 if(YK) /255的值实际时间为800us EX0=1; return; while(!(YK); /等待9ms低电平过去 for(i3=0;i34;i3+) for(j3=0;j38;j3+) while(YK); /等待高电平过去 while(!(YK); /等待低电平后面的高电平 while(YK) /计算这个高电平的时间 for(us=0;
15、us=30) /高电平时间过长退出程序 EX0=1; return; addri3=addri31; /接收一位数据 if(k3=8) addri3=addri3|0x80; /高电平大于,则为1 k3=0; key=(addr2); /二进制键值 EX0=1; pkey(); showkey(); #endif+ds18b20内容+#ifndef _DS18B20_H#define _DS18B20_H#includesbit DQ=P33;/ds18b20与单片机连接口uchar data disdata5;uint tvalue;/温度值uchar tflag;/温度正负标志 /*ds1
16、820程序*/void delay_18B20(unsigned int i9)/延时1微秒 while(i9-); void ds1820rst()/*ds1820复位*/DQ = 1; delay_18B20(4); /延时DQ = 0; delay_18B20(100); /精确延时大于480usDQ = 1; delay_18B20(40); uchar ds1820rd()/*读数据*/ unsigned char i9=0;unsigned char dat2 = 0;for (i9=8;i90;i9-) DQ = 0; dat2=1; DQ = 1; if(DQ) dat2|=0
17、x80; delay_18B20(10); return(dat2);void ds1820wr(uchar wdata)/*写数据*/unsigned char i9=0; for (i9=8; i90; i9-) DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata=1; read_temp()/读取温度值并转换uchar da1,da2;ds1820rst(); ds1820wr(0xcc);/*跳过读序列号ds1820wr(0x44);/*启动温度转换ds1820rst(); ds1820wr(0xcc);/*跳过读序列号 ds1820wr(0xbe);/*读取温度 da1=ds1820rd();da2=ds1820rd();tvalue=da2;tvalue=8;tvalue=tvalue|da1; if(tvalue0x0fff) tflag=0; else tvalue=tvalue+1;tflag=1; tvalue=tvalue*;/温度值扩大10倍,精确到1位小数 return(tvalue); #endif后记:由于时间比较急,很多地方没有优化 。基础程序来源于网络,现在我也将资源回放给网络!希望大家能一起探讨。