用两个atmega48(或atmega8)制作的通用编程器

发布者:郑哥最新更新时间:2020-03-29 来源: eefocus关键字:atmega48  atmega8  通用编程器 手机看文章 扫描二维码
随时随地手机看文章

主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);

[1] [2]
关键字:atmega48  atmega8  通用编程器 引用地址:用两个atmega48(或atmega8)制作的通用编程器

上一篇:Atmega328P熔丝设置错误修复
下一篇:atmega48 spi编程代码

推荐阅读最新更新时间:2024-11-08 16:35

atmega8 IO驱动能力
普通51 IO口 拉电流100ua 灌电流10ma atmege8 IO口 拉电流20ma 灌电流 20ma 今天又在焊的板子上加了一个蜂鸣器,IO口直接驱动,比悲剧的51还要加个三极管驱动强多了 蜂鸣器果断很有远见的加到PWM口上去,到时可以放个音乐了
[单片机]
<font color='red'>atmega8</font> IO驱动能力
Atmega8 实现D触发锁存器的功能
/************************************************************************** 实验四(第二版):用 Atmega8 实现D触发锁存器的功能 实现目的: 1. 管脚设定为输入时,了解如何可以编程设定 上拉电阻 。 2. 如何使用软件控制取样 频率 及时间,达到一定的抗干扰目的 3. 为了让程序运行更稳定,防止跑飞,如何使用看门狗? By armok (2004-09-18) a13809260240@126.com ***********************************************************************
[单片机]
ATmega8 I/O存储器
ATmega8 的I/O 空间定义见 P 271 寄存器概述 。 ATmega8所有的I/O及外设都被放置于I/O空间。所有的I/O位置都可以通过IN 与OUT指令 来访问,在32 个通用工作寄存器和I/O 之间传输数据。 地址为0x00 - 0x1F 的I/O 寄存器 还可用SBI 和CBI 指令直接进行位寻址,而SBIS 和SBIC 则用来检查某一位的值。更多 内容请参见指令集。使用IN 和OUT指令时地址必须在 0x00 - 0x3F之间。如果要象SRAM 一样通过LD 和ST 指令访问I/O 寄存器,相应的地址要加上0x20。 为了与后续产品兼容,保留未用的未应写 0 ,而保留的I/O 寄存器则不应进行写操作。
[单片机]
atmega48的低功耗设计方案
本文主要介绍了atmega48 单片机 的特性,提出了其低功耗设计的一般方法,并以定时控制系统的设计为例,具体说明atmega48的低功耗设计方案。 随着微电子技术和计算机技术的发展,尤其是微机在各个领域的普遍应用,功耗、成本、体积以及可靠性等指标均成为设计者所关注的重要问题。尤其是在由电池供电的设备中,如何降低设备功耗成为设计的首要任务。本文中以atmel公司的atmega48单片机为例,介绍了单片机低功耗设计的一般方法。 atmega48单片机 低功耗系统设计首要是选择合适的单片机。atmega48单片机是一款8位微控制器,具有高性能、低功耗的显著特点。由于采用risc精简指令集结构,其指令集大多为单周期指
[单片机]
<font color='red'>atmega48</font>的低功耗设计方案
ATmega48 通用寄存器
寄存器文件针对AVR增强型RISC指令集做了优化。为了获得需要的性能和灵活性,寄存器文件支持以下的输入/ 输出方案: ·输出一个 8 位操作数,输入一个 8 位结果 ·输出两个 8 位操作数,输入一个 8 位结果 ·输出两个 8 位操作数,输入一个 16 位结果 ·输出一个 16 位操作数,输入一个 16 位结果 Figure 4 为CPU 32 个通用工作寄存器的结构。 (点击图片放大) Figure 4. AVR CPU 通用工作寄存器 大多数操作寄存器文件的指令都可以直接访问所有的寄存器,而且多数这样的指令的执行时间为单个时钟周期。 如Figure 4 所示,每个寄存器都有一个数据内存地址,将他们直接映射到用户数据空
[单片机]
<font color='red'>ATmega48</font> <font color='red'>通用</font>寄存器
利用I2C总线实现ATmega88的在应用编程
引言 随着嵌入式系统技术的发展,电可擦除的Flash存储器由于具有容量大、成本低、编程方便等优点,在微控制器领域得到了广泛的应用Flash微控制器在正常运行前必须将Flash写入用户应用程序,目前对微控制器的Flash程序存储器进行编程的方法主要有出厂固化、编程器编程、在系统编程(In System Programming,ISP)和在应用编程(In Application programming,IAP)4种。 其中,出厂固化和编程器编程方法都要求微控制器在焊接前将程序写入,这显然不满足开发阶段的调试和日后升级的需要。目前比较普及的是在板可编程的ISP和IAP方法。ISP是通过微控制器的串行编程写入应用程序,需要少量的外
[单片机]
利用I2C总线实现<font color='red'>ATmega8</font>8的在应用编程
ATmega8单片机与时钟器件DS3231的接口设计
介绍了美国Dallas公司推出的低功耗时钟器件DS3231的结构和工作原理,DS3231能对年、月、日、时、分、秒计时,且具有温度补偿、闰年补偿等多种功能。给出了AVR单片机ATmega8与DS3231的软、硬件接口设计。 由单片机构成的测控系统或智能显示屏经常需要用到实时日历或时钟信号。为节省CPU资源,本文节绍了串行时钟器件DS3231的应用及其与AVR单片机ATmega8的接口,该系统具有抗干扰能力强,计时准确且不随季节变化产生误差的特点。 如图1所示,DS3231的主要组成部分有8个模块,划分为4个功能组:TCXO、电源控制、按钮复位和RTC。 DS3231是低成本、高精度I2C实时时钟(RTC)器件,具有集成
[单片机]
<font color='red'>ATmega8</font>单片机与时钟器件DS3231的接口设计
基于ATMEGA8的高精度超声波测距仪设计
由于超声波指向性强,能量消耗缓慢,在介质中的传播距离较远,因而超声波经常用于距离测量,如测距仪和物位测量仪等都可以用超声波来实现。利用超声波检测较为迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求。因而超声波测距,多应用于汽车倒车雷达、机器人定位、建筑工地以及一些工业现场的位置监控,如液位、井深的测量等场合。目前,石油石化行业对油库和水箱液面的精确测量和控制的要求越来越高,基于以上需要,以ATMEGA8为控制核心,利用专用时间数字转换芯片TDC—GP21为测量环节,设计了一种高精度的小型化超声波测距系统,并介绍了系统的硬件和软件设计方法。 1 超声波测距基本原理 超声波测量技术是基于蝙蝠等无目
[单片机]
基于<font color='red'>ATMEGA8</font>的高精度超声波测距仪设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved