C语言单片机的引脚,向高手请教单片机atmega8的输入引脚寄存器PIN的使用

和PINC&0x01有关的代码

下边这段代码是小车在行走到墙角处两根触须交替碰墙4次时做一个180度的转弯,逃离死角,在烧片实验时,两根触须碰到墙角,小车还是前行,手动实验也是如此,问题大概还是出在  PINC&0x01  和  PINC&0x02  这两个地方,请老师指点 ,应该如何修改?

#include                    //小车的标准头文件

#include                     //串口的头文件

int PC0_state(void)                    //获取PC0的状态

{

return (PINC&0x01)?1:0;            // 判断左胡须是否遇到障碍物

}

int PC1_state(void)                    //获取PC1的状态

{

return (PINC&0x02)?1:0;             // 判断右胡须是否遇到障碍物

}

void Forward(void)                    //声明一个前进子函数

{

HIGH_PORTC3;                      //设置PC3输出高电平

delay_nus(1700);                    //延时0.0017s

LOW_PORTC3;                         //设置PC3输出低电平

HIGH_PORTC2;                      //设置PC2输出高电平

delay_nus(1300);                  //延时0.0013s

LOW_PORTC2;                         //设置PC2输出低电平

delay_nms(20);                     //延时20ms

}

void Left_Turn(void)                    //声明一个向左子函数

{

for(uint16_t i=1;i<=26;i++)         /*声明定义16位无符号整型变量i*/

{

HIGH_PORTC3;               //设置PC3输出高电平

delay_nus(1300);             //延时0.0013s

LOW_PORTC3;                //设置PC3输出低电平

HIGH_PORTC2;               //设置PC3输出高电平

delay_nus(1300);            //延时0.0013s

LOW_PORTC2;                    //设置PC2输出低电平

delay_nms(20);                 //延时20ms

}

}

void Right_Turn(void)                  //声明一个向右子函数

{

for(uint16_t i=1;i<=26;i++)          /*声明定义16位无符号整型变量i*/

{

HIGH_PORTC3;               //设置PC3输出高电平

delay_nus(1700);            //延时0.0017s

LOW_PORTC3;                 //设置PC3输出低电平

HIGH_PORTC2;                  //设置PC2输出高电平

delay_nus(1700);               //延时0.0017s

LOW_PORTC2;                     //设置PC2输出低电平

delay_nms(20);                  //延时20ms

}

}

void Backward(void)                      //声明一个向后子函数

{

for(uint16_t i=1;i<=65;i++)             /*声明定义16位无符号整型变量i*/

{

HIGH_PORTC3;                     //设置PC3输出高电平

delay_nus(1300);                  //延时0.0013s

LOW_PORTC3;                      //设置PC3输出低电平

HIGH_PORTC2;                     //设置PC2输出高电平

delay_nus(1700);                     //延时0.0017s

LOW_PORTC2;                     //设置PC2输出低电平

delay_nms(20);                      //延时20ms

}

}

int main(void)

{

usta_Init();                          //串口初始化

printf("Program Running!");             //在调试窗口显示一条信息

SET_DDRD7;                             //设置PD7为输出口

SET_DDRC3;                          //设置PC3为输出口

SET_DDRC2;                             //设置PC2为输出口

for(uint16_t counter=1;counter<=6000;counter++)           //开始/复位信号 蜂鸣器

{

HIGH_PORTD7;                             //设置PD7输出高电平

delay_nus(166);                          //延时0.00016s

LOW_PORTD7;                           //设置PD7输出低电平

delay_nus(166);                        //延时0.00016s

}

int  old2=1;                            //整型变量初始化

int  old3=0;                                   //整型变量初始化

int counter=1;                            //整型变量初始化

while(1)

if(PC0_state()!=PC1_state())                      //判断是否有一根胡须被触动

{

if((old2!=PC0_state())&&(old3!=PC1_state()))    //再次检查是否有一根胡须被触动

{

counter=counter+1;                                //胡须触动计数器加1

old2=PC0_state();                               //交换变量值

old3=PC1_state();                               //交换变量值

if(counter>4)            // 如果发现胡须连续四次被触动,那么计数值置1,并且进行"U"型拐弯

{

counter=1;                           //胡须触动计数器置1

Backward();                             //向后

Left_Turn();                             //向左

Left_Turn();                             //向左

}

}

else                                           //小车没有陷入墙角

counter=1;                                     //胡须触动计数器置1

}

if((PC0_state()==0)&&(PC1_state()==0))           //两个胡须同时检测到障碍物时,后退,再向左转180度

{

Backward();                                             //向后

Left_Turn();                                                 //向左

Left_Turn();                                              //向左

}

else if(PC0_state()==0)                              //左边胡须检测到障碍物时,后退,再向右转90度

{

Backward();                                         //向后

Right_Turn();                                      //向右

}

else if(PC1_state()==0)                              //左边胡须检测到障碍物时,后退,再向左转90度

{

Backward();                                     //向后

Left_Turn();                                       //向左

}

else                                                  //没有胡须检测到障碍物时,向前走

Forward();                                         //向前

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值