找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1508|回复: 3
打印 上一主题 下一主题
收起左侧

求解开放性题目

 关闭 [复制链接]
回帖奖励 400 黑币 回复本帖可获得 50 黑币奖励! 每人限 1 次
抢楼 抢楼 查看抢中楼层 本帖为抢楼帖,欢迎抢楼!  截止楼层:50  奖励楼层: 1,2,3,4,5,6,7,8,9,10 
跳转到指定楼层
楼主
ID:241873 发表于 2018-1-13 21:19 | 只看该作者 回帖奖励 |阅读模式
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P3^7;

sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;



uchar t,s,speed=50;

unsigned int temp1;




void delay(uint N)//廷迟时间为(24+N*16)us
{
  int i;
        for(i=0;i<N;i++);
}





//步进电机
void gorun(unsigned char step)

{
  switch(step)
  {
  case 0:
          P1_0 = 0;
    P1_1 = 0;
    P1_2 = 0;
    P1_3 = 0;
        break;
  case 1:
    P1_0 = 1;
    P1_1 = 0;
    P1_2 = 0;
    P1_3 = 0;
    break;
  case 2:
    P1_0 = 1;
    P1_1 = 1;
    P1_2 = 0;
    P1_3 = 0;
    break;
  case 3:
    P1_0 = 0;
    P1_1 = 1;
    P1_2 = 0;
    P1_3 = 0;
    break;
  case 4:
    P1_0 = 0;
    P1_1 = 1;
    P1_2 = 1;
    P1_3 = 0;
    break;
  case 5:  
    P1_0 = 0;
    P1_1 = 0;
    P1_2 = 1;
    P1_3 = 0;
    break;
  case 6:
    P1_0 = 0;
    P1_1 = 0;
    P1_2 = 1;
    P1_3 = 1;
    break;
  case 7:
    P1_0 = 0;
    P1_1 = 0;
    P1_2 = 0;
    P1_3 = 1;
    break;
  case 8:
    P1_0 = 1;
    P1_1 = 0;
    P1_2 = 0;
    P1_3 = 1;
        break;
  }
}




/**************************************************
DS18B20初始化
/********************************************/
void init()
{
        DQ=1;
        delay(0);
        DQ=0;
        delay(50);      //廷迟24+50*16=824us
        DQ=1;
        delay(3);       //48us
        delay(10);      //184us
        DQ=1;
}

void write(uchar date)
{
        uint i;
        for (i=0; i<8; i++)
        {
                DQ = 0;
                DQ = date & 0x01;    //最低位移出  最低位先写入 //i=0:DQ=(0101 0101 &0000 0001)=0000 0001
                delay(2);                 //56us                                                                         即将最低位1 写入,i=1        :        将0写入.......                                
                DQ=1;         
                date >>= 1;         //右移一位
        }
}

uchar read()
{
        uint i, value=0;
        DQ=1;
        _nop_();            //一个机器周期:(1/11.0952(即晶振频率))*12=1.085us
        for (i=0; i<8; i++)
        {
                value = value>>1; //15us 之内必须读完一位
                DQ = 0;           //设i=0 :value=0101 0101  >>1  得到:0010 1010
                _nop_();          // 读到的DQ=1,0010 1010|1000 0000=1010 1010
                _nop_();                       // i=1:  value=01010101
                DQ = 1;                              //读到的DQ=0,  value=01010101
                _nop_();                      //i=2:  value=0010 1010
                _nop_();  
                if (DQ)           //先读最低位
                value|=0x80;
                delay(2);         // 56us
                DQ=1;
        }
        return(value);
}


//DS18B20数据采集转换
uint  read_wen_du()
{        
        uchar HB,LB,temp;
        init();                                                                //  复位
        write(0xcc);                                  //  跳过ROM  即不必读64位序列号的ROM
        write(0x44);                                  //  启动温度转换
        init();
        write(0xcc);                                        //  跳过ROM  即不必读64位序列号的ROM
        write(0xbe);                                        //  读命令
        LB=read();                                    //  低八位 1011 1010
        HB=read();                                    //  高八位 1111 1010
        HB=HB<<4;                                                        //         1011 000
        HB+=(LB&0XF0)>>4;     //  (LB&0xF0)=1011 0000   >>4 :0000 1011  +HB :1010 1011
        temp=HB;
        return temp;                                  //  返回温度值
}

//DS18B20基本函数结束





void main()
{
          TMOD = 0x01;
    TH0 = (65536-50000)/256;
    TL0 = (65536-50000)%256;
                TR0=1;
                ET0=1;
                EA=1;


        while(1)
                {               
                        
                        temp1=read_wen_du();
                        
               
                                if(temp1>=20)
                        
                                {

                                        gorun(s);
                                        EA=1;
               
                                }
                                else
                                {
                                       
                                        s=0;
                                        t=0;
                                        EA=0;
        
                                }
                }
}

//中断服务函数
void timeint(void) interrupt 1
{
        TR0=0;
    TH0 = 254;
    TL0 = 255-speed; //调速
        
        t++;
        if(t==10)
        {
               
                        s++;
                        
                        if(s>8)
                        s=1;
                        t=0;
        }
               

        TR0=1;


}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:272269 发表于 2018-1-14 11:57 | 只看该作者
这是温度保护的四相电机程序?
20度就断电
回复

使用道具 举报

无效楼层,该帖已经被删除
地板
ID:241873 发表于 2018-1-14 15:15 | 只看该作者
jizi 发表于 2018-1-14 11:57
这是温度保护的四相电机程序?
20度就断电

是的哥们
回复

使用道具 举报

5#
ID:272269 发表于 2018-1-14 15:59 | 只看该作者
那问题是什么
看上去好像没什么问题啊
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表