往AVR ATmega8单片机里下载程序,可以采用串口下载吗

往AVR ATmega8单片机里下载程序,可以采用串口下载吗,第1张

可以早洞啊,MEGA8是支持SPI串口下载程序的,就是我们通常所说的ISP下载,这陆键枯也是MEGA8最亮芦常用的编程方式,这样的编程电缆很常见,软件方面双龙公司的AVR下载软件比较有名。

e <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit LCD_RS = P2^0

sbit LCD_RW = P2^1

sbit LCD_EN = P2^2

#define delayNOP()

uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,

0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 }

uchar temp,buf,m,count

bit playflag=0

uchar code cdis1[ ] =

uchar code cdis2[ ] =

/**********************************************************

延时子程序

**********************************************************/

void delay1(uint ms)

{

uchar k

while(ms--)

{

for(k = 0k <120k++)

}

}

/******************************************************************/

/**/

/*检查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

}

/*******************************************************************/

/* */

/*写显示数据到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()

{

delay1(15)

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

lcd_wcmd(0x38) //16*2显示,5*7点阵,8位数据

delay1(5)

lcd_wcmd(0x38)

delay1(5)

lcd_wcmd(0x38)

delay1(5)

lcd_wcmd(0x0c) //开显示,显示光标,光标闪烁

delay1(5)

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

delay1(5)

}

/*******************************************************************/

/* */

/* 设定显示位置 */

/* */

/*******************************************************************/

void lcd_pos(uchar pos)

{

lcd_wcmd(pos | 0x80) //数据指针=80+地址变量

}

/*********************************************************

发送数据函数

*********************************************************/

void senddata(uchar dat)

{

SBUF =dat

while(!TI)

TI = 0

}

/*********************************************************

串行中断服务函数

*********************************************************/

void serial() interrupt 4

{

ES = 0 //关闭串行中断

RI = 0 //清除串行接受标志位

buf = SBUF //从串口缓冲区取得数据

playflag=1

switch(buf)

{

case 0x31: senddata('W')break //接受到1,发送字符'W'给计算机

case 0x32: senddata('I')break //接受到2,发送字符'I'给计算机

case 0x33: senddata('L')break //接受到3,发送字符'L'给计算机

case 0x34: senddata('L')break //接受到4,发送字符'L'给计算机

case 0x35: senddata('A')break //接受到5,发送字符'A'给计算机

case 0x36: senddata('R')break //接受到5,发送字符'R'给计算机

default:senddata(buf)break //接受到其它数据,将其发送给计算机

}

if(buf!=0x0D)

{

if(buf!=0x0A)

{

temp =buf

if(count<16)

{

RXDdata[count]=temp

count++

}

}

}

ES = 1 //允许串口中断

}

/*********************************************************

数据显示函数

*********************************************************/

void play()

{

if(playflag)

{

lcd_pos(0x40) //设置位置为第二行

for(m=0m<16m++)

lcd_wdat(cdis2[m]) //清LCD1602第二行

for(m=0m<16m++)

{

lcd_pos(0x40+m) //设置显示位置为第二行

lcd_wdat(RXDdata[m]) //显示字符

}

playflag=0

count=0x00

for(m=0m<16m++)

RXDdata[m]=0x20//清显存单元

}

}

/*********************************************************

主函数

*********************************************************/

void main(void)

{

P0 = 0xff

P2 = 0xff

SCON=0x50 //设定串口工作方式

PCON=0x00 //波特率不倍增

TMOD=0x20 //定时器1工作于8位自动重载模式, 用于产生波特率

EA=1

ES = 1 //允许串口中断

TL1=0xfd

TH1=0xfd//波特率9600

TR1=1

lcd_init()

lcd_pos(0x00) //设置显示位置为第一行

for(m=0m<16m++)

lcd_wdat(cdis1[m]) //显示字符

lcd_pos(0x40) //设置显示位置为第二行

for(m=0m<16m++)

lcd_wdat(cdis2[m]) //显示字符

while(1)

{

play()

}

}

/*********************************************************/

ICC的 电脑串口发送给单片机,中断返回数据。

#include<拍昌iom8v.h>

#include<袭宴扒macros.h>

#define uchar unsigned char

#define uint unsigned int

#define BAND 9600

void init_uarst()

{

UCSRB=0x00

UCSRA=0X00

UCSRC= BIT(URSEL)|0X06

UBRRL=(11059200/BAND/16-1)%256

UBRRH=(11059200/BAND/祥桐16-1)/256

UCSRB=0x98

}

void put_char(uchar c)

{

while(!(UCSRA&(1<<UDRE)))

UDR=c

}

#pragma interrupt_handler uart:12

void uart()

{

uchar i

while(!(UCSRA&BIT(RXC)))

i=UDR

put_char(i)

}

void main()

{

init_uarst()

SREG|=0x80

while(1)

}


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

原文地址: http://outofmemory.cn/yw/12552055.html

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

发表评论

登录后才能评论

评论列表(0条)

保存