|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
-
-
- }
复制代码
|
|