/*******************************************************************************
* 程序功能:FM收音机功能,其中,T,D键为 设置,L,R键为
* 硬件连接:1.LCD1602,P0接D0-D7,RS-P2.2,RW-P2.1,E-P2.2
2.FM模块,SDA-P3.7,SCL-P3.6
3.按键:T-P1.3(自动搜索频率加),D-P1.2(自动搜索频率减)
L-P1.1(音量加),R-P1.0(音量减)
*******************************************************************************/
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <intrins.h>
#include "rda5807.h"
#include "delay.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
#define GPIO_DIG P2
sbit K1 = P1^3;
sbit K2 = P1^2;
sbit K3 = P1^1;
sbit K4 = P1^0;
sbit led1 = P1^7;
sbit led2 = P1^6;
sbit voice=P1^4;
/****************数码管**********************/
char led_mod[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 }; /*共阳数码管显示编码*/
unsigned char distab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
char led_bit[] = { 0x07, 0x0B, 0x0D, 0x0E }; /*位选信号编码*/
unsigned int DisplayData[4]={0,0,0,0};
//**************************************************************
//串口初始化
void UART_init()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
IE = 0x0; // 禁止任何中断
TI =1;
}
/***********************************************/
void delay1ms( unsigned int ms)
{
unsigned char k;
while(ms--)
{
for(k = 0; k < 120; k++);
}
单片机printf函数}
/********************************************************
数码管显示
*/
void show(unsigned long f )
{
unsigned int i;
unsigned int j;
DisplayData[0]=f/100000;
DisplayData[1]=(f%100000)/10000;
DisplayData[2]=((f%100000)%10000)/1000;
DisplayData[3]=(((f%100000)%10000)%1000)/100;
i=0;
while(i<4)
{
P3=0xFF; /*关位选,防止显示混乱*/
if(i!=2)
P2 = led_mod[DisplayData[i]]; /*送显示编码*/
else
P2 = distab[DisplayData[i]]; /*送显示编码*/
P3 = led_bit[i];
j=600;
while(j--);
i++;
P2 = 0xFF;
P3=0xFF;
}
}
/*************蜂鸣器************************/
void ring() //蜂鸣器
{ int i;
for(i=0;i<100;i++)
{
voice=0; //蜂鸣器开
delay1ms(1);
voice=1;
delay1ms(1);
}
}
//**************************************************************
//主函数
void main(void)
{ unsigned long frequency=87000;
unsigned int volume=9;
UART_init();
printf("UART test!\n");
lcd_init();
displogo();
delayms(10000);
lcd_init();
RDA5807_power();
while(1)
{
led1 =1;
led2 =1;
Lcd_Display(frequency,volume);
show(frequency
);
if(K1 == 0)
{
led1 =0;
delayms(20);
if(K1 == 0)
{
ring();
while(K1 == 0);
RDA_reg_data[0] |= (1 << 1); //SEEK UP
frequency=RDA5807_FM_seek();
printf("frequency:%ld\n",frequency);
}
}
if(K2 == 0)
{
led1 =0;
delayms(20);
if(K2 == 0)
{
ring();
while(K2 == 0);
RDA_reg_data[0] &= ~(1 << 1); //SEEK DOWN
frequency=RDA5807_FM_seek();
printf("frequency:%ld\n",frequency);
}
}
if(K3 == 0)
{ led2 =0;
delayms(20);
if(K3 == 0)
{
ring();
while(K3 == 0);
if((RDA_reg_data[7] & 0x0f) > 0x00)
{
RDA_reg_data[0] = 0xd0;
RDA_reg_data[1] = 0x01;
RDA_reg_data[3] &= ~(1 << 4);
RDA_reg_data[7]--; // 音量递减
RDA5807_write_reg();
volume=RDA_reg_data[7] & 0x0f;
printf("volume:%d\n",volume);
}
}
}
if(K4 == 0)
{ led2 =0;
delayms(20);
if(K4 == 0)
{
ring();
while(K4 == 0);
if((RDA_reg_data[7] & 0x0f) < 0x0f)
{
RDA_reg_data[0] = 0xd0;
RDA_reg_data[1] = 0x01;
RDA_reg_data[3] &= ~(1 << 4);
RDA_reg_data[7]++; // 音量递增
RDA5807_write_reg();
volume=RDA_reg_data[7] & 0x0f;
printf("volume:%d\n",volume);
}
}
}
}
}
//***************************************************************
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论