hangmw 发表于 2016-12-12 13:19:41

牛人那!!!!!

xiao小菜鸟 发表于 2016-12-12 17:55:34

厉害吧

ldy7474 发表于 2016-12-15 14:24:01

我爱萝丽爱萝丽 发表于 2016-12-11 05:29
1.5 项目扩展




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

ldy7474 发表于 2016-12-15 14:35:13

#include <reg51.h>
#include <intrins.h>
#include "12864Data.h"

#define uchar unsigned char
#define uintunsigned int
#define u8 unsigned char
#define u16unsigned 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;//显示缓存


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>0x00)
    {
      if((text>=0x20)&&(text<=0x7E)) //32~126 ASCII码表的字符串数值之内
            {
            j=text-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);/*显示 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=' ';
    lcd=' ';
    lcd=' ';
    lcd=' ';
    while(1)
    {
           
    }
}

ldy7474 发表于 2016-12-15 14:40:25

我爱萝丽爱萝丽 发表于 2016-12-11 05:29
1.5 项目扩展




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

我爱萝丽爱萝丽 发表于 2016-12-15 16:37:26

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

引脚问题,P4没有启用。P4SW寄存器,先把P4作为普通IO口

ldy7474 发表于 2016-12-15 17:00:30

我爱萝丽爱萝丽 发表于 2016-12-15 16:37
引脚问题,P4没有启用。P4SW寄存器,先把P4作为普通IO口

谢谢大神解惑

ldy7474 发表于 2016-12-18 15:04:35

我爱萝丽爱萝丽 发表于 2016-12-8 04:05
1.1 焊接电路




请教楼主为什么
改了程序后数码管
没反应了想把
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位数据         
        }
        }
       

ldy7474 发表于 2016-12-18 15:08:39

ldy7474 发表于 2016-12-18 15:04
请教楼主为什么
改了程序后数码管
没反应了想把


还有P5.5好像不能用是程序问题还是怎么回事 p5.4都能正常开启

我爱萝丽爱萝丽 发表于 2016-12-19 00:47:31

ldy7474 发表于 2016-12-18 15:04
请教楼主为什么
改了程序后数码管
没反应了想把

你没接接收机,引脚当然一直是高电平一直测量。除非引脚高阻下拉

靠2015 发表于 2016-12-21 14:37:54

一直在跟着萝莉老师的脚步学习diy和单片机,心中对萝莉老师的敬意如滔滔江水,由衷的感谢萝莉老师不辞辛苦的教会我们各种知识

simplebrief 发表于 2016-12-24 14:11:49

我爱萝丽爱萝丽 发表于 2016-12-8 05:16
1.2 舵机控制原理




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

我爱萝丽爱萝丽 发表于 2016-12-25 04:06:44

simplebrief 发表于 2016-12-24 14:11
大神 我想用你接收机的定时器对舵机做精准时间控制,但是没读懂这个temp1=64750-CH_data*27/20;运算和 ...

就是舵量增大13.5%

∮连∮ 发表于 2016-12-26 10:30:17

大神!顶一个!好适用的贴子!

simplebrief 发表于 2016-12-31 10:09:38

我爱萝丽爱萝丽 发表于 2016-12-25 04:06
就是舵量增大13.5%

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

我爱萝丽爱萝丽 发表于 2016-12-31 18:48:57

simplebrief 发表于 2016-12-31 10:09
大神 为什么要放大13.5%?64750怎么来的有什么考虑 不是65536吗?详细一点呗,大神辛苦了 ...

就是根据接收的数据,计算一下定时时间,产生1ms~2ms脉冲。

炸香机 发表于 2016-12-31 21:23:42

感谢楼主分享                                 

细雪带风 发表于 2017-1-7 11:58:27

上一节课的单片机28脚插座没有给出啊

我爱萝丽爱萝丽 发表于 2017-1-8 03:25:22

细雪带风 发表于 2017-1-7 11:58
上一节课的单片机28脚插座没有给出啊

等有空了会再整理

悠牧人 发表于 2017-1-8 14:27:46

顶一个
页: 1 2 3 [4] 5 6 7
查看完整版本: 第十四课:制作舵机测试仪