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

📄 main._c

📁 跷跷板小车
💻 _C
📖 第 1 页 / 共 2 页
字号:
//ICC-AVR application builder : 2007-10-5 12:36:44
// Target : M8515
// Crystal: 8.0000Mhz

//头文件
#include <iom8515v.h>
#include <macros.h>


//定义转意字符
#define lcd_data_port PORTA
#define lcd_data_ddr DDRA
#define lcd_busy_pin PINA
#define lcd_busy_ddr DDRA
#define lcd_control_port PORTC
#define lcd_control_ddr DDRC
#define lcd_RS 0x01 
#define lcd_RW 0x02 
#define lcd_EN 0x04 
#define busy 0x80   



/*==================================函数声明==================================*/
//所有设备初始化
void init_devices(void);

//IO口相关
void port_init(void);

//LCD相关
void lcd_init(void);
void lcd_write_command(unsigned char command,unsigned char wait_en);//写命令
void lcd_write_data(unsigned char char_data);//写数据
void wait_enable(void);//判忙
void display_a_char(unsigned char position,unsigned char char_data);//指定位置显示一个字符
void display_a_string(unsigned char position,unsigned char *ptr);
void display_a_number(unsigned char position,int i);
int nten(unsigned char n);

//键盘相关
void scankeyonce(void);
unsigned char key_scanonce(void);
int scannum(void);
unsigned char bitchg(unsigned char bit);

//电机相关
void wgm_init(void);
void motorl(int spdl);
void motorr(int spdr);
void motor(unsigned char x,int spd);
void stop(void);
void goline(int speed,unsigned int time);

//时间相关
void delay_ns(unsigned int n);
void delay_nms(unsigned int n);
void delay_1ms(void);
void delay_nus(int n);

//中断相关
void time_init(void);
void Timer0(void);

//警报相关
void alarmstart(void);
void alarmstop(void);

//全局变量
void main1(void);
void main2(void);
void main3(void);
void main4(void);
unsigned char str0[]="Input the car speed ";
unsigned char str1[]="Input the time(ms) !";
unsigned char str2[]="00:00:00";
unsigned char str3[]="                    ";
unsigned char str4[]="B to A:";
unsigned char str5[]=" Choose the program ";
unsigned char str6[]=" Input back times ! ";
unsigned char str7[]="A to B:";
unsigned char keycode,keyflag=0,num=0,minute=0,second=0;

/*====================================主函数==================================*/
void main(void)
{
 unsigned int i;
 init_devices();
 while(1)
  {
   lcd_init();
   display_a_string(0,str5);
   i=scannum(); 
   switch(i)
    {
     case 1:lcd_init();display_a_string(20,str3);main1();break;
     case 2:lcd_init();display_a_string(20,str3);main2();break;
     case 3:lcd_init();display_a_string(20,str3);main3();break;
     case 4:lcd_init();display_a_string(20,str3);main4();break;
    }
  }
}
/*=====================================程序一=================================*/
void main1(void)
{int speed;
 unsigned char minute0,second0,minute1,second1,minute2,second2;
 display_a_string(0,str0);
 speed=scannum();
 delay_ns(1);
 minute0=minute;
 second0=second;
 goline(speed,1);
 second1=second-second0;
 minute1=minute-minute0;
 motor(1,-35);
 motor(2,-35); 
 display_a_string(40,str7);
 display_a_char(47,'0');
 display_a_number(48,minute1);
 display_a_char(49,':');
 if(second1<10)
  {display_a_char(50,'0');
   display_a_number(51,second1);}
 else display_a_number(52,second1);
 delay_ns(5);
 minute0=minute;
 second0=second;
 goline(speed*(-1),1);
 motor(1,35);
 motor(2,35);
 second2=second-second0;
 minute2=minute-minute0;
 display_a_string(60,str4); 
 display_a_char(67,'0');
 display_a_number(68,minute2);
 display_a_char(69,':');
 if(second2<10)
  {display_a_char(70,'0');
   display_a_number(71,second2);}
 else display_a_number(70,second2); 
 delay_ns(5);
 stop();
 delay_ns(15);
 stop();
 } 
 
/*====================================程序二==================================*/
void main2(void)
 {
   unsigned char i='0',topflag=0x00;
   int lspeed=0;
   PORTD|=0x01;//平衡杆信号输入口
   DDRD&=0xfe;
   display_a_string(0,str0);
   lspeed=scannum();
   goline(100,5000);
   topflag=0x01&PIND;
   alarmstart();
   while(1)
   {
    topflag=0x01&PIND;
    if(topflag==0x01)//前进
     {goline(lspeed,130);delay_nms(1500);}
    else if(topflag==0x00)//后退
     {goline(lspeed*(-1),150);delay_nms(1500);}
    else stop();   
   }
   alarmstop();
   display_a_char(50,i+0x30);
   delay_ns(20);
   stop();
   
 }
/*=====================================程序三=================================*/
void main3(void)
{
 unsigned char i;
 int speed3;
 display_a_string(0,str0);
 speed3=scannum();
 lcd_init();
 display_a_string(0,str6);
 i=scannum();
 delay_ns(1);
 goline(95,1);
 motor(1,-35);
 motor(2,-35);
 delay_ns(3); 
 for(;i>0;i--)
 {
  goline(speed3*(-1),60);
  delay_ns(1);
 }
 alarmstart();
 delay_ns(10);
 alarmstop();
 }
 
/*=====================================程序四=================================*/
 void main4(void)
 {int speed;
  display_a_string(0,str0);
  speed=scannum();
  delay_ns(1);
  goline(speed,1);
  alarmstart();
  delay_ns(10);
  alarmstop();
 }
 
/*===================================测试程序=================================*/
//void test(void)
 //{
 // ;
// }
/*=================================直流电机函数===============================*/
void wgm_init(void)
 {TCCR1A=0xa3;
  TCCR1B=0x02;
  DDRD|=0x20;
  DDRE|=0x04; 
  }
void motor(unsigned char x,int spd)
 {
  if(x==1)
   {if(spd>=0)
     {DDRD|=0x40;PORTD&=0xbf;}
    else
     {DDRD|=0x40;PORTD|=0x40;spd=-spd;}
    spd=10*spd+23*spd/100;
    OCR1AH=spd>>8;
    OCR1AL=0x00ff&spd;}
  if(x==2)
   {if(spd>=0)
     {DDRD|=0x80;PORTD&=0x7f;}
    else
     {DDRD|=0x80;PORTD|=0x80;spd=-spd;}
    spd=10*spd+23*spd/100;
    OCR1BH=spd>>8;
    OCR1BL=0x00ff&spd;}
 }
void stop(void)
 {motor(1,0);
  motor(2,0);}
  
void goline(int speed,unsigned int time)
 {
  unsigned char bottomflag,i=0;
  if(speed>=0)
   {PORTC|=0xf8;DDRC&=0x07;bottomflag=0xf8&PINC;}
  else
   {PORTB|=0xf8;DDRB&=0x07;bottomflag=0xf8&PINB;}
  bottomflag=0x20;
  for(;time>0;time-=10)
   {if(time==1)time+=10;
    switch(bottomflag)
     {
      case 0x80:motor(1,speed/5);motor(2,speed);delay_nms(10);break;//10000 
      case 0xc0:motor(1,speed/5);motor(2,speed);delay_nms(10);break;//11000
      case 0x40:motor(1,speed/5);motor(2,speed);delay_nms(10);break;//01000
      case 0x60:motor(1,speed/4);motor(2,speed);delay_nms(10);break;//01100
      case 0x20:motor(1,speed);motor(2,speed);delay_nms(10);break;//00100
      case 0x30:motor(1,speed);motor(2,speed/4);delay_nms(10);break;//00110
      case 0x10:motor(1,speed);motor(2,speed/5);delay_nms(10);break;//00010
      case 0x18:motor(1,speed);motor(2,speed/5);delay_nms(10);break;//00011
      case 0x08:motor(1,speed);motor(2,speed/5);delay_nms(10);break;//00001
      default:break;
      }
    if(speed>=0)
     {PORTC|=0xf8;DDRC&=0x07;bottomflag=0xf8&PINC;}
    else
     {PORTB|=0xf8;DDRB&=0x07;bottomflag=0xf8&PINB;}
    if(bottomflag==0x00)
     {if(i<=8)
       {motor(1,speed);motor(2,speed);delay_nms(10);i++;}
      else break;
      }
     }
  stop();
 }

/*===================================声控函数=================================*/
void mic(void)
{
 DDRE&=0xfd;
 PORTE|=0x02;
 while((PINC&0x04)==0);}
/*===================================报警函数=================================*/
void alarmstart(void)
 {
  DDRD|=0x02;
  PORTD|=0x02;
 }
void alarmstop(void)
 {
  DDRD|=0x02;
  PORTD&=0xfd;
 }
/*===================================键盘函数=================================*/
void scankeyonce(void)//按键扫描一次函数
 { unsigned char i;
   for(i=1;i<9;i*=2)
   {DDRA=i;
    PORTA=~i;  //if(i==8)i=1;
    NOP();
    keycode=~PINA;
    if(keycode!=i)
    {delay_nms(30);
     keycode=~PINA;
     if(keycode!=i)
     {
      keycode=(bitchg((0x0f&i)))*4+bitchg(((0xf0&keycode)>>4));
      while((0xf0&PINA)!=0xf0);
      break;
      }
     }
     keycode=0xff;
    }
 }

unsigned char key_scanonce(void)
{
  unsigned char i;
  for(i=1;i<9;i*=2)
   {DDRA=i;
    PORTA=~i;  //if(i==8)i=1;
    NOP();
    keycode=~PINA;
    if(keycode!=i)
    {delay_nms(30);
     keycode=~PINA;
     if(keycode!=i)
     {
      keycode=(bitchg((0x0f&i)))*4+bitchg(((0xf0&keycode)>>4));

⌨️ 快捷键说明

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