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
顶一个