马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 sky! 于 2012-7-8 10:21 编辑
avr mega16实现上位机异步串口通信..因为我最终要实现控制wifi模块.所以很多规则定义的很奇葩.....
初步实现了串口数据头的识别和显示..下一步就可以用来控制wifi模块了...
#include"new_5.h"
#include"new_lcd.h"
#include"new_uart.h"[hide]new_lcd.h
#include"new_5.h"
#define CS_0 PORTC&=~(1<<PC0)
#define CS_1 PORTC|=(1<<PC0)
#define SID_0 PORTC&=~(1<<PC1)
#define SID_1 PORTC|=(1<<PC1)
#define SCLK_0 PORTC&=~(1<<PC2)
#define SCLK_1 PORTC|=(1<<PC2)
#define PSB_0 PORTC&=~(1<<PC3)
#define PSB_1 PORTC|=(1<<PC3)
#define RESET_0 PORTC&=~(1<<PC4)
#define RESET_1 PORTC|=(1<<PC4)
void write(unsigned char start,unsigned char ddata);
void sendbyte(unsigned char bbyte);
void delaynms(unsigned int di);
void lcdinit(void);
/*******************************************/
void lcdinit(void)
{
delaynms(10);
PSB_0;
RESET_0;
delaynms(1);
RESET_1;
CS_1;
write(0,0x30);
write(0,0x0c);
write(0,0x01);
}
void write(uchar start,uchar ddata)
{
uchar start_data,Hdata,Ldata;
if(!start) start_data=0xf8;
else start_data=0xfa;
Hdata=ddata&0xf0;//取高四位
Ldata=(ddata<<4)&0xf0;//取低四位
sendbyte(start_data);//发送起始信号
delaynms(5);//延时是必须的
sendbyte(Hdata);
delaynms(1);//延时是必须的
sendbyte(Ldata);
delaynms(1);//延时是必须的
}
void sendbyte(uchar bbyte)
{
uchar i;
for(i=0;i<8;i++)
{
if(bbyte&0x80)
{
SID_1;
}
else
{
SID_0;
}
SCLK_1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
//cli
SCLK_0;
bbyte<<=1;
}
}
void delaynms(uint di)
{
uchar j;
while(di--)
{
for(j=0;j<1576;j++) //1ms基准延时程序
{
;
}
}
}
void lcdtest(void)
{
unsigned char i,j;
for(i=0;i<32;i++)
{
write(0,0x80+i);//write(0,0x80);
for(j=0;j<16;j++) write(1,0xff);
}
}
/******************************************/
new_uart.h
#include"new_5.h"
#define fosc 11059200
#define baud 115200
char _charget;
void uart_init()
{
UCSRB=0x00;
UCSRA=0x00;
UCSRC=(1<<UCSZ1)|(1<<UCSZ0);//8bit,1停止位,无奇偶校验
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRB=(1<<RXEN)|(1<<TXEN)|BIT(RXCIE);//接收使能,发送使能,接收完成中断使能
SREG|=0x80;//全局中断使能
}
void putchar(char c)
{
while(!(UCSRA&(1<<UDRE)));//检测数据存储器是否为空
UDR=c;
}
/*uchar getchar()
{
while(!(UCSRA&(1<<RXC)));//检查接收是否结束
return UDR;
}*/
void puts(char *s)
{
while(*s)
{
putchar(*s);
s++;
}
}
new_5.h
#ifndef _x_new_
#define _x_new_
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#endif[/hide]
char uart_flag;
char recv_str[50];
uchar uart_i=0;
void main()
{
PORTC=0xff;
DDRC=0xff;
lcdinit();
write(0,0x80);
uart_init();
puts("HELLO");
puts("test ok.");
while(1)
{
if(uart_flag)
{
UCSRB&=(~BIT(RXEN));
if((recv_str[0]=='O')&&(recv_str[1]=='K'))
{
}
else if((recv_str[0]=='E')&&(recv_str[1]=='R')&&(recv_str[2]=='R'))
{
write(1,'
);
putchar('
);/*test*/
recv_str[0]=0x00;
}
else
{
uchar i=0;
while(recv_str[i])
{
write(1,recv_str[i]);
putchar(recv_str[i]);/*test*/
i++;
}
}
UCSRB|=BIT(RXEN);
uart_flag=0;
}
}
}
#pragma interrupt_handler getchar:12
void getchar()
{
_charget=UDR;
if(_charget=='+')
{
uart_i=0;
}
else if(_charget==0x0d)
{
recv_str[uart_i]=0x00;
uart_flag=1;
}
else
{
recv_str[uart_i++]=_charget;
}
}
|