初次发帖,感谢大家。太阳能自动跟踪系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "lcd1602.h" //lcd 包含的头文件
- #include "adc0809.h" //adc0809包含的头文件
- #include "motor.h" //电机包含的头文件
- #include "key.h" //按键头文件
- int Max_Value_Gallery=0; //记录最大的通道号
- extern char Start_Convert; //按键是否按下状态标识
- int Timing=0;
- extern char Timing_Ok; //定时器计时时间到达标识
- void main()
- {
- int i=0;
- LcdInit(); //LCD的初始化函数
- ADC0809_Init(); //ADC0809的初始化函数
- //主循环函数
- while(1)
- {
- Key_Scanf(); //按键扫描函数
- Max_Value_Gallery=Data_Compare(); //通过比较找出光照最强的点
- Motor(); //电机控制函数
- i=120; //120s即2分钟
- while(i--)
- {
- Lcd1602_Delay1ms(1000);
- if(K1==0)
- break;
- }
- }
- }
复制代码- #include "motor.h"
- #include "lcd1602.h"
- extern int Max_Value_Gallery;
- void Delay_Motor(int z) //电机延时函数
- {
- while(z--);
- }
- //电机控制函数
- //max为512电机转动一周 为43转动30度 86
- void Motor()
- {
- char a;
- int Max=0; //
- LcdWriteCom(0x80+0x40+12);
- switch(Max_Value_Gallery)
- {
- case 0: //0度
- Max=0;
- LcdWriteData('0');
- LcdWriteData('0');
- LcdWriteData(' ');
- break;
- case 1: //30度
- Max=43;
- LcdWriteData('3');
- LcdWriteData('0');
- LcdWriteData(' ');
- break;
- case 2: //60度
- Max=86;
- LcdWriteData('6');
- LcdWriteData('0');
- LcdWriteData(' ');
- break;
-
- case 3: //90度
- Max=129;
- LcdWriteData('9');
- LcdWriteData('0');
- LcdWriteData(' ');
- break;
- case 4: //120度
- Max=172;
- LcdWriteData('1');
- LcdWriteData('2');
- LcdWriteData('0');
- break;
- case 5: //150度
- Max=215;
- LcdWriteData('1');
- LcdWriteData('5');
- LcdWriteData('0');
- break;
- case 6: //180度
- Max=258;
- LcdWriteData('1');
- LcdWriteData('8');
- LcdWriteData('0');
- break;
- default:
- break;
- }
- while(Max--)
- {
- for(a=0;a<4;a++)
- {
- switch(a)
- {
- case 0:
- {
- OUT1=1;
- OUT2=0;
- OUT3=0;
- OUT4=0;
- }
- break;
- case 1:
- {
- OUT1=0;
- OUT2=1;
- OUT3=0;
- OUT4=0;
- }
- break;
- case 2:
- {
- OUT1=0;
- OUT2=0;
- OUT3=1;
- OUT4=0;
- }
- break;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
51单片机太阳能跟踪系统(附仿真及程序).7z
(58.4 KB, 下载次数: 290)
|