历史上的今天
今天是:2025年01月08日(星期三)
2020年01月08日 | 51单片机6自由度机械臂调试程序,带LCD1602PWM显示
2020-01-08 来源:51hei
以前学习51的时候为了调试机械臂角度编写的程序,用在开发板上也比较方便,但是由于是普通的舵机,不是总线的,所以需要自己洞洞板焊一个供电带电路。
单片机源程序如下:
#include #include #define uchar unsigned char #define uint unsigned int sbit duoji0=P2^0; //PWM输出 sbit duoji1=P2^1; sbit duoji2=P2^2; sbit duoji3=P2^3; sbit duoji4=P3^1; sbit duoji5=P3^0; #define GPIO_KEY P1 unsigned int k0; unsigned int k1; unsigned int k2; unsigned int k4; unsigned int k3; unsigned int k5; //定义下降沿节点 uint dsip[8]={0}; uint j=0; unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','D',' '}; void delayms(uint xms) { uchar j; uint i; for(i=xms;i>0;i--) for(j=112;j>0;j--); } void time0() interrupt 1 { static uint ii0=0; TH0=(65536-100)/256; //以20ms为一个周期,以0.1ms为一个脉冲宽度 TL0=(65536-100)%256; ii0++; if(ii0<=k0) duoji0=1; //0号舵机pwm输出 else duoji0=0; if(ii0<=k1) //1号舵机pwm输出 duoji1=1; else duoji1=0; if(ii0<=k2) //2号舵机pwm输出 duoji2=1; else duoji2=0; if(ii0<=k3) //3号舵机pwm输出 duoji3=1; else duoji3=0; if(ii0<=k4) //4号舵机pwm输出 duoji4=1; else duoji4=0; if(ii0<=k5) //5号舵机pwm输出 duoji5=1; else duoji5=0; if(ii0==200) ii0=0; } void time0init() { TMOD=0x01; TH0=(65536-100)/256; TL0=(65536-100)%256; TR0=1; ET0=1; EA=1; } char KeyDown() { uchar KeyValue=20; uchar a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delayms(10);//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 { //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d): KeyValue=2;break; case(0X0e): KeyValue=3;break; } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测,当按键等于0xf时候跳出循环 { delayms(100); a++; } } } return KeyValue; } void count() { LcdWriteData(ASCII[0]); LcdWriteData(ASCII[11]); LcdWriteData(ASCII[k0/10]); LcdWriteData(ASCII[k0%10]); LcdWriteData(ASCII[12]); LcdWriteData(ASCII[1]); LcdWriteData(ASCII[11]); LcdWriteData(ASCII[k1/10]); LcdWriteData(ASCII[k1%10]); LcdWriteCom(0x80+0x40); LcdWriteData(ASCII[2]); LcdWriteData(ASCII[11]); LcdWriteData(ASCII[k2/10]); LcdWriteData(ASCII[k2%10]); LcdWriteData(ASCII[12]); LcdWriteData(ASCII[3]); LcdWriteData(ASCII[11]); LcdWriteData(ASCII[k3/10]); LcdWriteData(ASCII[k3%10]); } void main() { time0init(); k0=15; k1=9; k2=16; k3=14; k4=8; k5=8; LcdInit(); count(); while(1) { uchar KeyValue1=20; KeyValue1=KeyDown(); if(KeyValue1==0&&k0<=20&&k0>=8) //0号舵机高电平时间增加 { k0++; if(k0==21) k0=20; KeyValue1=20;LcdWriteCom(0x01); count(); } if(KeyValue1==4&&k0<=20&&k0>=8) //0号舵机高电平时间减少 { k0--; if(k0==7) k0=8;
史海拾趣
|
这是采用双线串行数字接口的温湿度传感器,与单片机接口非常方便,时序也很简单。 测量的温度/湿度精度很高。我们使用以后觉得很好用,所以,介绍给大家。 特点如下: 相对湿度和温度测量 _ 兼有露点 _ 全标定输出,无需标定即可互换使用 ...… 查看全部问答> |
|
关于IO0PIN指令的疑惑 最近在调一个键盘程序(LPC2103),用到了IO0PIN读端口指令(据说这是飞利浦系列的BUG),发现这个指令没有手册上说的那么简单呐,直接读是读不出来的。有人说要读一个输入状态的端口,要先把它设为输出,然后置高,最后再设 ...… 查看全部问答> |
|
各位手上有什么比较好用的bootloader吗?要求可以将nk.bin文件下载到内存中运行。 有的话给我发推荐一份啊,如果有时间的话麻烦给我发一份。 我的邮箱cy757#21cn.com(#改为@)… 查看全部问答> |
|
用verilog HDL 实现一个网络加密的算法(md5),有没有哪位高手能给点帮助,我邮箱是poppy220@126.com 先谢过啦!^_^ … 查看全部问答> |
|
有个项目用了STM8S105,电池供电(3节镍氢),系统中带DC-DC给功放供电,当DC-DC启动时或输出功率较大时,经常引起MCU复位。 STM8S有没有相应的低电压版本(即管脚,软件都一样,只是工作电压不同的)?… 查看全部问答> |
|
最近刚刚开始接触STM32,今天调试串口的时候发现一个很无奈的问题,源代码基本都是使用keil自带的demo,就不列举了。修改以下这些设置:/* PLLCLK = 12MHz * 6= 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6 ...… 查看全部问答> |
|
想了想,还是把它出掉好了,STM32+W5100+SPI Flash+TFT,有点给力 这其实不是个开发板,而是个接近完成的产品(接近完成是指研发流程已经走完,但还未能进入市场)但资源比较给力---------------> STM32ZET6,带外部总线于是可以用总线挂TFT---------------> W5100,硬件TCP/IP协议 ...… 查看全部问答> |




