/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
� Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 2009/7/25
Author :
Company :
Comments:
Chip type : ATmega16L
Program type : Application
Clock frequency : 14.745600 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
// USART控制和状态寄存器的标志位定义
#define RXC 7 // UCSRA位定义
#define TXC 6
#define UDRE 5
#define FE 4
#define DOR 3
#define PE 2
#define U2X 1
#define MPCM 0
#define RXCIE 7 // UCSRB位定义
#define TXCIE 6
#define UDRIE 5
#define RXEN 4
#define TXEN 3
#define UCSZ2 2
#define RXB8 1
#define TXB8 0
#define URSEL 7 // UCSRC位定义
#define UMSEL 6
#define UPM1 5
#define UPM0 4
#define USBS 3
#define UCSZ1 2
#define UCSZ0 1
#define UCPOL 0
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<PE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define MOTOR_L1 PORTB.0 //电机
#define MOTOR_L2 PORTB.1
#define MOTOR_R1 PORTB.2
#define MOTOR_R2 PORTB.3
#define BW_LEFT PINA.0 //黑白线
#define BW_RIGHT PINA.1
#define BUZZER PORTA.3 //蜂鸣器
#define NULL 0x00
#define LEFT 0x01
#define RIGHT 0x02
#define BAL_START 0x03
#define BAL 0x04
#define BAL_OK 0x05
#define GET_B 0x06
#define B_OK 0x07
#define A_OK 0x08
#define MODE_B 0x09
#define MODE_P 0x0A
#define BAL_AGAIN 0x0B
#define FULL 0xFF
unsigned char tran = 5; //USART数据
bit receive_ok = 0;
bit dir = 0;
bit mode2 = 0;
unsigned char delay_dir = 0;
interrupt [USART_RXC] void usart_rx_isr(void) // USART接收中断服务
{
unsigned char status,data;
status = UCSRA;
data = UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
tran = data;
receive_ok = 1;
}
}
void USART_Transmit(unsigned char data)
{
while (!(UCSRA & DATA_REGISTER_EMPTY)); // 等待发送寄存器空
UDR = data; // 发送数据
}
void motor_direct(unsigned char direct) //电机换向
{
if(direct == 0)
{
MOTOR_L1 = 0;
MOTOR_L2 = 1;
MOTOR_R1 = 0;
MOTOR_R2 = 1;
}
if(direct == 1)
{
MOTOR_L1 = 1;
MOTOR_L2 = 0;
MOTOR_R1 = 1;
MOTOR_R2 = 0;
}
}
void motor_start(void) //电机启动
{
if(dir == 0)
{
MOTOR_L1 = 0;
MOTOR_L2 = 1;
MOTOR_R1 = 0;
MOTOR_R2 = 1;
}
if(dir == 1)
{
MOTOR_L1 = 1;
MOTOR_L2 = 0;
MOTOR_R1 = 1;
MOTOR_R2 = 0;
}
}
void motor_stop(void) //电机停止
{
MOTOR_L1 = 1;
MOTOR_L2 = 1;
MOTOR_R1 = 1;
MOTOR_R2 = 1;
}
void motor_jerk(unsigned int time ,unsigned char direct_stop)
{
motor_direct(direct_stop);
delay_ms(time);
motor_stop();
}
void buzzer_voice(void)
{
BUZZER = 1;
delay_ms(500);
BUZZER = 0;
}
void mode_pro(void)
{
unsigned char cache = 0;
bit once = 0,balance_again = 0;
//buzzer_voice();
motor_start(); //电机开启
delay_ms(500);
motor_stop();
while(1)
{
if(BW_RIGHT == 1 && BW_LEFT == 0)
{
OCR1AH=0xef;
OCR1AL=0xFF;
OCR1BH=0xaf;
OCR1BL=0xFF;
delay_ms(300);
motor_jerk(150,0);
OCR1BH=0xef;
OCR1BL=0xFF;
OCR1AH=0x00;
OCR1AL=0xFF;
delay_ms(300);
motor_jerk(200,1);
delay_dir = 1;
}
else if(BW_RIGHT == 0 && BW_LEFT == 1)
{
OCR1BH=0xef;
OCR1BL=0xFF;
OCR1AH=0xaf;
OCR1AL=0xFF;
delay_ms(300);
motor_jerk(150,0);
OCR1AH=0xef;
OCR1AL=0xFF;
OCR1BH=0x00;
OCR1BL=0xFF;
delay_ms(300);
motor_jerk(200,1);
delay_dir = 2;
}
else if(BW_RIGHT == 0 && BW_LEFT == 0)
{
OCR1AH=0xc0;
OCR1AL=0xFF;
OCR1BH=0xf0;
OCR1BL=0xFF;
motor_jerk(30,0);
}
else if(BW_RIGHT == 1 && BW_LEFT == 1)
{
/*if(delay_dir == 1)
{
OCR1AH=0xef;
OCR1AL=0xFF;
OCR1BH=0xaf;
OCR1BL=0xFF;
delay_ms(300);
motor_jerk(150,0);
OCR1BH=0xef;
OCR1BL=0xFF;
OCR1AH=0x00;
OCR1AL=0xFF;
delay_ms(300);
motor_jerk(200,1);
}
else if(delay_dir == 2)
{
OCR1BH=0xef;
OCR1BL=0xFF;
OCR1AH=0xaf;
OCR1AL=0xFF;
delay_ms(300);
motor_jerk(150,0);
OCR1AH=0xef;
OCR1AL=0xFF;
OCR1BH=0x00;
OCR1BL=0xFF;
delay_ms(300);
motor_jerk(200,1);
}*/
break;
}
delay_ms(400);
};
OCR1AH=0xef;
OCR1AL=0xFF;
OCR1BH=0xef;
OCR1BL=0xFF;
buzzer_voice();
motor_start(); //电机开启
delay_ms(1000);
motor_stop();
again:
delay_ms(1000);
USART_Transmit(BAL_START);
USART_Transmit(BAL_START);
USART_Transmit(BAL_START);
USART_Transmit(BAL_START);
USART_Transmit(BAL_START);
while (1) //找平衡
{
cache = tran;
if(receive_ok == 1 && cache == LEFT)
{
motor_jerk(30,1);
delay_ms(800);
}
else if(receive_ok == 1 && cache == RIGHT)
{
motor_jerk(30,0);
delay_ms(800);
}
else
{
motor_stop();
if(cache == BAL && once == 0)
{
buzzer_voice();
once = 1;
}
if(cache == BAL_OK)
{
buzzer_voice();
break;
}
}
}
if(balance_again == 0)
{
while(1)
{
if(tran == BAL_AGAIN)
break;
delay_ms(100);
}
balance_again = 1;
once = 0;
receive_ok = 0;
goto again;
}
motor_jerk(150,0);
while (1)
{
if(BW_LEFT == 1 && BW_RIGHT == 1)
{
USART_Transmit(GET_B);
USART_Transmit(GET_B);
USART_Transmit(GET_B);
USART_Transmit(GET_B);
USART_Transmit(GET_B);
break;
}
else
{
motor_jerk(30,0);
delay_ms(800);
}
}
while (1)
{
if(tran == B_OK)
break;
};
motor_jerk(1200,1);
while (1)
{
if(BW_LEFT == 1 && BW_RIGHT == 1)
{
motor_jerk(30,1);
delay_ms(500);
motor_jerk(30,1);
delay_ms(500);
motor_jerk(30,1);
break;
}
else
{
motor_jerk(40,1);
delay_ms(800);
}
};
USART_Transmit(A_OK);
USART_Transmit(A_OK);
USART_Transmit(A_OK);
USART_Transmit(A_OK);
USART_Transmit(A_OK);
while (1)
{
};
}
void main(void)
{
unsigned char cache = 0;
bit once = 0;
//unsigned char middle,balance,B,A;
//unsigned char time_h[10] = {0},time_m[10] = {0},time_s[10] = {0};
//unsigned char *mi
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
基于STM32的07年国赛电动车上跷跷板程序源码(仅含源代码).rar (1个子文件)
07年国赛电动车上跷跷板程序源码.c 12KB
共 1 条
- 1
资源评论
CrMylive.
- 粉丝: 1w+
- 资源: 4万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功