AVR下载线的疑惑

AVR下载线的疑惑,第1张

这个问题貌似很难解释,举例,以往的老版mega8L现在为mega8A,只是在性能上得到了提升,但是功能是一模一样的。你说的USB-ISP下载和并口的ISP下载都是通过SPI方式给单片机烧录的,这个并口不是实际意义上的并口下载,而是用电脑的并口给单片机串行下载。我用AVR三四年了,其中更新不必说,但是没遇到过此类情况,我的习惯是,拿到准备下载的芯片,先读出熔丝配置,然后擦除一下,检验下芯片是否正常,正常后方可下载程序

也许你的下载线有问题,毕竟是一个传输工具嘛。你到我邮箱里要,给你一个可以兼容AT89S5X和AVR近乎全系列的下载线资料,yangfei0508@163com。另外,电路板负载大的时候或者单片机SPI口外部使用的时候,极有可能出现无法烧录

这个程序可以在网上找的。不过还是推荐你的买一个下载器,因为下载器只要10多块一个,在网上找的程序不一定能成功,也不会有人手把手的教你。再说你找到这个程序又拿什么下载到ATMEGA8当中呢?这又需要一个下载器来给ATMEGA8下载程序。所以还是去买一个的好

1602不能显示汉字 。。这是我以前写的MEGA128的哦#include<iom128vh>

#define uchar unsigned char

#define uint unsigned int

#define RS 0

#define RW 1

#define EN 2

uchar wz[]={"ssssssssss"};

uchar gd[]={"ssssssssss"};

void s_ms(uint ms)

{

for(;ms>1;ms--);

}

void busy(void)

{

uchar temp;

s_ms(500);

PORTC&=~(1<<RS); //RS=0

s_ms(500);

PORTC|=(1<<RW); //RW=1

s_ms(500);

while(temp)

{

PORTC|=(1<<EN); //EN=1

s_ms(500);

DDRA=0x00; //A口变输入

PORTA=0xff; //上拉使能

s_ms(500);

temp = PINA&0x80; //读取A口

s_ms(500);

DDRA=0xff;

PORTA=0xff; //A口变输出

s_ms(500);

PORTC&=~(1<<EN); //EN=0

s_ms(500);

}

}

void writecom(uchar com)

{

busy();

s_ms(500);

PORTC&=~(1<<RS); //RS=0

s_ms(500);

PORTC&=~(1<<RW); //RW=0

s_ms(500);

PORTC|=(1<<EN); //EN=1

s_ms(500);

PORTA = com; //输出指令

s_ms(500);

PORTC&=~(1<<EN); //EN=0

s_ms(500);

}

void WriteChar(uchar row,uchar col,uint num,uchar pBuffer)

{

uchar i,j,t;

if (row == 1) row = 0x80 + col;

else row = 0xC0 + col;

writecom(row);

PORTC|=(1<<RS);

s_ms(500);

PORTC&=~(1<<RW);

s_ms(500);

for(i=num;i!=0;i--)

{

t=pBuffer;

s_ms(500);

writedata(t);

s_ms(500);

pBuffer++;

}

}

void LcdInit(void)

{

writecom(0x38);

s_ms(1000);

writecom(0x01);

s_ms(10000);

writecom(0x02);

s_ms(1000);

writecom(0x06);

s_ms(1000);

writecom(0x0c);

s_ms(1000);

writecom(0x38);

s_ms(1000);

}

void writedata(uchar data)

{

busy();

s_ms(500);

PORTC|=(1<<RS); //RS=1

s_ms(500);

PORTC&=~(1<<RW); //RW=0

s_ms(500);

PORTC|=(1<<EN); //EN=1

s_ms(500);

PORTA = data; //输出数据

s_ms(500);

PORTC&=~(1<<EN); //EN=0

s_ms(500);

}

main()

{

DDRA=0xff;

PORTA=0xff;

DDRC=0xff;

PORTC=0xff;

LcdInit();

WriteChar(1,1,13,wz);

WriteChar(2,3,10,gd);

}

1,把串口线连接电脑和开发板(或产品)

2,打开AVR Studio,关闭自动启动的提示窗口

3,打开开发板的电源

4,点击AVR Studio菜单上的Tools,下拉菜单里的program右边显示菜单里的connect或者Auto connect都可以,

5,如果连接正常,就会显示一个设置画面如图

6,点Main设置单片机型号(第一行),点Fuses设置熔丝位(设置好后别忘了点右下角的Read键下载熔丝设置),点Program装载编译好的文件,第一行为hex文件,第二行为eep文件(没有就空着)

7,文件装载后点相应后面的Read键就可以下载文件到单片机里啦

8的程序移植16直接就可以用,初始化一样的,16只是多了PA口而已,中断你可以看看8和16的芯片手册,中断向量基本没多大区别(16比8的多2个中断向量)。编译的时候记得把头文件换成16的。还有像延时这类的函数要根据晶振频率做些调整,其他的没什么问题。

//首次使用时下载该程序后,调节实验箱最下面的W1液晶对比度调节电位器,使液晶显示最佳。

#include <reg51h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

/12864端口定义/

#define LCD_data P0 //数据口

sbit LCD_RS = P3^5; //寄存器选择输入

sbit LCD_RW = P3^6; //液晶读/写控制

sbit LCD_EN = P3^4; //液晶使能控制

sbit LCD_PSB = P3^7; //串/并方式控制

sbit wela = P2^6;

sbit dula = P2^7;

sbit beep=P2^3;

sbit dscs=P1^4;

sbit dsas=P1^5;

sbit dsrw=P1^6;

sbit dsds=P1^7;

sbit dsirq=P3^3;

bit flag1,flag_ri;

uchar count,s1num,flag,t0_num,num,mm;

char miao,shi,fen,year,month,day,week,amiao,afen,ashi;

void write_ds(uchar,uchar);

void lcd_wdat(uchar);

void set_time();

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

//uchar IRDIS[2];

//uchar IRCOM[4];

void delay0(uchar x); //x014MS

//void beep();

void lcm_word(uchar str);

void write_ds(uchar,uchar);

uchar read_ds(uchar);

void dataconv();

void lcd_pos(uchar X,uchar Y); //确定显示位置

//

/ /

/ 延时函数 /

/ /

//

void delay(int ms)

{

while(ms--)

{

uchar i;

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

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

//

/ /

/检查LCD忙状态 /

/lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 /

/ /

//

bit lcd_busy()

{

bit result;

LCD_RS = 0;

LCD_RW = 1;

LCD_EN = 1;

delayNOP();

result = (bit)(P0&0x80);

LCD_EN = 0;

return(result);

}

//

/ /

/写指令数据到LCD /

/RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /

/ /

//

void lcd_wcmd(uchar cmd)

{

while(lcd_busy());

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

_nop_();

_nop_();

P0 = cmd;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

//

/显示数字/

//

void write_sfm(uchar add,uchar date) //时,分,秒

{

uchar shi,ge;

shi=date/10;

ge=date%10;

lcd_wcmd(0x98+add);

lcd_wdat(0x30+shi);

lcd_wdat(0x30+ge);

}

void write_nyr(uchar add,uchar date) //年,月,日

{

uchar shi,ge;

shi=date/10;

ge=date%10;

lcd_wcmd(0x89+add);

lcd_wdat(0x30+shi);

lcd_wdat(0x30+ge);

}

//

/转成汉字显示/

//

void lcm_word(unsigned char str)

{

while(str!='\0')

{

//lcd_wcmd(0x9f);

lcd_wdat(str++);

}

str=0;

}

//

/星期处理/

//

void lcm_xingqi(void)

{

uchar sel;

sel=read_ds(6); //将DS12C887星期数赋给sel

lcd_wcmd(0x9f); //星期显示位置

if(sel==7)

{

lcm_word("日");

//lcd_wdat(0xc8); //星期日

//lcd_wdat(0xd5);

}

if(sel==6)

{

lcm_word("六");

//lcd_wdat(0xc1); //星期六

//lcd_wdat(0xf9);

}

if(sel==5)

{

lcm_word("五");

//lcd_wdat(0xce); //星期五

//lcd_wdat(0xc4);

}

if(sel==4)

{

lcm_word("四");

//lcd_wdat(0xcb); //星期四

//lcd_wdat(0xd5);

}

if(sel==3)

{

//lcm_word("三");

lcd_wdat(0xc8); //星期三

lcd_wdat(0xfd);

}

if(sel==2)

{

lcm_word("二");

//lcd_wdat(0xb6); //星期二

//lcd_wdat(0xfe);

}

if(sel==1)

{

lcm_word("一");

//lcd_wdat(0xd2); //星期一

// lcd_wdat(0xbb);

}

}

//

/ /

/写显示数据到LCD /

/RS=H,RW=L,E=高脉冲,D0-D7=数据。 /

/ /

//

void lcd_wdat(uchar dat)

{

while(lcd_busy());

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 0;

P0 = dat;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

//

/ /

/ LCD初始化设定 /

/ /

//

void lcd_init()

{

//uchar i;

LCD_PSB = 1; //并口方式

write_ds(0,0x20);//打开振荡器;

write_ds(0x0b,0x26);

//set_time(); //在第一次设置12C887时打开

lcd_wcmd(0x34); //扩充指令 *** 作

delay(5);

lcd_wcmd(0x30); //基本指令 *** 作

delay(5);

lcd_wcmd(0x0C); //显示开,关光标

delay(5);

lcd_wcmd(0x01); //清除LCD的显示内容

delay(5);

/lcd_wcmd(0x88);

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

lcd_wdat(dis3[i]);/

}

//

/ DS12C887时钟芯片写指令/

//

void write_ds(uchar add,uchar date)

{

dscs=0;

dsas=1;

dsds=1;

dsrw=1;

P0=add;

dsas=0;

dsrw=0;

P0=date;

dsrw=1;

dsas=1;

dscs=1;

}

//

/ DS12C887读指令/

//

uchar read_ds(uchar add)

{

uchar ds_date;

dsas=1;

dsds=1;

dsrw=1;

dscs=0;

P0=add;

dsas=0;

dsds=0;

P0=0xff;

ds_date=P0;

dsds=1;

dsas=1;

dscs=1;

return ds_date;

}

//

/向DS12c887内写数据/

//

void set_time()

{

write_ds(0,50); //秒

write_ds(1,0); //秒闹铃

write_ds(2,18); //分

write_ds(3,0); //分闹铃

write_ds(4,7); //时

write_ds(5,0); //时闹铃

write_ds(6,1); //星期

write_ds(7,11); //日

write_ds(8,10); //月

write_ds(9,10); //年

}

//

/ /

/ 主程序 /

/ /

//

main()

{

uchar i;

delay(10); //延时

wela=0;

dula=0;

lcd_init(); //初始化LCD

while(1)

{

//xs();

days();

lcd_pos(1,0); //设置显示位置为第二行的第1个字符

i = 0;

while(dis2[i] != '\0')

{

lcd_wdat(dis2[i]); //显示字符

i++;

}

//lcd_wcmd(0x89); //设置显示位置为第三行的第1个字符

year=read_ds(9);

month=read_ds(8);

day=read_ds(7);

week=read_ds(6);

shi=read_ds(4);

fen=read_ds(2);

miao=read_ds(0);

lcd_wcmd(0x88);

lcd_wdat(0x32);

lcd_wdat(0x30);

write_nyr(0,year);

lcd_wdat(0xc4);

lcd_wdat(0xea);

write_nyr(2,month);

lcd_wdat(0xd4);

lcd_wdat(0xc2);

write_nyr(4,day);

lcd_wdat(0xc8);

lcd_wdat(0xd5);

//lcd_wdat(0xc8);

//lcd_wdat(0xd5);

write_sfm(4,miao);

write_sfm(2,fen);

lcd_wdat(0x3a);

lcd_wdat(0x3a);

write_sfm(0,shi);

lcd_wdat(0x3a);

lcd_wdat(0x3a);

lcd_wcmd(0x9d);

lcd_wdat(0xd0);

lcd_wdat(0xc7);

lcd_wdat(0xc6);

lcd_wdat(0xda);

//write_sfm(7,week);

lcd_wcmd(0x9f);

lcm_xingqi();

}

}

//

/ /

/ 延时x014ms子程序 /

/ /

//

void delay0(uchar x) //x014MS

{

uchar i;

while(x--)

{

for (i = 0; i<13; i++) {}

}

}

//

/ /

/ 设定显示位置 /

/ /

//

void lcd_pos(uchar X,uchar Y)

{

uchar pos;

if (X==0)

{X=0x80;}

else if (X==1)

{X=0x90;}

else if (X==2)

{X=0x88;}

else if (X==3)

{X=0x98;}

pos = X+Y ;

lcd_wcmd(pos); //显示地址

}

以上就是关于AVR下载线的疑惑全部的内容,包括:AVR下载线的疑惑、我需要做一个USB-isp数据线给S51单片机烧写程序,这个时候就需要给ATMEGA8写(程序)固件。、ATmega8驱动1602的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9762459.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存