发表于 2013-03-07 11:26 IP属地:未知
考虑到体积小巧、元件少、美观以及可靠性,并且家里没有贴片的51单片机了,而AVR Atmega16贴片的单片机到是有20片,就接下来开始用Atmega16来实验。
按道理51成功了,AVR也应该容易,但是开始就遇到连上就让CD死机不工作的问题,由于程序是别人读写AT24C02的(感谢原作者,将原程序列出如下),没有验证过,也不知道是什么原因,最后花了2天时间终于搞定,过程相当艰辛!!!
当然还有AVR特有的熔丝位配置也不能不小心。
/***********************************
*实验目的:熟悉AT24C02编程
*设 计:萧联珠
*日 期:2007-11-22
************************************/
#include <iom16v.h>
#include "cfg.h"
void main()
{
unsigned char i;
uart_init(); /*串口初始化*/
一 for(i=0;i<10;i++)
I2C_Write(i,0x80+i);
delay_ms(1000);
while(1)
{
for(i=0;i<10;i++)
{
while(!(UCSRA&(1<<UDRE))); /*等待接受准备好*/
delay_ms(10);
UDR=I2C_Read(0x80+i);
}
}
}
/*********************************************
I2C总线写一个字节
返回0:写成功
返回1:写失败
**********************************************/
unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress)
{
Start(); //I2C启动
Wait();
if(TestAck()!=START)
return 1; //ACK
Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
Wait();
if(TestAck()!=MT_SLA_ACK)
return 1; //ACK
Write8Bit(RegAddress); //写器件相应寄存器地址
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1; //ACK
Write8Bit(Wdata); //写数据到器件相应寄存器
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1; //ACK
Stop(); //I2C停止
delay_ms(100); //延时
return 0;
}
烧写程序过程如下:
将AVR Atmega16单片机焊接到PCB(只焊接123456脚)
AVR Atmega16单片机烧写程序
AVR Atmega16单片机拆下来焊接到CD机PCB反面上,只焊接电源(从PCB上取工作5V)和SCL SDA 以及接按键(复用CD机头前面板上的很少用的AM键,短按是AM,长按是切换到外接CD也就是AUX)。看看焊接后的效果,很简洁、很巧妙吧!
看看焊接后的效果,很简洁、很巧妙吧!
增加AUX的切换音源到此成功,只要长按1秒AM键,就可以切换到蓝牙模块的输出了,也可以在此加上带开关的立体声耳机插座,从外部输入。
[
本帖最后由 zhou__mi 于 2013-4-5 17:11 编辑 ]