
这个问题貌似很难解释,举例,以往的老版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的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)