⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart3_step_lcd.c

📁 串行通信键控步进电机系统 mega128的 丛书上光盘里的
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#include<avr/pgmspace.h>
#include<avr/eeprom.h>
#define	SYNC	0x40
#define	PARITY_EVEN	0x30
#define	PARITY_ODD	0x30
#define	SPOP_2	0x04
#define	DATA_5	0x00
#define	DATA_6	0x02
#define	DATA_7	0x04
#define	DATA_8	0x06
#define	DATA_9	0x0c
#define	SYSTEM_CLOCK	14745600L
#define	BAUD_RATE	115200L//长整型
#define UART_RX_BUFFER_SIZE 128
#define UART_RX_BUFFER_MASK (UART_RX_BUFFER_SIZE-1)
#if(URAT_RX_BUFFER_SIZE&UART_RX_BUFFER_MASK)
#error RX buffer size is not a power of 2
#endif
#define UART_TX_BUFFER_SIZE 128
#define UART_TX_BUFFER_MASK (UART_TX_BUFFER_SIZE-1)
#if(URAT_TX_BUFFER_SIZE&URAT_TX_BUFFER_MASK)
#error TX buffer size is not a power of 2
#endif
#define TLCD_CTRL (unsigned char *)0x7000;
#define TLCD_DATA (unsigned char *)0x7001;

unsigned char *lcd_data,*lcd_control;
volatile static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
volatile static unsigned char UART_RxHead;
volatile static unsigned char UART_RxTail;
volatile static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
volatile static unsigned char UART_TxHead;
volatile static unsigned char UART_TxTail;

const unsigned char one_phase1[]={0x01,0x04,0x08,0x02};
const unsigned char one_phase2[]={0x02,0x08,0x04,0x01};
volatile unsigned char phase_pnt1=0,dir=1,speed=0,phase_pnt2=0;
void delay(unsigned int d1,unsigned int d2);
void go_step_1phase(unsigned int time);
void go_step_2phase(unsigned int time);
unsigned char array[10];
unsigned char array_time[6];

void lcd_con(void);
void initialize_text_lcd(void);
void lcd_control_wait(void);
void lcd_data_wait(void);
volatile unsigned char hour1='0',hour2='0',minute1='0',minute2='0',second1='0',second2='0';


unsigned char __attribute__((__progmem__)) prompt[]="USART_STEP_MOTOR :";
unsigned char __attribute__((__progmem__)) logo[]=
"\r\nUSART Control Step_motor\r\n\r\n<H> Help Messages\r\n";
unsigned char __attribute__((__progmem__)) M_Help[]=
"\r\nF:FORWARD  B:BACKWARD   S:GIVE_SPEED    T:TIME   Q:quit\r\n";
unsigned char __attribute__((__progmem__)) M_thank[]=
"\r\nThank you!\r\n ";
unsigned char __attribute__((__progmem__)) M_SELECT[]=
"\r\nUPSPEED(1)  OR DOWNSPEED(2)\r\n";
unsigned char __attribute__((__progmem__)) M_SELECT1[]=
"\r\nFORWARD(1)  OR BACKWARD(2)\r\n";
unsigned char __attribute__((__progmem__)) M_Forward_JIASU[]=
"\r\nForward_Upspeed:ENTER 1 OR 2 OR 3\r\n ";
unsigned char __attribute__((__progmem__)) M_Forward_JIANSU[]=
"\r\nForward_Downspeed:ENTER 1 OR 2 OR 3\r\n";
unsigned char __attribute__((__progmem__)) M_Backward_JIASU[]=
"\r\nBackward_Upspeed:ENTER 1 OR 2 OR 3\r\n";
unsigned char __attribute__((__progmem__)) M_Backward_JIANSU[]=
"\r\nBackward_Downspeed:ENTER 1 OR 2 OR 3\r\n";
unsigned char __attribute__((__progmem__)) SPEED[]=
"\r\nInput your speed:";
unsigned char __attribute__((__progmem__)) HOUR[]=
"\r\nInput Hour:";
unsigned char __attribute__((__progmem__)) MINUTE[]=
"\r\nInput Minute:";
unsigned char __attribute__((__progmem__)) SECOND[]=
"\r\nInput Second:";

void Initilize(void);
void serial_Initialize(unsigned long int baud);
unsigned char ReceiveByte(void);
void TransmitByte(unsigned char data);
void print_logo(void);
void print_prompt(void);
void print_Message(unsigned char *message);
unsigned int To_Numeric(unsigned char in_data);
void initialize_timer(void);

void Initialize(void)
{
	MCUCR|=(1<<SRE);
	EIMSK=0X01;
	EICRA=0X02;
	sei();
	
	serial_Initialize(BAUD_RATE);
}

void serial_Initialize(unsigned long int baud)
{
	unsigned short int ubrr1;
	ubrr1=((SYSTEM_CLOCK/(16L*baud))-1);
	UBRR1H=(unsigned char)(ubrr1>>8);
	UBRR1L=(unsigned char)ubrr1;
	UCSR1A=0x20;//发送缓冲器准备好进行新的数据接收
	UCSR1B=((1<<RXCIE)|(1<<RXEN)|(1<<TXEN));//中断使能
	UCSR1C=DATA_8;
	UART_RxTail=0;
	UART_RxHead=0;
	UART_TxTail=0;
	UART_TxHead=0;
}

void initialize_timer(void)
{TCNT0=0xf0;
TCCR0=0x07;
TIMSK=0x01;
sei();
}

void delay(unsigned int d1,unsigned int d2)
{unsigned int i,j;
 for(i=0;i<d1;i++)
 {for(j=0;j<d2;j++);}
}
void initialize_text_lcd(void)
{lcd_con();

*lcd_data='0';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
}

void lcd_con(void)
{lcd_control=TLCD_CTRL;
lcd_data=TLCD_DATA;

lcd_control_wait();

*lcd_control|=0x38;
lcd_control_wait();

*lcd_control|=0x02;
lcd_control_wait();

*lcd_control|=0x01;
lcd_control_wait();


*lcd_control|=0x06;
lcd_control_wait();

*lcd_control|=0x0e;
lcd_control_wait();
}


void lcd_control_wait(void)
{delay(1000,1000);
}

void lcd_data_wait(void)
{delay(1000,10);
}


void go_step_1phase(unsigned time)
 {
 PORTD=(one_phase1[phase_pnt1++]<<4);
 phase_pnt1&=0x03;
 delay(time,100);}
void go_step_2phase(unsigned time)
{
PORTD=(one_phase2[phase_pnt2++]<<4);
phase_pnt2&=0x03;
delay(time,100);
}
SIGNAL(SIG_OVERFLOW0)
{TCNT0=0xf0;
if(second2!='0') second2--;
else if((second2=='0')&&(second1!='0')){second1=To_Numeric(second1)-1+'0';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2!='0')){minute2=To_Numeric(minute2)-1+'0';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1!='0')){minute1=To_Numeric(minute1)-1+'0';minute2='9';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1=='0')&&(hour2!='0')){hour2=To_Numeric(hour2)-1+'0';minute1='5';minute2='9';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1=='0')&&(hour2=='0')&&(hour1!='0'))
        {hour2='9';minute1='5';minute2='9';second1='5';second2='9';}
else {hour1=hour2=minute1=minute2=second1=second2='0';
      while(1){go_step_1phase(speed);
	           }
	  }
lcd_control=TLCD_CTRL;
lcd_data=TLCD_DATA;

lcd_control_wait();

*lcd_control|=0x38;
lcd_control_wait();

*lcd_control|=0x02;
lcd_control_wait();

*lcd_control|=0x06;
lcd_control_wait();

*lcd_control|=0x0e;
lcd_control_wait();
*lcd_data=hour1;
lcd_data_wait();
*lcd_data=hour2;
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data=minute1;
lcd_data_wait();
*lcd_data=minute2;
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data=second1;
lcd_data_wait();
*lcd_data=second2;
lcd_data_wait();
}
void initialize_timer3(void)
{TCNT3H=0xff;
TCNT3L=0xf0;
TCCR3B=0x05;
ETIMSK=0x04;
sei();
}
SIGNAL(SIG_OVERFLOW3)
{TCNT3H=0xff;
TCNT3L=0xf0;
if(second2!='0') second2--;
else if((second2=='0')&&(second1!='0')){second1=To_Numeric(second1)-1+'0';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2!='0')){minute2=To_Numeric(minute2)-1+'0';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1!='0')){minute1=To_Numeric(minute1)-1+'0';minute2='9';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1=='0')&&(hour2!='0')){hour2=To_Numeric(hour2)-1+'0';minute1='5';minute2='9';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1=='0')&&(hour2=='0')&&(hour1!='0'))
        {hour2='9';minute1='5';minute2='9';second1='5';second2='9';}
else {  hour1=hour2=minute1=minute2=second1=second2='0';
        while(1){go_step_2phase(speed);}
	             
	  }
lcd_control=TLCD_CTRL;
lcd_data=TLCD_DATA;

lcd_control_wait();

*lcd_control|=0x38;
lcd_control_wait();

*lcd_control|=0x02;
lcd_control_wait();

*lcd_control|=0x06;
lcd_control_wait();

*lcd_control|=0x0e;
lcd_control_wait();
*lcd_data=hour1;
lcd_data_wait();
*lcd_data=hour2;
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data=minute1;
lcd_data_wait();
*lcd_data=minute2;
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data=second1;
lcd_data_wait();
*lcd_data=second2;
lcd_data_wait();
}

SIGNAL(SIG_INTERRUPT0)
{dir=0;
 }

SIGNAL(SIG_UART1_RECV)
{unsigned char data;
 unsigned char tmphead;
  data=UDR1;
tmphead=(UART_RxHead+1)&UART_RX_BUFFER_MASK;
UART_RxHead=tmphead;
if(tmphead==UART_RxTail){}
UART_RxBuf[tmphead]=data;
}

SIGNAL(SIG_UART1_DATA)
{  unsigned char tmptail;
   if(UART_TxHead!=UART_TxTail){tmptail=(UART_TxTail+1)&UART_TX_BUFFER_MASK;
                                UART_TxTail=tmptail;
                                UDR1=UART_TxBuf[tmptail];}
   else{UCSR1B&=~(1<<UDRIE);}
}
unsigned char ReceiveByte(void)
{  unsigned char tmptail;
   while(UART_RxHead==UART_RxTail);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -