论坛风格切换切换到宽版
  • 5804阅读
  • 12回复

闲着没事也整个at89s52 控制 cdrom的东东 [复制链接]

上一主题 下一主题
离线BG8WJ
 
发帖
166
只看楼主 倒序阅读 0楼 发表于: 2006-09-14
闲着没事做了个cdrom 播放控制器 使用at89s52
控制板设计成通用最小系统板,以便开发其他设备直接抓来用。

小图 | 大图 图片

  • 哈罗CQ火腿社区 - 单片机与自动控制 - 闲着没事也整个at89s52 控制 cdrom的东东
  • 哈罗CQ火腿社区 - 单片机与自动控制 - 闲着没事也整个at89s52 控制 cdrom的东东
  • 哈罗CQ火腿社区 - 单片机与自动控制 - 闲着没事也整个at89s52 控制 cdrom的东东
  • 哈罗CQ火腿社区 - 单片机与自动控制 - 闲着没事也整个at89s52 控制 cdrom的东东
  • 哈罗CQ火腿社区 - 单片机与自动控制 - 闲着没事也整个at89s52 控制 cdrom的东东
离线ahzds
发帖
7423
只看该作者 1楼 发表于: 2006-09-15
8c
考虑公布资料吗?
离线BG8WJ
发帖
166
只看该作者 2楼 发表于: 2006-09-15
现在先发电路图和pcb 电路板的设计资料
附件: cdrom.rar (0 K) 下载次数:293
附件: Protel Schematic.pdf (0 K) 下载次数:356
离线BG7YDO
发帖
3654
只看该作者 3楼 发表于: 2006-09-15
谢谢                   !
离线BG8WJ
发帖
166
只看该作者 4楼 发表于: 2006-09-15
红外部分应为没有买到接收头没有调试所以还没有完成,在制作板子焊接时空着就可以。
源代码占是不公开。代码以hex烧写文件升级形式上传。
附件: cdrmfirware1.0.rar (0 K) 下载次数:177
离线BG8WJ
发帖
166
只看该作者 5楼 发表于: 2006-09-15
cdrom的ide 编程 参考数据手册 英文板官方资料
另外在上传配合上传的pcb板的使用说明书
附件: ATAdatasheet1.pdf (0 K) 下载次数:208
附件: cdrom播放器使用说明.pdf (0 K) 下载次数:235
附件: ATAdsheet2.part1.rar (0 K) 下载次数:1205
附件: ATAdsheet2.part2.rar (0 K) 下载次数:187
离线BG4XDO
发帖
1124
只看该作者 6楼 发表于: 2006-09-15
谢   谢!!
离线bg5cvc
发帖
1106
只看该作者 7楼 发表于: 2006-09-15
高手!!!
离线bg4iww
发帖
8698
只看该作者 8楼 发表于: 2006-09-16
关注中!正在研究资料,改天也做一个!
不知楼主能否在上面挂接vcd解码板,直接从ide口读出数据转换格式后送解码板解码?这样就可以diy出vcd了
离线honggun
发帖
483
只看该作者 9楼 发表于: 2006-09-16
www.cdle.net 上有全部的源代码资料。
离线BG8WJ
发帖
166
只看该作者 10楼 发表于: 2006-09-17
cdrom控制板-液晶显示编程说明:8bit 显示方式 显示驱动函数 (这个驱动函数在 protues里面是无法正确模拟的!但是实际lcd1602是可以运行。)
lcd1602 8线并口通信源程序
连接方式是db0-db7接p1.0-p1.7;rs:p2.7;rw:p2.6 en:p2.5;
#include <reg51.h>
#define lcdio p0
sbit lcd1602_rs=p2^7;
sbit lcd1602_rw=p2^6;
sbit lcd1602_en=p2^5;

void lcd_delay(void)//使用延时函数代替busy check 该延时函数 使用for语句不能作为精确延时通用函数
{
unsigned char i;
for(i=40;i>0;i--)
;
}

void lcd_en_command(unsigned char command)
{
lcdio=command;
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_en=0;
lcd_delay();
lcd1602_en=1;
}


void lcd_en_dat(unsigned char dat)
{
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_en=0;
lcd_delay();
lcdio=dat;
lcd1602_en=1;
}


void lcd_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
lcd_en_command(address);
}


void lcd_write_char( unsigned x,unsigned char y,unsigned char dat)
{
lcd_set_xy( x, y );
lcd_en_dat(dat);
}


void lcd_write_string(unsigned char x,unsigned char y,unsigned char *s)
{
lcd_set_xy( x, y );
while (*s)
{
lcdio=*s;
lcd_en_dat(*s);
s ++;
}
}


void lcd_init(void)//初始化函数 具体见 hd44780的命令详解
{
lcd_en_command(0x01);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0xc0);
delay_nms(5);
lcd_en_command(0x80);
delay_nms(5);
lcd_en_command(0x01);
delay_nms(5);
}


void delay_nms(unsigned int n)//长延时函数,同样不能作为精确延时的用函数
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}

void main(void)
{
  lcd_init();
  while(1)
  {
    clearscreen;
    delay_nms(2);
    lcd_write_string(0,0," bg8wj");
    lcd_write_string(0,1," cdrom contral ");
  }
}
附件: HD44780.pdf (0 K) 下载次数:426
离线chilingtao
发帖
456
只看该作者 11楼 发表于: 2006-09-18
做记号》》》》》》》
离线BG6AGB
发帖
915
只看该作者 12楼 发表于: 2006-09-18
'
cdrom控制板-液晶显示编程说明:8bit 显示方式 显示驱动函数 (这个驱动函数在 protues里面是无法正确模拟的!但是实际lcd1602是可以运行。)
lcd1602 8线并口通信源程序
连接方式是db0-db7接p1.0-p1.7;rs:p2.7;rw:p2.6 en:p2.5;
#include <reg51.h>
#define lcdio p0
sbit lcd1602_rs=p2^7;
sbit lcd1602_rw=p2^6;
sbit lcd1602_en=p2^5;
void lcd_delay(void)//使用延时函数代替busy check 该延时函数 使用for语句不能作为精确延时通用函数
{
unsigned char i;
for(i=40;i>0;i--)
;
}
void lcd_en_command(unsigned char command)
{
lcdio=command;
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_en=0;
lcd_delay();
lcd1602_en=1;
}
void lcd_en_dat(unsigned char dat)
{
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_en=0;
lcd_delay();
lcdio=dat;
lcd1602_en=1;
}
void lcd_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
lcd_en_command(address);
}
void lcd_write_char( unsigned x,unsigned char y,unsigned char dat)
{
lcd_set_xy( x, y );
lcd_en_dat(dat);
}
void lcd_write_string(unsigned char x,unsigned char y,unsigned char *s)
{
lcd_set_xy( x, y );
while (*s)
{
lcdio=*s;
lcd_en_dat(*s);
s ++;
}
}
void lcd_init(void)//初始化函数 具体见 hd44780的命令详解
{
lcd_en_command(0x01);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0x38);
delay_nms(5);
lcd_en_command(0xc0);
delay_nms(5);
lcd_en_command(0x80);
delay_nms(5);
lcd_en_command(0x01);
delay_nms(5);
}
void delay_nms(unsigned int n)//长延时函数,同样不能作为精确延时的用函数
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}
void main(void)
{
  lcd_init();
  while(1)
  {
    clearscreen;
    delay_nms(2);
    lcd_write_string(0,0," bg8wj");
    lcd_write_string(0,1," cdrom contral ");
  }
}
'

protues里的模拟的hd44780不能正常检测忙信号,所以仿真的时候在这个时序上只要延时一下就可以了