模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

[单片机课堂] 第十四课:制作舵机测试仪

  [复制链接]
发表于 2016-12-12 17:55:34 | 显示全部楼层
厉害吧
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-15 14:24:01 | 显示全部楼层

萝莉大神都用上了STC15W408AS DIP28了就整个舵机测试仪  电压表有点浪费哈 原件都到齐了 如果14课终结  了
我电压表舵机测试仪就用stc15w401as来搞了
用28脚的有点浪费资源  我只买了2片dip28还要为后续的4通道遥控留着备用
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-15 14:35:13 | 显示全部楼层
#include <reg51.h>
#include <intrins.h>
#include "12864Data.h"

#define uchar unsigned char
#define uint  unsigned int
#define u8 unsigned char
#define u16  unsigned int

/*****************************************************/
//STC12 系列新增寄存器
sfr P0M0=0x94;
sfr P1M1=0x91;
sfr P1M0=0x92;
sfr P2M1=0x95;
sfr P2M0=0x96;
sfr P3M0=0xb2;
sfr P3M1=0xb1;
sfr P4M0=0xb4;
sfr P4=0xc0;
sfr P4SW=0xbb;
sfr P5M1=0xC9;
sfr P5M0=0xCA;
sfr IPH=0xb7;
sfr P1ASF=0x9d;
/*************************************************/
//萝莉控LCD引脚定义
/*
sbit CS=P0^6;
sbit RST=P0^7;
sbit RS=P4^6;                                             
sbit SDA=P4^5;                                    
sbit CLK=P4^4;
sbit LEDA=P2^5;

测试LCD引脚定义成功点亮

  stc15w204s
                 _______
        P1.2--1 |       | 16--P1.1
        P1.3--2 |       | 15--P1.0
        P1.4--3 |       | 14--P3.7--txd
        P1.5--4 |       | 13--P3.6--rxd
        P5.4--5 |       | 12--P3.3
        VCC --6 |       | 11--P3.2
        P5.5--7 |       | 10--P3.1--txd
        GND --8 |_______| 9 --P3.0--rxd
sbit SCK=P1^1;
sbit SDA=P1^0;
sbit RS=P3^7;
sbit RST=P3^6;
sbit CS=P3^3;



/**修改为兼容萝莉控LCD引脚定义无法点亮*********************/
/*
sbit CS=P0^6;
sbit RST=P0^7;
sbit RS=P4^6;
sbit SDA=P4^5;
sbit SCK=P4^4;
sbit LEDA=P2^5;

/***************LCD引脚定义*********************/
sbit SCK=P1^1;
sbit SDA=P1^0;
sbit RS=P3^7;
sbit RST=P3^6;
sbit CS=P3^3;
sbit LEDA=P3^2;

u8 lcd[10];//显示缓存


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

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

void DelayMs(u16 i)  //延时N毫秒,0~65535ms
{
   while(i--) Delay1ms();
}


/*****************液晶屏函数**********************/
/*写指令到 LCD 模块*/
void Command(u8 Data)
{
    u8 i;
    CS=0;
    RS=0;
    for(i=0;i<8;i++)
    {
        SCK=0;
        if(Data&0x80) SDA=1;
        else SDA=0;
        SCK=1;
        Data=Data<<=1;
    }
}

/*写数据到 LCD 模块*/
void SendData(u8 Data)
{
    u8 i;
    CS=0;
    RS=1;
    for(i=0;i<8;i++)
    {
        SCK=0;
        if(Data&0x80) SDA=1;
        else SDA=0;
        SCK=1;
        Data=Data<<=1;
    }
}

/*LCD 模块初始化*/
void InitLCD()
{
    CS=0;
    RST=0;  /*低电平复位*/
    DelayMs(2);
    RST=1;  /*复位完毕*/
    DelayMs(10);
    Command(0xE2);  /*软复位*/
    DelayMs(1);
    Command(0x2C); /*升压步聚 1*/
    Command(0x2E); /*升压步聚 2*/
    Command(0x2F); /*升压步聚 3*/
    DelayMs(1);
    Command(0x23); /*粗调对比度,可设置范围 0x20~0x27*/
    Command(0x81); /*微调对比度*/
    Command(0x28); /*0x1a,微调对比度的值,可设置范围 0x00~0x3f*/
    Command(0xA2); /*1/9 偏压比(bias)*/
    Command(0xC8); /*行扫描顺序:从上到下*/
    Command(0xA0); /*列扫描顺序:从左到右*/
    Command(0x40); /*起始行:第一行开始*/
    Command(0xAF); /*开显示*/
    CS=1;
}

/*设置液晶屏的显示地址*/
void Address(u8 Page,u8 Column)
{
    CS=0;
    Column=Column-1;    //我们平常所说的第 1 列,在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1.
    Page=Page-1;
    Command(0xB0+Page); //设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。
                                //我们平常所说的第 1 页,在 LCD 驱动 IC 里是第 0 页,所以在这里减去 1
    Command(((Column>>4)&0x0F)+0x10); //设置列地址的高 4 位
    Command(Column&0x0F);   //设置列地址的低 4 位
}

/*全屏清屏*/
void ClearScreen()
{
    u8 i,j;
    CS=0;
    for(i=0;i<9;i++)
    {
        Address(1+i,1);
        for(j=0;j<132;j++)
            {
            SendData(0x00); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
            }
    }
    CS=1;
}
/*显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标*/
void Display16x16(u8 Page,u8 Column,u8 *dp)
{
    u8 i,j;
    CS=0;
    for(j=0;j<2;j++)
    {
        Address(Page+j,Column);
        for (i=0;i<16;i++)
            {
            SendData(*dp);  /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
                dp++;
            }
    }
    CS=1;
}


//显示8*16的字符串
void Display8x16(u8 Page,u8 Column,u8 *text)
{
    u8 i=0,j,k,n;
    CS=0;
    while(text[i]>0x00)
    {
        if((text[i]>=0x20)&&(text[i]<=0x7E)) //32~126 ASCII码表的字符串数值之内
            {
            j=text[i]-0x20;//ASCII码值-32,刚好是该字符的ascii_table_8x16数组中点阵开始地址
            for(n=0;n<2;n++)
                    {
                Address(Page+n,Column);
                for(k=0;k<8;k++)
                        {
                    SendData(ascii_table_8x16[j][k+8*n]);/*显示 5x7 的 ASCII 字到 LCD 上,y 为页地址,x 为列地址,最后为数据*/
                        }
                    }
                i++;
            Column+=8;
            }
        else
        i++;
    }
}
/***********************液晶屏函数结束****************/
void main(void)
{
    LEDA=1;
    DelayMs(100);//延时100ms等待稳定运行
   
    InitLCD();
    ClearScreen();
   
    Display16x16(1,1,zong);
    Display16x16(1,17,dian);
    Display16x16(1,33,ya);
    Display8x16(1,50,":");
    Display16x16(1,68,":");

   
    Display16x16(3,1,dian);
    Display16x16(3,17,chi);
    Display8x16(3,33,"1");
    Display8x16(3,41,":");

    Display16x16(5,1,dian);
    Display16x16(5,17,chi);
    Display8x16(5,33,"2");
    Display8x16(5,41,":");

    Display16x16(7,1,dian);
    Display16x16(7,17,chi);
    Display8x16(7,33,"3");
    Display8x16(7,41,":");
    lcd[6]=' ';
    lcd[7]=' ';
    lcd[8]=' ';
    lcd[9]=' ';
    while(1)
    {
           
    }
}
回复 支持 0 反对 1

使用道具 举报

发表于 2016-12-15 14:40:25 | 显示全部楼层

萝莉大神你好最近在学习12864请教下为什么楼上的程序在
stc15w408as上面能顺利点亮lcd
移植到12c5a60s2就无法点亮
相关寄存器声明也修改了  就是不行
是什么原因?

点评

引脚问题,P4没有启用。P4SW寄存器,先把P4作为普通IO口  详情 回复 发表于 2016-12-15 16:37
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-12-15 16:37:26 | 显示全部楼层
ldy7474 发表于 2016-12-15 14:40
萝莉大神你好最近在学习12864请教下为什么楼上的程序在
stc15w408as上面能顺利点亮lcd
移植到12c5a60s2就 ...

引脚问题,P4没有启用。P4SW寄存器,先把P4作为普通IO口
回复 支持 0 反对 1

使用道具 举报

发表于 2016-12-15 17:00:30 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-12-15 16:37
引脚问题,P4没有启用。P4SW寄存器,先把P4作为普通IO口

谢谢大神解惑
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-18 15:04:35 | 显示全部楼层

请教楼主为什么
改了程序后数码管
没反应了想把
time脉宽用数码
显示出来
可是水品不够不知道错在哪里

#include<reg51.h>
#include<intrins.h>
sfr P0M0        =   0x94;   //0000,0000 端口0模式寄存器0
sfr P0M1        =   0x93;   //0000,0000 端口0模式寄存器1
sfr P1M0        =   0x92;   //0000,0000 端口1模式寄存器0
sfr P1M1        =   0x91;   //0000,0000 端口1模式寄存器1
sfr P2M0        =   0x96;   //0000,0000 端口2模式寄存器0
sfr P2M1        =   0x95;   //0000,0000 端口2模式寄存器1
sfr P3M0        =   0xB2;   //0000,0000 端口3模式寄存器0
sfr P3M1        =   0xB1;   //0000,0000 端口3模式寄存器1
sfr P4M0        =   0xB4;   //0000,0000 端口4模式寄存器0
sfr P4M1        =   0xB3;   //0000,0000 端口4模式寄存器1
sfr P5M0        =   0xCA;   //0000,0000 端口5模式寄存器0
sfr P5M1        =   0xC9;   //0000,0000 端口5模式寄存器1
sfr P5          =   0xC8;   //xxxx,1111 端口5
sbit P50        =   P5^0;
sbit P51        =   P5^1;
sbit P52        =   P5^2;
sbit P53        =   P5^3;
sbit P54        =   P5^4;
sbit P55        =   P5^5;
sbit P56        =   P5^6;
sbit P57        =   P5^7;

/* stc15w204s
                 _______
        P1.2--1 |       | 16--P1.1
        P1.3--2 |       | 15--P1.0
        P1.4--3 |       | 14--P3.7--txd
        P1.5--4 |       | 13--P3.6--rxd
        P5.4--5 |       | 12--P3.3
        VCC --6 |       | 11--P3.2
        P5.5--7 |       | 10--P3.1--txd
        GND --8 |_______| 9 --P3.0--rxd
*/
sbit DA=P5^4;   //数码管每个引脚
sbit DB=P1^5;
sbit DC=P3^7;
sbit DD=P1^0;
sbit DE=P3^2;
sbit DF=P1^4;
sbit DG=P3^0;
//sbit DP=P3^7;

sbit B1=P3^1;   //四个数码管的引脚定义
sbit B2=P3^3;
sbit B3=P3^6;
sbit B4=P1^1;
sbit IN=P1^2;     //定义PWM输入引脚
sbit OUT=P5^5;    //定义输出引脚

unsigned int time;    //记录时间

unsigned char display_time;  //定义变量用于显示次数

unsigned char Data1;  //第一个数码管要显示的数据
unsigned char Data2;  //第二个数码管要显示的数据
unsigned char Data3;  //第三个数码管要显示的数据
unsigned char Data4;  //第四个数码管要显示的数据

void Delay10us()                //@12.000MHz
{
        unsigned char i;
        
        _nop_();//使用《舵机测试仪》课程中调整过的延时程序
        _nop_();
        i = 24;
        while (--i);
}


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

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

void delay_n_ms(unsigned int n) //延时n毫秒函数
{
  while(n)   
  {
    Delay1ms();
    n=n-1;//每循环一次n减小1
  }   
}


void display(unsigned char x)//控制数码管显示内容的函数
{
  //判断x的值来决定显示什么
  if(x==0){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;;} //显示“0”
  
  if(x==1){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;} //显示“1”
  
  if(x==2){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;} //显示“2”
  
  if(x==3){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;} //显示“3”

  if(x==4){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;} //显示“4”
  
  if(x==5){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;} //显示“5”
  
  if(x==6){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;} //显示“6”
  
  if(x==7){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;} //显示“7”
  
  if(x==8){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;} //显示“8”
  
  if(x==9){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;} //显示“9”
  
}

main()
{
          OUT=0;        //先关闭输出
          P5M0=0x18;        //需要高电平大电流的引脚 P5^4;      
          P1M0=0x31;    //需要高电平大电流的引脚 P1^5,P1^4;P1^0;填入数值00110001
          P3M0=0x85;    //需要高电平大电流的引脚 P3^7;P3^2;P3^0;填入数值1000 0101
          while(1)
        {
    delay_n_ms(4);//系统周期4ms
        if(IN==1)        //收到PWM高电平,开始测量
   {
    time=0;  //先把时间清零
    while(IN==1)  //如果引脚一直为高电平,一直循环
   {
    Delay10us();
    time=time+1;  //每循环一次,就记录了10us时间
    }
        }
        }

        Data1=0;         //四个数码管显示的数据
    Data2=time/100;       //百位数据
    Data3=time%100/10; //十位数据
    Data4=time%10;  //个位数据
       
        display_time=display_time+1;
    if(display_time>3)
    {
   display_time=0;//0、1、2、3 四个循环
    }
   
    if(display_time==0)//第0次显示第一个数码管
    {
   B1=0;B2=1;B3=1;B4=1;  
   display(Data1);    //显示第1位数据
    }
   
    if(display_time==1)//第1次显示第二个数码管
    {
   B1=1;B2=0;B3=1;B4=1;  
   display(Data2);    //显示第2位数据
    }
   
    if(display_time==2)//第2次显示第三个数码管
    {
   B1=1;B2=1;B3=0;B4=1;  
   display(Data3);    //显示第3位数据
    }
   
    if(display_time==3)//第3次显示第四个数码管
    {
   B1=1;B2=1;B3=1;B4=0;  
   display(Data4);    //显示第4位数据         
        }
        }
       

点评

你没接接收机,引脚当然一直是高电平一直测量。除非引脚悬空下拉  详情 回复 发表于 2016-12-19 00:47
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-18 15:08:39 | 显示全部楼层
ldy7474 发表于 2016-12-18 15:04
请教楼主为什么
改了程序后数码管
没反应了想把

还有P5.5好像不能用是程序问题还是怎么回事 p5.4都能正常开启
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-12-19 00:47:31 | 显示全部楼层
ldy7474 发表于 2016-12-18 15:04
请教楼主为什么
改了程序后数码管
没反应了想把

你没接接收机,引脚当然一直是高电平一直测量。除非引脚高阻下拉
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-21 14:37:54 | 显示全部楼层
一直在跟着萝莉老师的脚步学习diy和单片机,心中对萝莉老师的敬意如滔滔江水,由衷的感谢萝莉老师不辞辛苦的教会我们各种知识
回复 支持 0 反对 1

使用道具 举报

发表于 2016-12-24 14:11:49 | 显示全部楼层

大神 我想用你接收机的定时器对舵机做精准时间控制,但是没读懂这个temp1=64750-CH_data[0]*27/20;运算和代表意义?帮忙解读一下呗,非常感谢!
case 1:CH1=1;temp1=64750-CH_data[0]*27/20; TL1=temp1,TH1=temp1>>8;break;
case 2:CH1=0;temp2=128600-temp1;        TL1=temp2,TH1=temp2>>8;break;

点评

就是舵量增大13.5%  详情 回复 发表于 2016-12-25 04:06
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-12-25 04:06:44 | 显示全部楼层
simplebrief 发表于 2016-12-24 14:11
大神 我想用你接收机的定时器对舵机做精准时间控制,但是没读懂这个temp1=64750-CH_data[0]*27/20;运算和 ...

就是舵量增大13.5%
回复 支持 0 反对 1

使用道具 举报

发表于 2016-12-26 10:30:17 | 显示全部楼层
大神!顶一个!好适用的贴子!
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-31 10:09:38 | 显示全部楼层

大神 为什么要放大13.5%?64750怎么来的有什么考虑 不是65536吗?详细一点呗,大神辛苦了

点评

就是根据接收的数据,计算一下定时时间,产生1ms~2ms脉冲。  详情 回复 发表于 2016-12-31 18:48
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-12-31 18:48:57 | 显示全部楼层
simplebrief 发表于 2016-12-31 10:09
大神 为什么要放大13.5%?64750怎么来的有什么考虑 不是65536吗?详细一点呗,大神辛苦了 ...

就是根据接收的数据,计算一下定时时间,产生1ms~2ms脉冲。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-31 21:23:42 | 显示全部楼层
感谢楼主分享                                   
回复 支持 1 反对 0

使用道具 举报

发表于 2017-1-7 11:58:27 | 显示全部楼层
上一节课的单片机28脚插座没有给出啊

点评

等有空了会再整理  详情 回复 发表于 2017-1-8 03:25
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-1-8 03:25:22 | 显示全部楼层
细雪带风 发表于 2017-1-7 11:58
上一节课的单片机28脚插座没有给出啊

等有空了会再整理
回复 支持 1 反对 0

使用道具 举报

发表于 2017-1-8 14:27:46 | 显示全部楼层
顶一个
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!