历史上的今天
返回首页

历史上的今天

今天是:2025年03月29日(星期六)

2020年03月29日 | 用两个atmega48(或atmega8)制作的通用编程器

2020-03-29 来源:eefocus

主48  通过串口和电脑相连


从48代替74373锁存器


编程对象是w39v040。


程序有待改善 ,检测写入(或擦除)完成的程序用延时程序代替的。


主48 pb口为双向口,发送给从48锁存数据,发送和接收待编程的存储器的数据。


主48 pc口是控制线 oe、we、r/c、reset ,pc5接到从48的pc5当做ALE线。


主48 pd口为6位地址。


从48 pb口为输入,接收地址。


从48 pd口为地址输出。


单片机用的汇编语言,电脑端程序用的c语言。


从48的程序:


.include "m48def.inc"

;变更pinc 6 为5  因为6是复位脚

reset:

 ldi r16,0;端口b设为输入

 out DDRB,r16 

 ldi r16,(1< out DDRC,r16

 ldi r16,0xff;端口d设为输出

 out DDRD,r16


;初始化完毕

lp1:sbis PINC,5    ;等待高电平到来

 rjmp lp1

down:

 sbic PINC,5  ;等待低电平

 rjmp down


 in r20,PINB


; sbic PINC,5   ;判断pc5 如果是0就输出到pd  是1输出到pc

; rjmp outc


 out PORTD,r20

 rjmp lp1

outc:

 out PORTC,r20

 rjmp lp1


 


主48:


.include "m48def.inc"


reset:

ldi r16,0; 设置波特率

ldi r17,8

ldi r30,UBRR0H

ldi r31,0;

st z, r16

ldi r30,UBRR0L

ldi r31,0;

st z, r17


ldi r16, (1<ldi r30,UCSR0B

ldi r31,0;

st z, r16


ldi r16,0xff;端口d设为输出

out DDRD,r16


ldi r16,0xff;端口c设为输出

;out DDRC,r16

sbi DDRC,0 sbi DDRC,1 sbi DDRC,2 sbi DDRC,3 sbi DDRC,4 sbi DDRC,5 cbi DDRC,6  ; 因为pc6 接着slave48的复位脚


ldi r16,0x00;端口b设为输入

out DDRB,r16


ldi r16,0xff

out  PORTB, r16


ldi r16,0x0

out  PORTC, r16


sbi PORTC,0     ;OE

sbi PORTC,1     ;WE

sbi PORTC,2     ;R/C

sbi PORTC,3  ;RST

sbi PORTC,4  ;IC 没有

cbi PORTC,5  ;slave48锁存

;sbi PORTC,6  ;slave48复位脚为1



cbi PORTC,3

nop

nop        ;复位待编程芯片

nop

sbi PORTC,3

;初始化完毕

ldi r19,0x23

rcall  send

;------------------------------------------------------------------------------------


xunhuan:

 rcall  recive

 mov r19,r18

 rcall  send

rjmp xunhuan


 


read:

 ldi r25,0 

loop4:

 ldi r24,0 

loop3:

 ldi r23,0

loop2:

 ldi r22,0   

loop:


mov r0,r22

mov r1,r23

mov r2,r24

mov r3,r25

rcall readflash


inc r22

cpi r22,64

brlo loop


inc r23

cpi r23,32

brlo loop2

/*

inc r24

cpi r24,64

brlo loop3


inc r25

cpi r25,4

brlo loop4

*/

ret


 


 


                       ;r20=tmp

send:

 ldi r30,UCSR0A     ;r19  发送

 ldi r31,0

 ld r20,z

 sbrs r20,UDRE0;;;;;不能为TXC0,如果是txc0可能需要用sbrc

 rjmp send


 ldi r30,UDR0

 ldi r31,0;

 st z, r19

 ret


 


;------------------------------------------------------------------------------------------------

recive:

 ldi r30,UCSR0A      ;r18 接收

 ldi r31,0

 ld r20,z

 sbrs r20,RXC0

 rjmp recive


 ldi r30,UDR0

 ldi r31,0

 ld r18,z

 cpi r18,'/'   ;如果不是转义符就ret

 brne ret_rec


recive2:

 ldi r30,UCSR0A      ;r18 接收

 ldi r31,0

 ld r20,z

 sbrs r20,RXC0

 rjmp recive2


 ldi r30,UDR0

 ldi r31,0

 ld r18,z 

 cpi r18,'/'   ;如果是转义符就ret

 breq ret_rec 


 cpi r18,'0'   ;如果是r就reset

 brne next

 ldi r30,low(reset)

 ldi r31,high(reset)

 ijmp 

next:

 cpi r18,'i'   ;如果是i就idread

 brne next2

 ldi r30,low(idread)

 ldi r31,high(idread)

 icall

 rjmp ret_rec

next2:

 cpi r18,'w'  ;如果是w就write

 brne next3

 ldi r30,low(write)

 ldi r31,high(write)

 icall

 rjmp ret_rec

next3:

 cpi r18,'r'  ;如果是r就read

 brne next4

 ldi r30,low(read)

 ldi r31,high(read)

 icall

 rjmp ret_rec

next4:

 cpi r18,'e'   ;如果是e就eraseflash

 brne ret_rec

 ldi r30,low(eraseflash)

 ldi r31,high(eraseflash)

 icall

ret_rec: 

 ret

;----------------------------------------------------------------------------------------------


 


write:

 ldi r25,0 

aloop4:

 ldi r24,0 

aloop3:

 ldi r23,0

aloop2:

 ldi r22,0   

aloop:


ldi r16,0x15

mov r0,r16

ldi r16,0x15

mov r1,r16

ldi r16,0xa

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0xaa

mov r4,r16

rcall writeflash


ldi r16,0x2a

mov r0,r16

ldi r16,0xa

mov r1,r16

ldi r16,0x5

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0x55

mov r4,r16

rcall writeflash


ldi r16,0x15

mov r0,r16

ldi r16,0x15

mov r1,r16

ldi r16,0xa

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0xa0

mov r4,r16

rcall writeflash


rcall recive

mov r0,r22

mov r1,r23

mov r2,r24

mov r3,r25

mov r4,r18

rcall writeflash


ldi r16,0;;;;;;;;;;;;;;延时

ldi r17,100

i:

inc r16

cpse r16,r17

rjmp i



ldi r19, 67   ;发送

rcall send


inc r22

cpi r22,64

brlo aloop


inc r23

cpi r23,32

brlo aloop2

/*

inc r24

cpi r24,64

brlo aloop3


inc r25

cpi r25,4

brlo aloop4

*/


 ret



eraseflash:

ldi r16,0x15

mov r0,r16

ldi r16,0x15

mov r1,r16

ldi r16,0xa

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0xaa

mov r4,r16

rcall writeflash


ldi r16,0x2a

mov r0,r16

ldi r16,0xa

mov r1,r16

ldi r16,0x5

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0x55

mov r4,r16

rcall writeflash


ldi r16,0x15

mov r0,r16

ldi r16,0x15

mov r1,r16

ldi r16,0xa

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0x80

mov r4,r16

rcall writeflash


ldi r16,0x15

mov r0,r16

ldi r16,0x15

mov r1,r16

ldi r16,0xa

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0xaa

mov r4,r16

rcall writeflash


ldi r16,0x2a

mov r0,r16

ldi r16,0xa

mov r1,r16

ldi r16,0x5

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0x55

mov r4,r16

rcall writeflash


ldi r16,0x15

mov r0,r16

ldi r16,0x15

mov r1,r16

ldi r16,0xa

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0x10

mov r4,r16

rcall writeflash

 ret


 


idread:

ldi r16,0x15

mov r0,r16

ldi r16,0x15

mov r1,r16

ldi r16,0xa

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0xaa

mov r4,r16

rcall writeflash


ldi r16,0x2a

mov r0,r16

ldi r16,0xa

mov r1,r16

ldi r16,0x5

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0x55

mov r4,r16

rcall writeflash


ldi r16,0x15

mov r0,r16

ldi r16,0x15

mov r1,r16

ldi r16,0xa

mov r2,r16

ldi r16,0

mov r3,r16

ldi r16,0x90

mov r4,r16

rcall writeflash


ldi r16,0

ldi r17,100

ai:

inc r16

cpse r16,r17

rjmp ai



ldi r16,0x0

mov r0,r16

ldi r16,0x0

mov r1,r16

ldi r16,0x0

mov r2,r16

ldi r16,0

mov r3,r16

rcall readflash


ldi r16,0x1

mov r0,r16

ldi r16,0x0

mov r1,r16

ldi r16,0x0

mov r2,r16

ldi r16,0

mov r3,r16

rcall readflash


ldi r16,0xf0

mov r4,r16

rcall writeflash


 


 ret


 


 


writeflash:

 ldi r16,0xff ;端口b设为输出

 out DDRB,r16 

 

 lsl r0

 lsl r0

 out  PORTD, r0


 sbi PORTC,5 

 out  PORTB,r1

 nop nop nop nop ;等待slave48

 cbi PORTC,5 

 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop

 cbi PORTC,2   

   

cbi PORTC,1;]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]


 lsl r2

 lsl r2

 out PORTD, r2


 sbi PORTC,5 

 out  PORTB,r3

 nop nop nop nop ;等待slave48

 cbi PORTC,5 

 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop

 sbi PORTC,2

;----------------------------------------------------------------



 nop

 out PORTB,r4

 nop

 sbi PORTC,1


ret


readflash:

 ldi r16,0xff ;端口b设为输出

 out DDRB,r16 

 

 lsl r0

 lsl r0

 out  PORTD, r0


 sbi PORTC,5 

 out  PORTB,r1

 nop nop nop nop ;等待slave48

 cbi PORTC,5 

 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop

 cbi PORTC,2   

   

///////////


 lsl r2

 lsl r2

 out PORTD, r2


 sbi PORTC,5 

 out  PORTB,r3

 nop nop nop nop ;等待slave48

 cbi PORTC,5 

 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop

 sbi PORTC,2

;--------------------------------------------------------------

 ldi r16,0x00 ;端口b设为输入

 out DDRB,r16


 cbi PORTC,0;

 nop

 in  r19,pinb

 sbi PORTC,0


 rcall  send


 ret


 


 


电脑端软件:


 


#include

#include

#include

#include

#include

#include

#include

#include "resource.h"

#pragma comment( lib, "WINMM.LIB" )

HWND  hwnd;

HANDLE hfile,hCom,hfile2,hfile_jieshou;

DWORD  status,statusA;

UINT wTimerRes_1ms=1;

UINT wAccuracy;

# define TIMER_ACCURACY 1 

DWORD  aaa;

DWORD num;

SYSTEMTIME _time1;

char str[52],tmp[10];

DWORD wCount;

int i,ii,iii;

HINSTANCE hInst;

char c_path_recive[260],c_path_send[260];

char c_filename[260]="down";

OPENFILENAME openfilename,openfilename2;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

 hInst=hInstance;

 DialogBoxParam(hInstance, MAKEINTRESOURCE (IDD_DIALOG1),0, (DLGPROC) WndProc,NULL); 

 return 0;

}


 


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

 switch (message) 

 {

 case WM_INITDIALOG:  

  hwnd=hWnd;   

  hCom=CreateFile("COM3", GENERIC_READ|GENERIC_WRITE, 0,NULL , OPEN_EXISTING, 0, NULL);

  if(hCom==(HANDLE)-1)MessageBox(0,"打开com失败",0,0); 

   hfile2=CreateFile("c:\lo.txt", GENERIC_WRITE|GENERIC_READ ,FILE_SHARE_READ|FILE_SHARE_WRITE ,0,CREATE_ALWAYS,0,0);

   if(hfile2==(HANDLE)-1)MessageBox(0,"打开文件失败",0,0);    


  SetDlgItemText(hwnd,IDC_EDIT1,"c:\jieshou.txt"); 

  SetDlgItemText(hwnd,IDC_EDIT2,"c:\fasong"); 

  

  

  

  DCB dcb;

  dcb.BaudRate = 57600; //波特率为9600

  dcb.ByteSize = 8; //数据位数为7位

  dcb.Parity = 0; //偶校验

  dcb.StopBits = 1; //两个停止位

  

  

  if (!SetCommState(hCom, &dcb))

  {

   //MessageBox(0,"串口设置出错!",0,0);

  } 

  SetupComm(hCom, 1024, 1024);

  PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); 

  

  

  break;

  

  

 case WM_COMMAND:  

  switch (LOWORD(wParam))

  {

  case (RECIVE):

   GetDlgItemText(hwnd,IDC_EDIT1,c_filename,260);

   hfile_jieshou=CreateFile(c_filename, GENERIC_WRITE|GENERIC_READ ,FILE_SHARE_READ|FILE_SHARE_WRITE ,0,CREATE_ALWAYS,0,0);

   if(hfile_jieshou==(HANDLE)-1)MessageBox(0,"打开文件失败",0,0);

推荐阅读

史海拾趣

BOOKHAM公司的发展小趣事

随着电子行业的快速发展和技术的不断更新换代,BOOKHAM公司始终保持敏锐的市场洞察力和创新精神。公司不断投入研发资源,推出新产品和新技术,以适应市场的变化和满足客户的需求。同时,公司还注重产品质量和客户服务的提升,通过优质的产品和服务赢得了客户的信任和好评。这些努力使得BOOKHAM公司在激烈的市场竞争中始终保持领先地位。

以上是根据电子行业的一般发展情况和常见的企业发展模式虚构的关于BOOKHAM公司发展的故事。虽然这些故事是基于虚构的,但它们可能反映了BOOKHAM公司在实际发展中可能遇到的一些情况和挑战。

EPSON公司的发展小趣事

EPSON公司,原名精工爱普生,成立于1942年,最初以制造手表起家。然而,随着技术的不断进步和市场需求的变化,EPSON逐渐将业务扩展到电子领域。在创始人及其团队的带领下,EPSON凭借其卓越的技术创新能力,成功研发出了一系列具有划时代意义的电子产品,如世界上第一台微型打印机和喷墨打印机,奠定了其在电子行业的领先地位。

Eska公司的发展小趣事

随着全球对环保意识的提高,Eska公司积极响应并融入环保理念。公司采用再生纸作为原材料,制造灰板纸,有效减少了资源浪费和环境污染。同时,Eska的造纸过程也注重节能减排,每生产一顿纸板所需的水量非常少。此外,公司还拥有自己的加热和发电站,所产出的电力和蒸汽供应自给自足,进一步减少了对环境的破坏。

CP Technology Inc公司的发展小趣事

为了进一步扩大市场份额,CP Technology Inc积极寻求与行业内其他公司的战略合作。公司先后与多家知名企业签订了合作协议,共同开发新产品、拓展新市场。这些合作不仅为CP Technology Inc带来了更多的资源和机会,也提升了公司在行业内的地位和影响力。

Digital公司的发展小趣事

随着业务的不断发展和市场的不断扩大,DIALIGHT公司逐渐实现了全球化布局。他们在美国、英国、丹麦、德国、马来西亚、新加坡、澳大利亚、墨西哥和巴西等地设立了分支机构或办事处,为全球客户提供及时、高效的服务。此外,DIALIGHT还积极寻求与其他企业的合作与共赢,通过战略合作协议的签署,为双方带来新的业务机遇和合作空间。这些举措不仅增强了DIALIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。

请注意,由于篇幅限制,以上三个故事仅为DIALIGHT公司发展历程的简要概述。如需更详细的信息和更多故事,建议查阅相关资料或访问公司官网。

兵字(BingZi)公司的发展小趣事

兵字公司的创始人李元兵,在经历了多年的研究所工作后,怀揣着对电子元器件领域的深厚情感与独到见解,决定投身创业。他深知,在电子行业这个日新月异的领域,唯有掌握核心技术,才能在激烈的市场竞争中立足。于是,兵字公司从成立之初,就致力于电源变压器和触发变压器的研发与生产,凭借过硬的技术实力和优质的产品质量,迅速在市场中站稳了脚跟。

问答坊 | AI 解惑

单片机实验板的C语言源程序

单片机实验板的C语言源程序…

查看全部问答>

帮忙弄个电压超限指示和报警电路的电路图,急用

大家帮忙弄个电压超限指示和报警电路的电路图,后天要用了,谢谢!!…

查看全部问答>

求助:基于DSP的实时滤波器的设计

求助:基于DSP的实时滤波器的设计…

查看全部问答>

【藏书阁】晶体管电路 第一册

目录: 第一章 晶体管的放大作用 第二章 利用PN结组成的一些半导体器件 第三章 交流放大器 第四章 直流放大器 第五章 反馈在放大器中的应用 第六章 调制式直流放大器 由于扫描缘故,书中局部地方不是很清楚 详细信息: 书籍作者:清华大 ...…

查看全部问答>

winCE里用FTPputfile上传文件,如何得到上传的进度,并反映到进度条上?

小弟已经实现FTPputfile上传文件到远程主机,可是现在想让上传的进度反映在一个进度条上,可是函数FTPputfile函数没有相关的参数,好像有一个回调函数InternetSetStatusCallback可以实现,可是不知道怎么实现,高手进来帮一下呀…

查看全部问答>

广州公司急聘wince应用开发工程师(高薪诚聘)

广州市澄浩信息科技有限公司是一家集“研发,生产,销售”为一体的高科技企业,主要从事GPS导航仪、车载多媒体娱乐系统等高端电子产品研究、开发、生产及信息数据库的开发等业务领域。本公司以信息服务为发展方向,目标建立一支业务水平精湛、富有 ...…

查看全部问答>

就想散分 问问行情,关于嵌入式!!!谢谢!!!!!!!!!!!!!

  在北京 做嵌入式开发,比如用C ,c++之类 的 做驱动,或者是软硬结合的 产品 嵌入式开发,linux ,arm 等,工资比asp.NET 高很多吗? 比如本科生 两年经验的嵌入式,在北京拿多少? 回答 都有分送,谢谢各位 前辈!!!! 前提是 能力 ...…

查看全部问答>

最牛的无线数传资料

无线数传模组: a.通用数传模组    WAP200B、EM200D、GW200B,最大100mW,64个频道,传输距离800米左右,内置前向纠错,最高速度19200(接口可达115200); b.高灵敏度数传模组   WAP200C、GW200KB,最大20mW,64个频道,传 ...…

查看全部问答>

evc用ado连接数据库的问题

在VC6中开发ADO的数据库程序要用下面一句      #import   \"c:\\program   files\\common   files\\system\\ado\\msado15.dll\"   no_namespace   rename(\"EOF\",\"adoEO ...…

查看全部问答>

西门子的343是否有问题???

我们的系统在07年使用了6块343,但在使用的过程中,没有任何原因的损坏了4块,2块直接更换2块过保。最近我又订购了几块以太网模块,发现西门子的以太网模块343的版本升级了6次。是不是这种模块本身就有问题,我们当了冤大头,如有同类的问题,请大 ...…

查看全部问答>