我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 499|回复: 6

12单片机悬浮定点源代码

[复制链接]

该用户从未签到

11

主题

48

回帖

1

积分

二级逆天

积分
1

终身成就奖特殊贡献奖

QQ
发表于 2016-6-19 15:55:51 | 显示全部楼层 |阅读模式
////////////////***********************此代码仅供参考有不对之处,欢迎您的宝贵意见!*********************/////////////////
#include "iodef.h"
#include "yejin display.h"
#include "12c5a_delay.h"

sfr CCON = 0xD8;  //PCA control register
sbit CCF0 = CCON^0;  //PCA module-0 interrupt flag
sbit CCF1 = CCON^1;  //PCA module-1 interrupt flag
sbit CR  = CCON^6;  //PCA timer run control bit
sbit CF  = CCON^7;  //PCA timer overflow flag
sfr CMOD = 0xD9;  //PCA mode register
sfr CL  = 0xE9;  //PCA base timer LOW
sfr CH  = 0xF9;  //PCA base timer HIGH
sfr CCAPM0 = 0xDA;  //PCA module-0 mode register
sfr CCAP0L = 0xEA;  //PCA module-0 capture register LOW
sfr CCAP0H = 0xFA;  //PCA module-0 capture register HIGH
sfr CCAPM1 = 0xDB;  //PCA module-1 mode register
sfr CCAP1L = 0xEB;  //PCA module-1 capture register LOW
sfr CCAP1H = 0xFB;  //PCA module-1 capture register HIGH
sfr PCAPWM0 = 0xf2;
sfr PCAPWM1 = 0xf3;

sbit echo_f = P2^1;     //向前HC-SR04的echo口
sbit trig_f = P2^0;     //向前HC-SR04的trig口
sbit shi_up = P3^4;     //
sbit ge_up = P3^5;     //
sbit shi_down = P3^6;     //
sbit start = P3^7;     //


//变量、常量定义
unsigned int  time=0;
float  PS_value=30;                       //????? 0~100
float sum =    0;
unsigned long juli,f_juli;
float set_juli=347-130;
uchar t=0;
unsigned int  t1=0;
bit flag1=0,flag2=0,start_flag=0;
bit die_flag=0,pass_flag=0,over_flag=0;
/********************************************************/
  void  StartModule_f()                  //T1中断用来启动模块
  {
      trig_f=1;                             //800MS  启动一次模块
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
        _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
        _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
        _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      trig_f=0;
  }
/*1MS为单位的延时程序*/
void delay_1msa(unsigned int x)
{
    unsigned char j;
    while(x--){
        for(j=0;j<125;j++)
            {;}
        }   
}
void set_pwm()
{
    CCON = 0;      //Initial PCA control register
                            //PCA timer stop running
                            //Clear CF flag
                            //Clear all module interrupt flag
    CL = 0;  //Reset PCA base timer
    CH = 0;
    CMOD = 0x00;  //Set PCA timer clock source as Fosc/2
                                //Disable PCA timer overflow interrupt
    CCAP0H = CCAP0L = (char)(255-0); //PWM0 port output 50% duty cycle square wave
    CCAPM0 = 0x42;  //PCA module-0 work in 8-bit PWM mode
                                    //and no PCA interrupt
    CR = 1;  //PCA timer start run
}
void main()
{
    unsigned char line1[]="Jessie";
    unsigned char line2[]="Alvin";
    unsigned int tmp=10;
        set_pwm();
    init_1602();
//    wr_pos(2,1);
//    dis_string(line2);
    TMOD=0x11;        //T1计数 T0定时 工作方式1
    TH0=0x00;//T2赋重装计数初值
    TL0=0x00;//T2赋重装计数初值
    TH1=(65536-1000)/256;//T2赋重装计数初值
    TL1=(65536-1000)%256;//T2赋重装计数初值
    EA=1;
    ET1=1;
    TR1=0;
       while (1)
    {
        if(shi_up==0)
        {
            while(shi_up==0);
            tmp=tmp+10;
            set_juli=347-tmp;
            Lcd1602_number(1, 9,tmp);       //显示数值
        }
        if(ge_up==0)
        {
            while(ge_up==0);
            tmp=tmp+1;
            set_juli=347-tmp;
            Lcd1602_number(1, 9,tmp);       //显示数值
        }
        if(shi_down==0)
        {
            while(shi_down==0);
            tmp=tmp-10;
            set_juli=347-tmp;
            Lcd1602_number(1, 9,tmp);       //显示数值
        }   
        if(start==0)
        {
            while(start==0);
            start_flag=~start_flag;
            if(start_flag==1)TR1=1;
            if(start_flag==0){TR1=0;CCAP0H = CCAP0L = (char)(255-0);}
        }                                
        if(start_flag==1)
        {
//            over_flag=0;
            StartModule_f();        //启动向前的超声波
            while(!echo_f);
            TR0=1;                        //开启T0计数   
            while(echo_f);            //当向前的超声波信号引脚echo_f为1时等待   
            TR0=0;                            //关闭T0计数     
            time=TH0*256+TL0;
//            while((!echo_f)&&(pass_flag==0))die_flag=1;   
//            die_flag=0;
//            pass_flag=0;
//            if(over_flag==0)
//            {
//                TR0=1;                        //开启T0计数   
//                while(echo_f);            //当向前的超声波信号引脚echo_f为1时等待   
//                TR0=0;                            //关闭T0计数     
//                time=TH0*256+TL0;
//            }
            
            TH0=0;
            TL0=0;
            juli=time*0.187;
   
            Lcd1602_number(1, 1,(347-juli));       //显示数值
            Lcd1602_number(2, 1,PS_value);       //显示数值
            if(PS_value>=150)    PS_value=150;
            if(PS_value<=0)    PS_value=0;
//            sum=sum+( juli-set_juli );   
//            PS_value=0.1*( juli-set_juli+300)+0.01*sum;
//            PS_value=1.5*( juli-set_juli);
//            if(PS_value>=150)    PS_value=150;
//            if(PS_value<=0)    PS_value=0;
//            f_juli=juli;
//            CCAP0H = CCAP0L = (char)(255-PS_value);
//            
//            delay_1msa(100);
        }
    }
        
}
void timer1() interrupt 3
{
    TH1=(65536-1000)/256;//T2赋重装计数初值
    TL1=(65536-1000)%256;//T2赋重装计数初值
//    if((die_flag==1))t1++;
//    if(die_flag==0)t1=0;
//    if((die_flag==1)&&(t1>1000)) {pass_flag=1;over_flag=1;t1=0;}
    if(t>=5)
    {
        t=0;
//        if(set_juli>232)set_juli=set_juli+20;
        PS_value=0.04*( juli-set_juli+500);    //0.1130-190)
        if(( juli-set_juli )>0.0)    sum=sum+0.01;  //0.002
        if(( juli-set_juli )<0.0)    sum=sum-0.01; //0.002
//        if(( juli-set_juli )>0.0)     
//        {
//            if(flag2==1)
//            {
//                flag2=0;  
//                sum=0;
//                sum=sum+0.002;//PS_value=PS_value+0.002;
//                flag1=1;
//            }
//            else sum=sum+0.002;
//        }
//        if(( juli-set_juli )<0.0)     
//        {
//            if(flag1==1)
//            {
//                flag1=0;
//                sum=0;
//                sum=sum-0.002;//PS_value=PS_value-0.0002;
//                flag2=1;
//            }
//            else sum=sum-0.002;//PS_value=PS_value-0.0002;
//        }
        PS_value=PS_value+sum;
        
//        sum=sum+( juli-set_juli )/100;   
//        PS_value=0.001*sum;
        CCAP0H = CCAP0L = (char)(255-((int)PS_value));
    }
    t++;
}
回复

使用道具 举报

该用户从未签到

0

主题

5178

回帖

2062

积分

二级逆天

积分
2062

社区居民忠实会员社区劳模特殊贡献奖最爱沙发终身成就奖优秀斑竹奖原创先锋奖

QQ
发表于 2016-6-20 08:36:37 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

3

主题

3952

回帖

4658

积分

二级逆天

积分
4658

社区居民忠实会员最爱沙发终身成就奖优秀斑竹奖

QQ
发表于 2016-6-20 08:41:48 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

11

主题

48

回帖

1

积分

二级逆天

积分
1

终身成就奖特殊贡献奖

QQ
 楼主| 发表于 2016-6-21 11:43:16 | 显示全部楼层
资料存在瑕疵,希望大家有意见提出来,我很愿意与大家分享!
回复

使用道具 举报

该用户从未签到

11

主题

48

回帖

1

积分

二级逆天

积分
1

终身成就奖特殊贡献奖

QQ
 楼主| 发表于 2016-6-22 07:40:12 | 显示全部楼层
这是我做比赛是写的一个代码,采用的PID控制,挺不错的,可以多看看!
回复

使用道具 举报

该用户从未签到

0

主题

1

回帖

0

积分

一级逆天

积分
0

终身成就奖

QQ
发表于 2016-6-22 17:22:39 | 显示全部楼层
好东西,大家一起分享
回复

使用道具 举报

该用户从未签到

11

主题

48

回帖

1

积分

二级逆天

积分
1

终身成就奖特殊贡献奖

QQ
 楼主| 发表于 2016-6-24 22:10:28 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表