ps2摇杆模块51程序上的BXY+-,5个分别是什么意思?怎么连接到51控制板上?还有怎么用(像代码之类)

查看: 1215|回复: 3
51单片机驱动PS2摇杆模块用1602显示X轴Y轴Y以及Z轴。1602用6线驱动
51单片机驱动PS2摇杆1602显示程序(1602用6根线驱动/********************************************************
& & & & 功& &能:51单片机通过PS2摇杆模块驱动4个LED
& & & & & & & & & & & & & & & & 并用1602显示
& & & & & & & & & & & & (1602使用6根线驱动)
& & & & 单片机:STC12C2052AD
& & & & 晶& &振:12M
& & & & 注& &释:摇杆的x轴接单片机P10.摇杆的Y轴接单片机P11.
& & & & & & & & & & & & Z轴接P17
& & & & 作&&者:苏义江改编自网络
& & & & 时&&间:
*******************************************************/
#include&stc12c2052ad.h&
#include&intrins.h&
#define uchar unsigned char
#define uint unsigned int
//#define TINER_HIGH&&0XFF//24M
//#define TINE_LOW& & 0XD8
#define TINER_HIGH&&0XFf//12M 100us
#define TINE_LOW& & 0X9c
#define& & ADC_POWER& &0x80&&//定义ADC电源常量
#define& & ADC_FLAG& & 0x10&&//定义ADC转换结束标志位
#define& & ADC_START& &0x08&&//定义ADC转换开始控制位
#define& & ADC_SPEEDLL 0x00&&//1080个时钟转换一次
#define& & ADC_SPEEDL&&0x20&&//810个时钟转换一次
#define& & ADC_SPEEDH&&0x40&&//540个时钟转换一次
#define& & ADC_SPEEDHH 0x60&&//270个时钟转换一次
sbit led_red& &=P1^6;
sbit led_green =P1^5;
sbit led_blue&&=P1^4;
sbit led_yellow=P1^3;
sbit z_zhou& & =P1^7;//Z轴
uchar red=0x00,green=0x00,blue=0x00,yellow=0x00;
uchar counter=0;
typedef struct
{
& & & &
& & & &
& & & &
}
void delay(uint t)
{
& & & & uint y,i;& && && && && &//定义变量& & & &
& & & & for(y=t;t&0;t--)& && && && & //如果t大于0,t减1(外层循环)
& & & & for(i=600;i&0;i--);& && && &//i等于600,如果i大于0,i减1
}
////////STC12C5608AD转换定义在哪个IO口进行并转换//////////////
uchar Read5608AD (uchar CHA)
{
& & uchar AD_FIN=0; //存储A/D转换标志;若在函数外定义此变量则不能得到连续变化的模拟量的显示
/////////以下为ADC初始化程序////////////
& & CHA &= 0x03;& && &
//选择ADC的8个接口中的一个( 清0高6位)
& & ADC_CONTR = ADC_SPEEDHH;&&//ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
& & _nop_();
& & ADC_CONTR |= CHA;& && & //选择A/D当前通道
& & _nop_();
& & ADC_CONTR |= ADC_POWER;& && &//启动A/D电源()
& & delay(1);& && && && &//使输入电压达到稳定(1ms即可?
/////以下为ADC执行程序///////////////////
& & ADC_CONTR |= ADC_START;& && &//启动A/D转换( 令ADCS = 1)
& & _nop_();
& & _nop_();
& & _nop_();
& & _nop_();
& & while (AD_FIN ==0)& && && &//等待A/D转换结束
& & {& &&&
& & AD_FIN = (ADC_CONTR & ADC_FLAG); //测试A/D转换结束否
& & }
& & ADC_CONTR &= 0xE7;& && &// 清ADC_FLAG位, 关闭A/D转换,
& & return (ADC_DATA);& && && & //返回A/D转换结果(8位)
}
/*
///////////STC12C2052AD转换//////////////
uchar Read2052AD (uchar CHA)
{
& & & & uchar AD_FIN=0; //存储A/D转换标志;若在函数外定义此变量则不能得到连续变化的模拟量的显示
//////以下为ADC初始化程序/////////////////
& & CHA &= 0x07;& && && && &//选择ADC的8个接口中的一个( 清0高5位)
& & ADC_CONTR = 0x60;&&//ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
& &_nop_();_nop_();_nop_();
& & ADC_CONTR |= CHA;& && & //选择A/D当前通道
& & _nop_();_nop_();_nop_();
& & ADC_CONTR |= 0x80;& && &//启动A/D电源
& & delay(2);& && && && &//使输入电压达到稳定(1ms即可?
//////////以下为ADC执行程序////////////////////
& & ADC_CONTR |= 0x08;& && &//启动A/D转换( 令ADCS = 1)
& & _nop_();
& & _nop_();
& & _nop_();
& & _nop_();
& & & & _nop_();
& & & & _nop_();
& & while (AD_FIN ==0)
& & & & {& &&&//等待A/D转换结束
& & & & & & AD_FIN = (ADC_CONTR & 0x10); //测试A/D转换结束否
& & }
& & ADC_CONTR &= 0xE7;& && &// 清ADC_FLAG位, 关闭A/D转换,
& & & & return (ADC_DATA);& && && & //返回A/D转换结果(8位)
}
*/
pos rocker_read(int drift)
{
& & & &
& & & & buffer.x=128-Read5608AD (1);
& & & & buffer.y=128-Read5608AD (0);
& & & & buffer.drift=
& & & & return (buffer);
}
void timer0_init()
{
& & & & TMOD=0X01;
& & & & TH0=TINER_HIGH ;
& & & & TL0=TINE_LOW;
& & & & ET0=1;
& & & & TR0=1;
& & & & EA=1;
}
void timer0_irpt() interrupt 1
{
& & & & TH0=TINER_HIGH ;
& & & & TL0=TINE_LOW;
& & & & counter++;
& & & & if(counter&red)& & led_red=0;& & else led_red=1;& & & & & & & &
& & & & if(counter&green)&&led_green=0;&&else led_green=1;
& & & & if(counter&blue)& &led_blue=0;& &else led_blue=1;
& & & & if(counter&yellow) led_yellow=0; else led_yellow=1;
}
//6根线驱动LCD1602接口定义& && && && &&&
#define LCD_DB P2 // - - P2 = DB4~DB7
sbit LCD_RS=P2^2; // - - p2.2 = RS
//sbit LCD_RW=P0^6; // - - p2.1 = RW 接地
sbit LCD_E=P2^3; // - - p2.3 = E
// - - 定义子程序函数
void LCD_init(void); // - - 初始化LCD1602函数
void LCD_write_H4bit_command(uchar dat);
void LCD_write_L4bit_command(uchar dat);
void LCD_write_4bit_command(uchar command); // - - 向LCD1602写指令函数
void LCD_write_4bit_data(uchar dat); // - - 向LCD1602写数据函数
void LCD_set_xy(uchar x,uchar y); // - - 设置LCD1602显示位置 X(0-16),y(1-2)
void LCD_disp_char(uchar x,uchar y,uchar dat); // - - 在LCD1602上显示一个字符
void LCD_disp_string(uchar X,uchar Y,uchar *s); // - - 在LCD1602上显示一个字符串
//void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。
void LCD_delay_10us(uint n); // - - 10微秒的延时子程序
void LCD_delay_50us(uint n); // - - 50微秒的延时子程序
void LCD_delay_10us(uint n) // - - 10微秒的延时子程序
{
uint i,j;
for(i=n*10;i&0;i--) // - - 晶振及单片机修改设置
for(j=2;j&0;j--);
void LCD_delay_50us(uint n) // - - 50微秒的延时子程序
{
& & & & uint i,j;
& & & & for(i=n*10;i&0;i--) // - - 晶振及单片机修改设置
& & & & for(j=22;j&0;j--);
}
// - - 初始化LCD1602
void LCD_init(void)
{
& & & & LCD_delay_50us(50);
& & & & LCD_RS=0; // - - 指令
//& & & & LCD_RW=0; // - - 写入
& & & & LCD_E=0; // - - 使能
& & & & LCD_write_L4bit_command(0x03); // - - 设置4位格式,2行,5x7
& & & & LCD_delay_50us(20);& & & &
& & & & LCD_write_L4bit_command(0x03); // - - 设置4位格式,2行,5x7
& & & & LCD_delay_50us(20);
& & & & LCD_write_L4bit_command(0x02); // - - 设置4位格式,2行,5x7
& & & & LCD_delay_50us(2);
& & & & LCD_write_4bit_command(0x28); // - - 设置4位格式,2行,5x7
& & & & LCD_delay_10us(10);
& & & & LCD_write_4bit_command(0x28); // - - 设置4位格式,2行,5x7
& & & & LCD_delay_10us(10);
& & & & LCD_write_4bit_command(0x0c); // - - 整体显示,关光标,不闪烁
& & & & LCD_delay_10us(10);
& & & & LCD_write_4bit_command(0x06); // - - 设定输入方式,增量不移位
& & & & LCD_delay_10us(10);
& & & & LCD_write_4bit_command(0x01); // - - 清除屏幕显示
& & & & LCD_delay_50us(40);
}
//********************************
// - - 向LCD1602写指令
void LCD_write_4bit_command(uchar dat)
{
& & & & LCD_delay_10us(50);
& & & & LCD_RS=0; // - - 指令
//& & & & LCD_RW=0; // - - 写入
& & & & LCD_write_H4bit_command(dat);
& & & & LCD_write_L4bit_command(dat);
}
// - - 向LCD1602写高四位指令
void LCD_write_H4bit_command(uchar dat)
{
& & & & LCD_delay_10us(250);
& & & & LCD_DB=(LCD_DB&0x0F)|(dat&0xF0);
& & & & LCD_delay_10us(50);
& & & & LCD_E=1; // - - 允许
& & & & LCD_delay_10us(250);
& & & & LCD_E=0;
}
// - - 向LCD1602写低四位指令
void LCD_write_L4bit_command(uchar dat)
{
& & & & dat&&=4;
& & & & LCD_delay_10us(50);
& & & & LCD_DB=(LCD_DB&0x0F)|(dat&0xF0);
& & & & LCD_delay_10us(50);
& & & & LCD_E=1; // - - 允许
& & & & LCD_delay_10us(250);
& & & & LCD_E=0;
}
// - - 向LCD1602写数据
void LCD_write_4bit_data(uchar dat)
{
& & & & LCD_delay_10us(50);
& & & & LCD_RS=1; // - - 数据
//& & & & LCD_RW=0; // - - 写入
& & & & LCD_write_H4bit_command(dat);
& & & & LCD_write_L4bit_command(dat);
}
// - - 设置显示位置
void LCD_set_xy(uchar x,uchar y)
{
& & & &
& & & & if(y==1)
& & & & {
& & & & & & & & address=0x80+x; // - - 第一行位置
& & & & }
& & & & else
& & & & {
& & & & & & & & address=0xc0+x; // - - 第二行位置
& & & & }
& & & & LCD_delay_10us(50);
& & & & LCD_write_4bit_command(address);
}
// - - 显示一个字符函数
void LCD_disp_char(uchar x,uchar y,uchar dat)
// - - LCD_disp_char(0,1,0x38); // - - 显示8
{
& & & & LCD_set_xy(x,y);
& & & & LCD_delay_10us(5);
& & & & LCD_write_4bit_data(dat);
}
// - - 显示一个字符串函数
void LCD_disp_string(uchar x,uchar y,uchar *s)
{
& & & & LCD_set_xy(x,y);
& & & & LCD_delay_10us(5);
& & & & while(*s!='\0')
& & & & {
& & & & & & & & LCD_write_4bit_data(*s);
& & & & & & & & s++;
& & & & }
}
void display(uint num )//显示数字
{
& & & & uchar qian,bai,shi,
& & & & qian=num/1000;
& & & & bai=num%;
& & & & shi=num%100/10;
& & & & ge=num%10;
& & & & LCD_set_xy(3,0);
& & & & LCD_write_4bit_data(qian+0x30);
& & & & LCD_write_4bit_data(bai+0x30);
& & & & LCD_write_4bit_data(shi+0x30);
& & & & LCD_write_4bit_data(ge+0x30);
}
void display1(uint num )//显示数字
{
& & & & uchar qian,bai,shi,
& & & & qian=num/1000;
& & & & bai=num%;
& & & & shi=num%100/10;
& & & & ge=num%10;
& & & & LCD_set_xy(11,0);
& & & & LCD_write_4bit_data(qian+0x30);
& & & & LCD_write_4bit_data(bai+0x30);
& & & & LCD_write_4bit_data(shi+0x30);
& & & & LCD_write_4bit_data(ge+0x30);
}
void main()
{
& & & & LCD_init();
& & & & timer0_init();
& & & & LCD_disp_string(0,0,&X=&);
& & & & LCD_disp_string(8,0,&Y=&);
& & & & LCD_disp_string(4,1,&Z=&);
& & & & while(1)
& & & & {
& & & & & & & & if(z_zhou==0)
& & & & & & & & {
& & & & & & & & & & & & LCD_disp_string(7,1,&O N&);
& & & & & & & & }
& & & & & & & &
& & & & & & & & else
& & & & & & & & {
& & & & //& & & & LCD_write_4bit_command(0x01);
& & & & & & & & LCD_disp_string(7,1,&OFF&);
& & & & & & & & }
& & & & & & & & rocker=rocker_read(0);& & & & & & & &
& & & & & & & & if(rocker.x&-3)
& & & & & & & & {
& & & & & & & & & & & & rocker.x=-rocker.x+1;
& & & & & & & & & & & & blue=rocker.x&&1;
& & & & & & & & & & & & display(blue);
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & & if(rocker.x&3)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & green=rocker.x&&1;
& & & & & & & & & & & & & & & & display(green);
& & & & & & & & & & & & }
& & & & & & & & & & & & else
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & green=blue=0;
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & & if(rocker.y&-3)
& & & & & & & & {
& & & & & & & & & & & & rocker.y=-rocker.y+1;
& & & & & & & & & & & & yellow=rocker.y&&1;
& & & & & & & & & & & & display1(yellow);
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & & if(rocker.y&3)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & red=rocker.y&&1;
& & & & & & & & & & & & & & & & display1(red);
& & & & & & & & & & & & }
& & & & & & & & & & & & else
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & yellow=red=0;
& & & & & & & & & & & & }
& & & & & & & & }
& & & & }
}
复制代码
共享资料的黑币奖励!
 这个好,PS2摇杆也可以用于我们的单片机diy了,不知道楼主的ps2摇杆的型号是什么?所有的摇杆都可以用这个方法来驱动吗?
 大侠,请问我把程序用到我的板子上(80c51)怎么不行,是AD程序不一样吗?
大侠,请问我把程序用到我的板子上(80c51)怎么不行,是AD程序不一样吗?
这个程序的Ad是stc12单片机内部自带的AD,80C51没有内部AD,所以用不了。
Powered by求大神,51单片机控制ps2摇杆模块、 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
求大神,51单片机控制ps2摇杆模块、
等待验证会员
17:31:44  
51单片机调ps2遥感模块资料和程序。
等待验证会员
15:10:55  
赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
01:00:51  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
强大的想法
19:05:53  
这个不算太难&&
19:08:42  
0}QXVR3Z`OCV{{ATMQ94EL2.jpg
(39.56 KB, 下载次数: 54)
19:08 上传
等待验证会员
10:00:54  
这个有意思,好好看看
等待验证会员
10:01:12  
这个有意思,好好看看
等待验证会员
10:01:32  
这个有意思,好好看看
23:24:22  
11:07:26  
21:24:35  
最近刚开始接触遥感,来学习学习
15:20:06  
等待验证会员
16:04:42  
看看 学习一下&&玩玩 遥控车
等待验证会员
16:48:28  
发表于 5&天前  
Powered byarduino学习笔记16 - PS2摇杆/游戏摇杆实验 arduino入门,arduino教程 - Powered by Discuz!
后使用快捷导航没有帐号?
查看: 36032|回复: 36
arduino学习笔记16 - PS2摇杆/游戏摇杆实验
PS2摇杆一般可以用来控制小车等等,其构造主要就是两个10K的电位器,还有一个按键开关。五个端口分别为VCC,X,Button,Y,GND。
先来看看实物图
IMGP0506_调整大小.JPG (122.4 KB, 下载次数: 255)
17:56 上传
IMGP0510_调整大小.JPG (133.44 KB, 下载次数: 193)
17:56 上传
IMGP0511_调整大小.JPG (135.56 KB, 下载次数: 191)
17:56 上传
老的液晶屏用来做其他东东了,所以换了一个,不同型号的1602液晶调节对比度的电阻阻值是不同的,所以这次我就换用了一个电位器,调节起来方便一些。
先上硬件连接图
Snap1.jpg (167.37 KB, 下载次数: 222)
17:56 上传
IMGP0586_调整大小.JPG (183.71 KB, 下载次数: 202)
17:56 上传
把下面的代码下载到arduino控制器中#include &LiquidCrystal.h&& &//调用arduino自带的LiquidCrystal库LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置接口int xpotPin = 0;&&//设置模拟口0为X的信号输入端口int ypotPin = 1;&&//设置模拟口1为Y的信号输入端口& && && && &int bpotPin = 2;&&//设置模拟口2为Button的信号输入端口int xval=0;& & //设置变量int yval=0;int bval=0;void setup(){&&lcd.begin(16, 2);&&//初始化LCD&&delay(1000); //延时1000ms}void loop ()& && && && && && && &{xval = analogRead(xpotPin);& &//xval变量为从0信号口读取到的数值yval = analogRead(ypotPin);& &//yval变量为从1信号口读取到的数值bval = analogRead(bpotPin);& &//bval变量为从2信号口读取到的数值lcd.clear(); //清屏lcd.setCursor(0, 0) ; //设置光标位置为第一行第一个位置lcd.print(&X=&);& && &//使屏幕显示文字X=lcd.print(xval);lcd.setCursor(7, 0) ; //设置光标位置为第一行第八个位置lcd.print(&Y=&);& && &//使屏幕显示文字Y=lcd.print(yval);if (bval&500){&&lcd.setCursor(0, 1) ;& &//设置光标位置为第二行第一个位置&&lcd.print(&Button ON&); //使屏幕显示文字Button ON}else{lcd.setCursor(0, 1) ;lcd.print(&Button OFF&); //使屏幕显示文字Button OFF}delay(100);& && && && && && && &//延时0.1秒,这里也就是刷新速度。}& && && && && && && && & 复制代码实验效果如下,推动摇杆时,电位器阻值发生变化,相应的电压也会发生变化,液晶屏上的数字就是每一个轴的电压数字输出。按下按键后,液晶上显示的按键状态会发生变化。
普通人 发表于
我手上有一个摇杆,不过没焊在板子上,看了一下有8个引脚,怎么变成5个啊
就是想问一下怎么焊的
额。。。。你看看是不是有两个电位器一个电位器是3个引脚,一个按钮是两个引脚。算上共用引脚就刚好是5个。
本帖最后由 mjgzdnw 于
21:00 编辑
向弘毅大哥学习
这种模式,我试验中,数据跳动比较厉害,能有平滑模式算法?
本帖最后由 普通人 于
19:01 编辑
我手上有一个摇杆,不过没焊在板子上,看了一下有8个引脚,怎么变成5个啊
就是想问一下怎么焊的
求问哪里有摇杆不带电路板单卖的呀@@,找了一晚上淘宝了,不知道要用什么关键字搜,joystick,ps2,摇杆 都试过了
麻烦大家帮帮忙,谢谢~
弘毅 发表于
额。。。。你看看是不是有两个电位器一个电位器是3个引脚,一个按钮是两个引脚。算上共用引脚就刚好是5个 ...
对啊,两个电位器,一个按钮=3+3+2=8
zhujunsan 发表于
求问哪里有摇杆不带电路板单卖的呀@@,找了一晚上淘宝了,不知道要用什么关键字搜,joystick,ps2,摇杆 都 ...
额。。。。介个貌似我也没见到过。。。
普通人 发表于
对啊,两个电位器,一个按钮=3+3+2=8
vcc gnd可以复用
弘毅 发表于
额。。。。介个貌似我也没见到过。。。
我记得我以前在淘宝见过,然后没存,这两天想买来着就找不到了。。。
Powered by求大神,51单片机控制ps2摇杆模块、 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
求大神,51单片机控制ps2摇杆模块、
等待验证会员
17:31:44  
51单片机调ps2遥感模块资料和程序。
等待验证会员
15:10:55  
赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
01:00:51  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
强大的想法
19:05:53  
这个不算太难&&
19:08:42  
0}QXVR3Z`OCV{{ATMQ94EL2.jpg
(39.56 KB, 下载次数: 54)
19:08 上传
等待验证会员
10:00:54  
这个有意思,好好看看
等待验证会员
10:01:12  
这个有意思,好好看看
等待验证会员
10:01:32  
这个有意思,好好看看
23:24:22  
11:07:26  
21:24:35  
最近刚开始接触遥感,来学习学习
15:20:06  
等待验证会员
16:04:42  
看看 学习一下&&玩玩 遥控车
等待验证会员
16:48:28  
发表于 5&天前  
Powered by

我要回帖

更多关于 ps2手柄换xbox的摇杆 的文章

 

随机推荐