最近由于要参加电子设计大赛,想拿点东西练练手,随便玩玩,花了一天时间做个帆板控制系统,虽然做的一般,但也是个经验,有兴趣的可以看看,有程序,仿真,实物图都在此,全套资料可下载参考:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
下面是一个帆板的参考论文:
单片机源程序如下:
- #include"main.h"
- uint V_0832 =0,key_value;
- uint i=0,angle_test=48,angle=48;
- uint tab[4]={0}; //定义数组,以保存设置角度值
- /***************电机相关定义**********************/
- sbit en1=P3^7; /* L298的Input 1 */
- sbit s1=P3^5; /* L298的Input 1 */
- sbit s2=P3^6; /* L298的Input 2 */
- uchar t=0; /* 中断计数器 */
- uchar m1=90; /* 电机1速度值 */
- uchar tmp1; /* 电机当前速度值 */
- /***************电机结束*********************/
- void Init_interrupt()
- {
- TMOD=0x12; /* 设定T0的工作模式为2 */
- TH0=0x9B; /* 装入定时器的初值155 0.1ms*/
- TL0=0x9B;
- TH1=(65536-155)/256;
- TL1=(65536-155)%256;
- EA=1; /* 开中断 */
- ET1=1;
- ET0=1; /* 定时器0允许中断 */
- TR0=1; /* 启动定时器0 */
- TR1=1;
- }
- void main()
- {
- Init_interrupt();
- init_1602();
- s1=1; //电机设置
- s2=0;
- while(1)
- {
- // V_0832 = (uint)(ad0832read(1,0)*1.3);
- V_0832 = (uint)(Get_AD_Result()*1.41);
- write_sfm3(1,10,V_0832);
- key_value=key16();
- if(key_value < 10) //如果输入的键值是数字键
- {
- tab[i]=key_value;
- angle_test=angle_test*10+tab[i];
- i++; //每输入一位密码,位数自增1.
- if(i == 4) //密码输入位数控制在6位
- {
- i = 0;
- angle_test=0;
- }
- }
- angle=angle_test;
- write_sfm3(2,10,angle);
-
- }
- }
- void timer0() interrupt 1 /* T0中断服务程序 0.1ms一次中断*/
- {
- if(t==0) /* 1个PWM周期完成后才会接受新数值 */
- {
- tmp1=m1;
- }
- if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */
- t++;
- if(t>=100) t=0; /* 1个PWM信号由100次中断产生 100HZ */
- }
- void timer1() interrupt 3 /* T0中断服务程序 0.1ms一次中断*/
- {
- TH1=(65536-155)/256;
- TL1=(65536-155)%256;
- if(V_0832<angle-2)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电赛测试.zip
(1.56 MB, 下载次数: 112)
|