欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

17 [Protues 微控制器仿真] 基于 51 微控制器的太阳能智能谷物翻转机器人

最编程 2024-10-08 07:03:10
...
/*所有代码资源看页尾*/ #include <REGX52.H> #include<intrins.h> #include<stdio.h> #include "Delay.h" #include "LCD1602.h" #define uchar unsigned char #define uint unsigned int typedef unsigned char u8; typedef unsigned int u16; typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; sbit CS=P1^0; //51单片机引脚设置 sbit CLK=P1^1; sbit DIO=P1^2; sbit Motor1_IN1 = P3^3; //电机IN1口 sbit Motor1_IN2 = P3^4; sbit Motor1_EN = P3^2; //电机使能端1 sbit Motor2_IN1 = P3^5; //电机IN1口 sbit Motor2_IN2 = P3^6; sbit Motor2_EN = P3^7; //电机使能端2 sbit LED = P1^5; //LED灯定义 sbit key = P1^4; sbit key1 = P1^6; sbit BEEP = P1^3; sbit Tr=P3^0;//触发信号 sbit Ec=P3^1;//回响信号 uchar Recv_Buffer\[4\]; uint Voltage\[\]={'0','0','0','0'}; bit bdata IIC_ERROR; unsigned char count; unsigned int distance; static uint temp; uint temp; static unsigned char num; static int flag = 0, flag1 = 0; unsigned int Read_value(void);//读值函数 void Delay10us(void);//10us延时函数 void Time0_Init() //定时器初始化 { TMOD = 0x01; TH0 = 0x00; TL0 = 0x00; TR0 = 0;//先关闭定时器0 } void Time0_Int() interrupt 1 //中断程序 { TH0 = 0xfe; //重新赋值 TL0 = 0x33; } uchar get\_AD\_Res() //ADC0832启动读取函数 { uchar i, data1=0, data2=0; CS=0; CLK=0;DIO=1;\_nop\_(); CLK=1;\_nop\_(); CLK=0;DIO=1;\_nop\_(); CLK=1;\_nop\_(); CLK=0;DIO=0;\_nop\_(); CLK=1;\_nop\_(); CLK=0;DIO=1;\_nop\_(); for(i=0; i<8; i++) { CLK=1;\_nop\_(); CLK=0;\_nop\_(); data1=(data1<<1)|(uchar)DIO; } for(i=0; i<8; i++) { data2=data2|(uchar)DIO<<i; CLK=1;\_nop\_(); CLK=0;\_nop\_(); } CS=1; return(data1 == data2)?data1:0; } unsigned int Read_value() { uint result; Tr=1;//触发引脚发出11us的触发信号(至少10us) Delay10us(); Tr=0; while(!Ec);//度过回响信号的低电平 TR0=1;//开启定时器0 while(Ec);//度过回响信号高电平 TR0=0;//关闭定时器0 result=((TH0\*256+TL0)\*0.034)/2; // 距离cm=(时间us * 速度cm/us)/2 return result + 2; //+2修正补偿 } void main() //主函数 { uchar u; Tr=0; //出发引脚首先拉低 LCD_Init(); //显示屏初始化 LCD_ShowString(1,1,"Distance:"); //显示字符串Distance LCD_ShowString(2,1,"GZQD:"); //显示字符串GZQD 光照强度 Time0_Init(); //定时初始化 Motor2_EN = 1; //顺时针 Motor2_IN1 = 1; Motor2_IN2 = 0; LED = 0; BEEP = 0; while(1) { u=get\_AD\_Res(); //读取光照强度 distance = Read_value();//读值 distance-=1; LCD_ShowNum(1,10,distance,3); //显示距离 LCD_ShowNum(2,6,u,3); //显示光照强度 if( (distance>=50) && (distance<= 100)) { Motor2_EN = 1; //逆时针 Motor2_IN1 = 0; Motor2_IN2 = 1; LED = 0; //LED灯熄灭 BEEP = 0; //蜂鸣器关掉 } else if(distance < 50) //超声波距离判断 { LED = 1; //LED灯亮起 BEEP = 1; //蜂鸣器响起 } else if(distance > 100) { Motor2_EN = 1; //顺时针 Motor2_IN1 = 1; Motor2_IN2 = 0; } if(u > 80) //光照强度判断 { flag = 1; } else { flag = 0; } if(key == 0) { Delay(100); //消除抖动 if(key == 0) { flag1 = 1; } } if(key1 == 0) { Delay(100);//消除抖动 if(key1 == 0) { flag1 = 0; } } if(flag == 1) { Motor1_EN = 1; //电机端使能 Motor1_IN1 = 1; //给IN1口赋值高电平 Motor1_IN2 = 0; //给IN2口赋值低电平,形成顺时针转动 } else if(flag1 == 1) { Motor1_EN = 1; //电机端使能 Motor1_IN1 = 1; //给IN1口赋值高电平 Motor1_IN2 = 0; //给IN2口赋值低电平,形成顺时针转动 } else { Motor1_EN = 0; Motor1_IN1 = 0; Motor1_IN2 = 0; } } } void Delay10us() { TL0=0xF5; TH0=0xFF; TR0=1; while (TF0==0); TR0=0; TF0=0; }