这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » th152210的MCU DIY进程贴-自动校时万年历之收音机

共54条 5/6 |‹ 1 2 3 4 5 6 跳转至
助工
2011-12-31 00:04:34     打赏
41楼
算了,还是上传工程文件夹中所有的内容吧,我喜欢分文件进行编程,这是看到网上有个编程习惯的文章后养成的习惯,文件较分散,直接上传工程文件夹吧。如下
rtx51-ds1302.rar

下面是视频:
好像不能看,点击下面的链接吧。
http://v.youku.com/v_show/id_XMzM3OTU1NTIw.html


高工
2011-12-31 00:44:52     打赏
42楼

跟楼主学习下!


助工
2011-12-31 18:07:00     打赏
43楼

今天调试了一下pcf8951,用12864进行显示,请先看程序。图在后面

 

Mian.C文件中的内容为:

//pcf8591调试程序

 

#include "main.h"

#include "lcd12864.h"

#include "pcf8591.h"

 

uint time=0;

uchar ADFlag=0;

uchar str[] = "ch : . v";

 

//12864显示ad转换的值

void dis(uchar *date)

{

         uchar i=0;

         for(i=0; i<4; i++)                

         {

           str[2]=i+0x30;

           str[4]=date[i]/50+0x30;

           str[6]=date[i]%50/10+0x30;

           writelcdwords(0x80+i*8, str);

         }

}

void main()

{

         uchar i=0;

         uchar vot[4];

         init_lcd();

         while(1)

         {

                            vot[3]=read(2);         //器件在上一次转换结果读出后才进行下次采样转换

                            vot[2]=read(1);

                            vot[1]=read(0);

                            vot[0]=read(3);

                            dis(vot);

         }

}

 

 

Pcf8951.c文件中的内容为:

#include "main.h"

#include "pcf8591.h"

 

//延时1US

void delay(uint cnt)

{

         while(--cnt);

}

 

void start()

{

         SDA_SET;

         delay(1);

         SCL_SET;

         delay(5);

         SDA_CLR;

}

 

void stop()

{

         SDA_CLR;

         delay(1);

         SCL_SET;

         delay(5);

         SDA_SET; 

}

 

 

void ack()

{

         SDA_CLR;

         SCL_SET;

         delay(1);

         SCL_CLR;

}

 

 

void noAck()

{

         SDA_SET;

         SCL_SET;

         delay(1);

         SCL_CLR;

}

//向器件发送一个字节

void send(uchar Data)

{

         uchar i=0;

         uchar temp=0;

        

         temp=Data;

         for(i=0; i<8; i++)

         {

                   SCL_CLR;

                   delay(1);

                   if(temp&0x80) SDA_SET;

                   else SDA_CLR;

                   delay(1);

                   SCL_SET;

                   delay(1);

                   temp<<=1;

         }

         SCL_CLR;

}

//接收一个字节

uchar recive()

{

         uchar i=0;

         uchar temp=0;

 

         SDA_SET;//必须设置

         for(i=0; i<8; i++)

         {

                   SCL_CLR;//拉低允许数据改变

                   delay(1);

                   SCL_SET;//拉高保持数据,等待读走

                   delay(2);

                   if(SDA) temp|=0x01;

                   else temp&=0xfe;

                   if(i<7)   temp<<=1;//最低位发送完成不能移位,否则出错

         }

         SCL_CLR;

         return temp;

}

 

//adc数据读取

//ch为要进行ad转换的通道号

uchar read(uchar ch )

{

         uchar temp=0;

        

         start();

         send(AddWr);//确认芯片

         ack();

         send(adCon|ch);//确认通道

         ack();

         //读出数据,放进temp

         start();

         send(AddRd);

         ack();

         temp=recive();

         noAck();

         stop();

         return temp;

}

//dac输出程序

//light:设置dac要输出的值

uchar DAC(uchar light)

{

         start();

         send(AddWr);

         ack();

         send(0x40);  //写入控制位,使能DAC输出

         ack();

         send(light);

         ack();

         stop();

         return 1;

}


助工
2011-12-31 18:25:51     打赏
44楼
有图有真相,看我的程序运行效果图,如下所示:

还有视频:
http://v.youku.com/v_show/id_XMzM4MjE4ODgw.html

助工
2011-12-31 20:18:40     打赏
45楼
在大学期间做飞思卡尔比赛时,利用那一点点可能会成为废料的pcb一脚画了一个诺基亚5110显示屏电路,其中还带有收音机模块以及音频放大电路。如下图所示:
正面


反面

助工
2011-12-31 20:54:41     打赏
46楼

由于这次比赛用的pcb上没有3.3V的电源,所以我将我从自己diy的开发板上做的程序发给大家,给大家一个参考:
#include "main.h"
#include "lcd5110.h"
unsigned char code shuzi[]={0};

unsigned char code hanzi[][32]={
//字模数据,自己提取,提取方法见图片
};

void delay_1ms(void)//1ms延时函数
{
 unsigned int i;
 for (i=0;i<500;i++)   ;
;
}

/*--------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:dt:写入的数据;
command :写数据/命令选择;数据为1,命令为0
编写日期:20080918
----------------------------------------------*/
void LCD_write_byte(unsigned char dt, bit command)
{
 unsigned char i;
 sce=0; 
 dc=command; 
 for(i=0;i<8;i++)
 {
  if(dt&0x80)
   sdin=1;
  else
   sdin=0;
  dt=dt<<1;  
  sclk=0;   
  sclk=1;
 } 
 dc=1; 
 sce=1; 
 sdin=1;
}
/*---------------------------------------
LCD_init: 3310LCD初始化
编写日期:20080918
-----------------------------------------  */
void LCD_init(void)
{
 res=0;   
   delay_1ms();
   res=1; 
 LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令
 LCD_write_byte(0xd0,0);//设定液晶偏置电压
 LCD_write_byte(0x22,0);//使用基本指令
 LCD_write_byte(0x0c,0);//设定显示模式,正常显示
}
/*-------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83  Y:0-5
编写日期:20080918
---------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
 LCD_write_byte(0x40 | Y, 0);// column
 LCD_write_byte(0x80 | X, 0);// row
}
/*------------------------------------------
LCD_clear: LCD清屏函数
编写日期:20080918
--------------------------------------------*/
void LCD_clear(void)
{
 unsigned char t;
 unsigned char k;
 LCD_set_XY(0,0);
 for(t=0;t<6;t++)
 {
  for(k=0;k<84;k++)
  {
   LCD_write_byte(0x00,1);
    
  }
 }
}
/*---------------------------------------------
LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
输入参数:c:显示的字符;
编写日期:20080918
-----------------------------------------------*/
void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
 unsigned char i;   
 
 LCD_set_XY(row*8, page);// 列,页
 for(i=0; i<8;i++)
 {
  LCD_write_byte(shuzi[c*16+i],1);
 }
 
    LCD_set_XY(row*8, page+1);// 列,页
 for(i=8; i<16;i++)
 {
  LCD_write_byte(shuzi[c*16+i],1);
 }   
}
/*---------------------------------------------
LCD_write_hanzi: 显示16(宽)*16(高)点阵列汉字等半角类
输入参数:c:显示的字符;
编写日期:20080918
-----------------------------------------------*/
void LCD_write_hanzi(unsigned char row, unsigned char column,unsigned char c) //row:列 page:页 dd:字符
{
 unsigned char rowCount,columnCount,i;
 for(columnCount=0,i=0;columnCount<16;columnCount++) //共16列
 {    
  for(rowCount=0;rowCount<2;rowCount++,i++)
  {
   LCD_set_XY(column*16+columnCount,  row*2+1-rowCount);//设置坐标
   LCD_write_byte(hanzi[c][i],1);
  }
 }
}

main.c中为:
#include "main.h"
#include "lcd5110.h"

void main()
{
 unsigned char k;
 res=0;
 for(k=0;k<250;k++);
 res=1;    
   LCD_init();  //初始化LCD模块
 LCD_clear(); //清屏幕 
 LCD_write_hanzi(0,0,4);  // 
 LCD_write_hanzi(0,1,3);  //
 LCD_write_hanzi(0,2,2);  //
 LCD_write_hanzi(0,3,1);  //
 LCD_write_hanzi(0,4,0);  //
}


将得到的字模数据放到hanzi[][32]数组中。


助工
2011-12-31 21:40:29     打赏
47楼
新年将至,大家新年快乐。

助工
2011-12-31 21:42:29     打赏
48楼
要去上夜班了,真希望比赛能推迟一下啊。还有好多东西没完成呢。

助工
2012-01-02 09:19:01     打赏
49楼
大学期间做过一个自动校时万年历,是用收音机实现的,但最后的时候没有做完,只剩下了一个尾巴,做出的作品也被学校收上去了,现在也不知道上哪去了,很有可能让学校丢了。
这次趁着diy比赛的激情还没结束,继续做我的自动校时万年历。

助工
2012-01-02 09:21:37     打赏
50楼
调试万年历,万年历做好了再实现自动校时。

以下是我做的半成品,大体框架如视频所示,其中收音机模块和音频滤波还没有完成,正在努力中。农历算法是参阅了大量资料后编程实现的。


共54条 5/6 |‹ 1 2 3 4 5 6 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]