这是我做的一个追踪系统
包含两部分测量显示部分和电机驱动部分
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
用proteus画的仿真原理图,还有仿真结果。
八位开关模拟八位二进制编码盘角度精度360/2^8=1.40625度
显示电路选用数码管动态扫描显示,显示角度-180~+180度
000000000000000000000000000000000
电机驱动用于接收单片机正负旋转信号,驱动电机正反转
单片机源程序如下:
- #include "reg51.h"
- sbit M1=P2^6;
- sbit M2=P2^7;
- sbit P20=P2^0;
- sbit P21=P2^1;
- sbit P22=P2^2;
- sbit P23=P2^3;
- sbit P24=P2^4;
- unsigned int table[10]={
- 0xC0, //"0"
- 0xF9, //"1"
- 0xA4, //"2"
- 0xB0, //"3"
- 0x99, //"4"
- 0x92, //"5"
- 0x82, //"6"
- 0xF8, //"7"
- 0x80, //"8"
- 0x90, //"9"
- };
- float Angle,jiaodu;
- void Sys_Init() //端口初始电平
- {
- P0=0XFF;
- P1=0XFF;
- P2=0Xe0;
- }
- float Read_Data() //从P1口读四位二进制码,转化为角度值
- {
- unsigned int y=0;
- float x=0.0;
- y=0XFF^P1;
- x=y*1.4;
- return x;
- }
- void Delay10ms() //延时函数
- {
- unsigned char i, j;
- i = 20;
- j = 113;
- do
- {
- while (--j);
- } while (--i);
- }
- void Display() //显示函数
- {
- unsigned int i;
- unsigned B,C,D,E;
- // A=Angle/1000; //千位
- if(jiaodu>180)
- Angle=360.0-jiaodu;
- else Angle=jiaodu;
- B=(((int)Angle)%1000)/100; //百位
- C=((int)Angle)%100/10; //十位
- D=((int)Angle)%10; //个位
- E=((int)(jiaodu*10))%10; //十分位
- for(i=0;i<5;i++)
- {
- switch(i)
- {
- case 0:
- P20=1; //位选端打开
- if(jiaodu>180)
- P0=0xBF; //向P0口输数据
- else P0=0xC0;
- Delay10ms(); //延时
- P20=0; //位选端关闭
- break;
- case 1:
- P21=1;
- P0=table[B];
- Delay10ms();
- P21=0;
- break;
- case 2:
- P22=1;
- P0=table[C];
- Delay10ms();
- P22=0;
- break;
- case 3:
- P23=1;
- P0=table[D];
- Delay10ms();
- P23=0;
- break;
- case 4:
- P24=1;
- P0=table[E];
- Delay10ms();
- P24=0;
- break;
- default:
- break;
- }
- }
- }
- void Motor_Ctrl() //步进电机脉冲
- {
- if(jiaodu<=180) //角度小于180度P26输出一个脉冲
- {
- M1=0;
- M2=1;
- Delay10ms();
- M1=1;
- }
- else if(jiaodu>180) //角度大于180度P27输出脉冲
- {
- M1=1;
- M2=0;
- Delay10ms();
- M2=1;
- }
- else
- {
- M1=1;
- M2=1;
- }
- }
- void main() //主函数
- {
- Sys_Init();
- while(1)
- {
- jiaodu=Read_Data();
- Motor_Ctrl();
- Display();
- }
- }
复制代码
全部资料51hei下载地址:
课程设计.zip
(30.2 KB, 下载次数: 96)
|