• 大小: 30KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-12
  • 语言: 其他
  • 标签: 智能小车  寻光  

资源简介

这个利用硬件测试和模拟仿真测试都可以,只要根据我在文件中的说明进行改动就可以了;硬件测试的时候我用的是6个传感器,就对6路模拟量都进行了转换。

资源截图

代码片段和文件信息

/*模拟仿真的ADC0809连接的是P2口,输出连接的是P3口

  实际测试的时候ADC0809连接的是P1口,输出是P3,注意要在下载程序之后再将ADC0809 的输出与P3口连接,不然会不能下载程序。
  存在的问题是: 电机转速出现问题,断断续续的转动,似乎是电流不够的原因

*/
#include
#include
#define uc unsigned char
#define ui unsigned int

/*实际硬件测试使用*/
uc code table_motor[] = {0x400x600x200x080x180x10};//方向左转弯 直线 右转弯  后左转 后退  后右转
uc code table_port[] = {0x0f0x1f0x2f0x3f0x4f0x5f};//这里是选择通道0 1 2 3 4 5      // (P1口)低四位设置 0809的几个标志位 (OE、EOC、Start(ALE)、CLK) 

/*模拟仿真显示使用*/
uc code table0[] = {0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f0x770x7c0x390x5e0x790x71}; //共阴极数码管段定义
uc code table2[] = {0xf30x600xb50xf40x660xd60x7d0x700xf70xf60x770xc70x930xe50x970x17};
uc code table1[] = {0xfe0xfd0xfb0xf7};  //数码管位选*/


/*ADC0809相关引脚位定义           占用 7 + 8 + 2 (传感器电源输入)+ 2(电源)个引脚*/ 
sbit OE = P1^0;
sbit EOC = P1^1;
sbit ST = P1^2;
sbit CLK = P1^3;
sbit A = P1^4;
sbit B2 = P1^5;
sbit C = P1^6;
//A P2^4 B:  P2^5   C:  P2^6


/*电机模块占用引脚位定义          占用  6个引脚*/
sbit SCK = P2^0;  //4脚   移位寄存器时钟
sbit RCK = P2^2;  //12脚  锁存时钟  //11脚  电机 1 的使能端 
sbit SI = P2^1;      //8脚   数据输入   
sbit EN = P2^5;     //7使能端
sbit PW1 = P2^4;     //电机1激活 11 
sbit PW2 = P2^6;     //电机2激活 3

/*模拟测试数字信号输出 利用74hc595扩展引脚*/
sbit SCK2 = P1^3;
sbit RCK2 = P1^5;
sbit SI2 = P1^7;

uc result[6] = {0};  //存储6路转换的结果
uc max = 1; //记录最大的转换结果的下标默认前进方向 


void display(uc );
void Followlight(); 


/*延时函数*/ 
void delay(int ms)
{
uc i;
while(ms--)
{
for(i = 0;i < 110;i++)
;
}





/*找到最大转换结果的下标*/
void find_max()
{
uc i;
for(i = 0;i < 6;i++)
{
if(result[max] < result[i])
max = i;
}
}



/*转换实现   转换时间128us*/
void ADC0809_alter(uc i)
{
switch(i)
{
case 0:
P1 = table_port[0];
break;
case 1:
P1 = table_port[1];
break;
case 2:
P1 = table_port[2];
break;
case 3:
P1 = table_port[3];
break;
case 4:
P1 = table_port[4];
break;
case 5:
P1 = table_port[5];
break;
}
ST = 0;
ST = 1;
ST = 0; //启动转换  
while( EOC == 0); //等待转换结束
OE = 1;//允许输出
result[i] = P3;
OE = 0;//关闭输出

ST = 1; //这里产生一个下降沿 清除寄存器 



/*75hc595串行传输数据*/
void sendaction(uc d)
{
/*数据串行输入*/ 
int i = 0;
for(i = 0;i < 8;i++) 
{
if(d&0x01)
SI = 1;
else
SI = 0;
d = d>>1;
SCK = 0;
_nop_();
_nop_();
SCK = 1;
}

/*锁存数据*/
    EN = 0;//开启输出使能端
RCK = 0;
_nop_();
_nop_();
RCK = 1; 
delay(100);
EN = 1;//关闭输出使能端

return;
}

//这里电机根据  max 控制小车转向 
void motor_action(uc direct)
{
switch(direct)
{
case 0:
sendaction(table_motor[0]);//正左转
break;
case 1:
sendaction(table_motor[1]);//前进
break;
case 2:
sendaction(table_motor[2]);//正右转
break;
case 3:
sendaction(table_motor[3]);//后左转
break;
case 4:
sendaction(table_motor[4]);//后退
break;
case 5:
sendaction(table_motor[5]);//后右转
break; 
}

return ;
}

 //这

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2015-05-10 14:52  ADC0809andmotor\
     文件        5112  2015-05-10 14:38  ADC0809andmotor\ADC_motorcontrol.c
     文件      152349  2015-05-08 17:44  ADC0809andmotor\motortest1.dsn

评论

共有 条评论