基于51单片机太阳能电池太阳跟踪装置程序设计
2012-12-29 23:05
204 查看
#include <reg51.h> #include <intrins.h> #include <absacc.h> #define uchar unsigned char #define uint unsigned int #define ysfs 600 //宏定义 预设风速 #define shuiping 1500 //宏定义 水平位置AD转换结果 #define fuyang 1500 //宏定义 俯仰位置AD转换结果 #define PA XBYTE [0x7CFF] //8255芯片端口4个基地址宏定义 #define PB XBYTE [0x7FFD] #define PC XBYTE [0x7FFE] #define CONTROL XBYTE [0x7FFF] sbit OE=P1^0; //以下为关于AD0808与单片机的八个接口定义 sbit EOC=P1^1; sbit START=P1^2; sbit CLK=P1^3; sbit ALE=P1^4; sbit C0=P1^5; sbit C1=P1^6; sbit C2=P1^7; sbit gdkg=P2^3; //用于复位光电开关端口定义 sbit clock=P2^0; //定义水平俯仰步进电机的速度端口,频率越快,速度越快,不给频率电机不转 sbit cw1=P2^1; //定义水平步进电机的转向端口,1正转,0反转 sbit enable1=P2^2; //定义水平步进电机的使能端口,1转,0不转 sbit cw2=P2^4; //定义俯仰步进电机的转向端口,1正转,0反转 sbit enable2=P2^5; //定义俯仰步进电机的使能端口,1转,0不转 uint ad_result_fenshu,ad_result_shuiping,ad_result_fuyang; void timer_init() { TMOD=0x11; //定时器模式设置 TH0=(65536-5000)/256; TL0=(65536-5000)%6; TH1=0xFF; TL1=0x9C; ET0=1; //允许定时器0中断 TR0=1; //启动定时器0 ET1=1; //允许定时器1中断 TR1=1; //启动定时器1 EA=1; //允许总中断 } void AD_chane(int x) { if(x==0) { C0=0; C1=0; C2=0; } else if(x==1) { C0=1; C1=0; C2=0; } else if(x==2) { C0=0; C1=1; C2=0; } ALE=1; } int Get_AD_Sd() { int Sd; START=0;START=1;START=0; while(EOC==0); OE=1; Sd=P3; OE=0; return Sd; } void reset() { while(gdkg!=1) { cw2=0; enable2=1; } enable2=0; } void shuiping_tiaozheng(int date) { if(date>shuiping) { do { cw1=1; enable1=1; } while(date==shuiping); enable1=0; } else if(date<shuiping) { do { cw1=0; enable1=1; } while(date==shuiping); enable1=0; } } void fuyang_tiaozheng(int date) { if(date>fuyang) { do { cw2=1; enable2=1; } while(date==fuyang); enable2=0; } else if(date<fuyang) { do { cw2=0; enable2=1; } while(date==fuyang); enable2=0; } } void main() { CONTROL = 0x80; ALE=0; timer_init(); enable1=0; enable2=0; while(1) //进入循环 { AD_chane(0); ad_result_fenshu=Get_AD_Sd(); ALE=0; AD_chane(1); ad_result_shuiping=Get_AD_Sd(); ALE=0; AD_chane(2); ad_result_fuyang=Get_AD_Sd(); ALE=0; if(ad_result_fenshu>ysfs) //如果风速大于预设风速,则复位 { reset(); } shuiping_tiaozheng(ad_result_shuiping); fuyang_tiaozheng(ad_result_fuyang); } } void timer0() interrupt 1 { TH0=(65536-5000)/256; TL0=(65536-5000)%6; CLK=~CLK; } void timer1() interrupt 3 { static uchar i=0; TH1=0xFF; TL1=0x9C; ++i; if (i>10) i=0; if (i<=6) clock=0; else clock=1; }
相关文章推荐
- 【原创】基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- 基于GDI+计算机图形程序设计
- Java实验之基于GUI的网络通信程序设计
- 基于mini2440的qtopia程序设计之三:qtopia界面定制
- 基于面向对象操作系统开发平台(OSKit)的分析与程序设计(3)
- 基于MMX指令集的程序设计简介
- 基于 KEIL C51和 proteus的 C51汇编程序设计实例
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(1)――基本概念。
- 基于自然语言的软件工程和程序设计(上)
- 基于ARM的硬件启动程序设计-初始化堆栈
- 基于mini2440的qtopia程序设计之二:如何在qtopia创建快捷方式
- 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- COM原理及应用之基于COM的程序设计
- 基于UDP协议和GTK+用户界面的Linux Socket端到端通信程序设计 详细设计文档
- 程序设计方法(一):结构化、基于对象、面向对象、基于接口
- 专题 16 基于UDP的通信程序设计
- 都一周基于对象的程序设计——时间类(增加1)
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(2) ――任务控制
- 基于FPGA的DS18B20控制程序设计及其Verilog实现(三)
- 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结