moyouuserl 发表于 2017-1-9 10:08:50

顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Now 发表于 2017-1-14 12:25:03

世界大战 发表于 2017-2-14 12:12:37

本帖最后由 世界大战 于 2017-2-14 12:16 编辑

红外和电压表的零件还没有到,先做一个舵机测试仪解解渴。

世界大战 发表于 2017-2-14 12:18:48

世界大战 发表于 2017-2-14 12:12
红外和电压表的零件还没有到,先做一个舵机测试仪解解渴。

上视频,交作业。

xiancun010 发表于 2017-2-16 18:48:25

问下萝莉大神 我在测试时舵机一直发出嘟嘟声,但是舵机确没转动。这是为什么?#include <reg51.h>
#include <intrins.h>
#defineU16 unsigned int
#defineU8 unsigned char
//sbit servo1=P1^6;
sfr P5=0xC8;
sbit servo1=P1^5;
sbit servo3=P1^4;
U16 L;


void De_n_Delay10us(U16 delaytime);
void Delay10us();                //@12.000MHz

void main()
{

L=150;
   while(1)
   {
   servo1=1;
       De_n_Delay10us(L);
       servo1=0;
       De_n_Delay10us(1900);

       L=L+10;
       if(L>200);
       {
           L=100;
       }
       
   }

}

void Delay10us()                //@12.000MHz
{
        unsigned char i;

        _nop_();
        _nop_();
        i = 24;
        while (--i);
}
void De_n_Delay10us(U16 delaytime)
{

      while(delaytime>0)
      {
           Delay10us();
           delaytime--;
          }
}

飝飛飞 发表于 2017-3-11 23:34:35

好帖,好帖,顶一个

川师鲤鱼 发表于 2017-4-8 06:39:49

不错不错 为你顶帖 很赞

suker620 发表于 2017-5-19 10:18:55

这个是个好东西。

x2587 发表于 2017-6-13 15:54:02

开始看不懂了

davidxu 发表于 2017-6-14 14:15:56

谢谢分享,楼主辛苦了

1343520582 发表于 2017-8-10 14:20:16

技术贴

hulao888 发表于 2017-12-18 10:14:30

这样的帖子应该置顶。

07728967916 发表于 2018-1-19 23:54:10

๑•́₃•̀2伐开心6666

陈小手 发表于 2018-2-5 22:44:02

这个有点难,我得研究一下。买的东西还没到

ritass21 发表于 2018-5-22 21:13:10

顶起

爪牙非非 发表于 2018-6-18 16:19:39

#include<reg51.h>
unsigned char count; //记录0.5ms次数用的变量
sbit pwm=P3^7;

惜梦 发表于 2018-7-11 09:02:08

这个程序和源码哪里有?

coolbgo 发表于 2018-7-30 20:35:50

请教大神
为什么用定时器延时计数 定时器中断里t0++      用t0=0;while(t0<1000);延时显示数码管会闪烁用t0=0;while(t0!=1000);就不会闪烁



#include<reg51.h>

#define uchar unsigned char
#define uint unsigned int

sfr P5=0xc8;                //声明P5端口地址
sfr P2M0=0x96;                //声明P2引脚模式寄存器
sfr P3M0=0xb2;                //声明P3引脚模式寄存器

sfr AUXR=0x8e;                //声明辅助寄存器

sfr ADC_RES=0xBD;        //声明转换结果寄存器
sfr ADC_RESL=0xBE;        //声明转换结果寄存器低2位

sfr P1ASF=0x9D;    //声明P1口模拟功能寄存器 模拟功能开关
sfr ADC_CONTR=0xBC;//声明数模转换寄存器

sbit DA=P2^4;                        //数码管位选
sbit DB=P3^2;
sbit DC=P3^6;
sbit DD=P2^0;
sbit DE=P2^1;
sbit DF=P2^3;
sbit DG=P3^5;
sbit DP=P3^7;

sbit B1=P2^5;                        //数码管段选
sbit B2=P2^2;
sbit B3=P3^3;
sbit B4=P3^4;

sbit CS=P3^1;                                                //片选端,CS为低时启动串行接口
sbit SCK=P3^0;                                                //串行时钟输出到max6675
sbit SO=P5^5;                                                //串行数据输入到单片机

sbit keyx1=P2^6;                                        //定义键盘键位
sbit keyx2=P2^7;
sbit keyx3=P1^0;
sbit keyx4=P1^1;
sbit keyy1=P1^2;
sbit keyy2=P1^3;
sbit keyy3=P1^4;
sbit keyy4=P1^5;
sbit keyy5=P1^6;

sbit S1=P5^4;                                                //定义pwm信号接口

uchar count,count2,Flag_temp,Flag_key,keynow,keyold,mode,key;                                        //定义计数,热电偶就绪

uint temp,value,t0;                                        //定义温度,按键值,定时器0计数

uchar code duan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0xcf};        //定义常量数组数码管段选 code 0-15 p.
uchar code wei[]={0xf7,0xfb,0xfd,0xfe};                                                                                                                                                //数码管位选

uchar x,OP1,OP2,DOP2;        //定义运算符 + - * / = c
uint tOP2,value1,value2;

long uint adc;                                //定义长整数,不然出错

void disduan(uchar dd)
{
        DA=dd>>7;DB=dd>>6&1;DC=dd>>5&1;DD=dd>>4&1;DE=dd>>3&1;DF=dd>>2&1;DG=dd>>1&1;DP=dd&1;
}

void diswei(uchar dw)
{
        B1=dw>>3&1;B2=dw>>2&1;B3=dw>>1&1;B4=dw&1;
}

void Delay1ms()                //@12.000MHz
{
    uchar i, j;

    i = 12;
    j = 169;
    do
    {
      while (--j);
    } while (--i);
}

void Delay50us()                //@12.000MHz
{
        unsigned char i, j;

        i = 1;
        j = 146;
        do
        {
                while (--j);
        } while (--i);
}

void init()
{
    P2M0=0x1B;                        //P2强推挽0001 1011
    P3M0=0xE4;                        //P3强推挽1110 0100
        P1ASF=0x80;                        //开启P1^7引脚模拟功能
       
        key=255;
        S1=0;                                //pwm引脚置零
       
        EA=1;                                //中断总开关
        ET0=1;                                //定时器0开关
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x88;                        //设置定时初值                10us
        TH0 = 0xFF;                        //设置定时初值
        TR0 = 1;                        //定时器0开始计时
}

uint MAX6675_ReadReg(void)                //返回dat 0-65535 包含状态 温度值
{
        uchar i;   
        uint dat; //   1111 1111 1111 1111
       
        i   = 0;   
        dat = 0;   
       
        CS= 0;                         //片选端,CS为低时、启动串行接口
        SCK = 0;                   //串行时钟输出6675收到低电平发送数据
       
        for(i=0; i<16; i++)                //get D15-D0 from 6675从最高位开始接收16位数据
        {      
                SCK = 1;                                //重置时钟
                dat = dat<<1;                        //dat左移一位,1111 1111 1111 1110
                if( SO==1 )          
                        dat = dat|0x01;                //收到高电平,个位改为1
                SCK = 0;                                //发送时钟信号,准备接收下一位数据
        }
        CS = 1;   
          
        return dat;   //
}

void gettemp()
{
        if(count2==8)                                //256周期测一次温度,电压
        {
                temp=MAX6675_ReadReg();                //读取状态数据0-65535   1111 1111 1111 1111 fedc ba98 7654 3210
                Flag_temp=(temp&4)>>2;        //读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,该位为0表示连接 0000 0000 0000 0100
               
                temp=((temp<<1)>>4)*5/2;        //读出来的数据的D3~D14是温度值 左移1位,右移4位 乘5/2 10倍温度值
        }
}

voidgetadc()
{
        if(count2==8)
        {
                ADC_CONTR=0x8f;                                //开始ad转换 1000 1111
                Delay50us();                                //延时50us,等待转换
                adc=ADC_RES*4+ADC_RESL;                //读取转换结果 10位精度 0-1023
        }
}

void getpwm()
{
        ADC_CONTR=0x8f;                                //开始ad转换 1000 1111
        Delay50us();                                //延时50us,等待转换
        adc=ADC_RES*4+ADC_RESL;                //读取转换结果 10位精度 0-1023
       
        adc=adc/10+100;                                        //100-202
        if(adc>200)                                                //100-200
                adc=200;
}

void getkey()
{
        uchar i;
       
        if(count2%16==0)                                                //16ms检测一次mode键
        {
                keyy1=0;                                                        //keyy1置零
                keynow=keyx1;                                        //keynow状态等于keyx1
                keyy1=1;
                if(keynow==0&&keyold==1)
                        key=0;
                keyold=keynow;
        }
       
        if(count2%16==0&&mode==1)                        //模式1时,16ms检测一次按键
        {
                keyy1=0;
                keynow=keyx1;
                keynow=keyx2;
                keynow=keyx3;
                keynow=keyx4;
               
                keyy1=1;keyy2=0;
                keynow=keyx1;
                keynow=keyx2;
                keynow=keyx3;
                keynow=keyx4;

                keyy2=1;keyy3=0;
                keynow=keyx1;
                keynow=keyx2;
                keynow=keyx3;
                keynow=keyx4;

                keyy3=1;keyy4=0;
                keynow=keyx1;
                keynow=keyx2;
                keynow=keyx3;
                keynow=keyx4;


                keyy4=1;keyy5=0;
                keynow=keyx1;
                keynow=keyx2;
                keynow=keyx3;
                keynow=keyx4;
                keyy5=1;
               
                for(i=0;i<20;i++)
                {
                        if(keynow==0&&keyold==1)
                                key=i;
                       
                        keyold=keynow;
                }
        }
}

void operation()
{
        if(count2%16==0)
        {
                switch(key)
                {
                        case 0:        key=255;mode++;if(mode==4){mode=0;S1=0;}break;//3个模式
                        case 1:                break;
                        case 2:                break;
                        case 3:                break;
                        case 4:        key=255;x=1;        break;
                        case 5:        key=255;x=2;        break;
                        case 6:        key=255;x=3;        break;
                        case 7:        key=255;OP1=1;        break;        // +
                        case 8:        key=255;x=4;        break;
                        case 9:        key=255;x=5;        break;
                        case 10:key=255;x=6;        break;
                        case 11:key=255;OP1=2;        break;        // -
                        case 12:key=255;x=7;        break;
                        case 13:key=255;x=8;        break;
                        case 14:key=255;x=9;        break;
                        case 15:key=255;OP1=3;        break;        // *
                        case 16:key=255;x=0;        break;
                        case 17:key=255;OP2=1;        break;        // =
                        case 18:key=255;OP2=2;        break;        // c
                        case 19:key=255;OP1=4;        break;        // /
                       
                        default:        break;
                }
               
                if(OP1==0&&x!=255)
                {
                        value1=value1*10+x;
                        x=255;
                        value=value1;
                }
               
                if(OP1!=0&&x!=255)
                {
                        value2=value2*10+x;
                        x=255;
                        value=value2;
                }

                if(OP2==1)                                                        //输入 =
                {
                        OP2=0;
                       
                        switch(OP1)
                        {
                                case 1:        value=value1+value2;                break;
                                case 2:        value=value1-value2;                break;
                                case 3:        value=value1*value2;                break;
                                case 4:        value=value1/value2;                break;
                               
                                default:        break;
                        }
                        OP1=OP2=DOP2=tOP2=value1=value2=0;
                }
               
                if(DOP2==1)
                        tOP2++;
                if(tOP2==30)
                        DOP2=0;
                if(OP2==2&&DOP2==1)                                                //双击C清空所有数据
                        OP1=OP2=DOP2=tOP2=value1=value2=value=0;
               
                if(OP2==2)                                                                //单击C清除数据
                {
                        OP2=0;
                        DOP2=1;tOP2=0;
                        if(OP1==0)
                                value=value1=0;
                        else
                                value=value2=0;
                }
        }
}

void display()
{
        if(mode==0)
        {
                gettemp();
               
                switch(count)                                        //显示温度
                {
                        case 0:B4=1;disduan(duan);        diswei(wei);if(temp/1000==0) B1=1;break;                        //显示第1管 为0不显示
                        case 1:B1=1;disduan(duan);        diswei(wei);break;                                                                //显示第2管
                        case 2:B2=1;disduan(duan);        diswei(wei);DP=1;break;                                                        //显示第3管 带小数点
                        case 3:B3=1;disduan(duan);                diswei(wei);break;                                                                //显示第4管
                       
                        default: break;
                }
        }
       
        if(mode==1)
        {
                switch(count)                                        //显示按键
                {
                        case 0:B4=1;if(value/1000==0) {B1=1;break;}        disduan(duan);                diswei(wei);break;                        //显示第1管
                        case 1:B1=1;if(value/100==0) {B2=1;break;}        disduan(duan);        diswei(wei);break;                        //显示第2管
                        case 2:B2=1;if(value/10==0) {B3=1;break;}        disduan(duan);                diswei(wei);break;                        //显示第3管
                        case 3:B3=1;                                                                disduan(duan);                diswei(wei);break;                        //显示第4管
                       
                        default: break;
                }
        }
       
        if(mode==2)
        {
                if(count2==8)
                {
                        getadc();
                        adc=adc*5000/1023;                        //1000倍电压值 adc*5v/1023*1000
                }
               
                switch(count)                                        //显示电压
                {
                        case 0:B4=1;disduan(duan);        diswei(wei);DP=1;break;                //显示第1管 带小数点
                        case 1:B1=1;disduan(duan);        diswei(wei);break;                        //显示第2管
                        case 2:B2=1;disduan(duan);        diswei(wei);break;                        //显示第3管       
                        case 3:B3=1;disduan(duan);                diswei(wei);break;                        //显示第4管       
                       
                        default: break;
                }
        }
       
        while(mode==3)                                                                //模式3 pwm循环
        {
                t0=0;
                S1=1;
                B4=1;disduan(duan);diswei(wei);//显示数码管1
                getpwm();                                                                //获取adc
               
                while(t0!=adc);
                S1=0;
               
                while(t0!=500);
                B1=1;disduan(duan);        diswei(wei);//显示数码管2

               
                while(t0!=1000);
                B2=1;disduan(duan);        diswei(wei);//显示数码管3
               
                while(t0!=1500);
                B3=1;disduan(duan);        diswei(wei);//显示数码管4
               
                while(t0!=1700);                                                        //检测mode按键
                keyy1=0;                                                        //keyy1置零
                keynow=keyx1;                                        //keynow状态等于keyx1
                keyy1=1;
                if(keynow==0&&keyold==1)
                        mode=0;                                                        //符合条件mode回零,跳出pwm模式循环
                keyold=keynow;
               
                while(t0!=2000);                                        //20ms一个周期
        }
}

main()
{
        init();
       
    while(1)//
    {
                Delay1ms();                                //系统周期1毫秒

      count++;
      if(count>3)
            count=0;

                count2++;                                //0-255

                getkey();                                //运行一次80us16ms运行一次
               
                operation();

                display();
    }
}

void Timert0() interrupt 1
{
                t0++;                                //10us
}

我爱萝丽爱萝丽 发表于 2018-7-31 21:00:19

coolbgo 发表于 2018-7-30 20:35
请教大神
为什么用定时器延时计数 定时器中断里t0++      用t0=0;while(t0

while(T0<1000) 当然不包括t0大于1000的情况

Hi~ 发表于 2018-8-1 23:28:13

大师,单片机没有P5引脚接线的时候怎么办
页: 1 2 3 4 [5] 6 7
查看完整版本: 第十四课:制作舵机测试仪