1:这个按钮是哪两个引脚?是P34和P35吗?P00为方波输出?
2:怎样把显示部分改成用1602显示?
3:已经按键的电路怎么做?直接接地是否可以?
2:怎样把显示部分改成用1602显示?
3:已经按键的电路怎么做?直接接地是否可以?
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
/*
变量定义
*/
uchar key_stime_counter,hight_votage=15,timeT_counter;
bit key_stime_ok;
/*
引脚定义
*/
sbit control_signal=P0^0;
sbit turn_left=P3^4;
sbit turn_right=P3^5;
/*****************************************************************
名称:定时器0初始化
功能:20ms定时,11.0592M晶振
初值=65536-11059200*0.02/12=65536-18432=47104=0xB800 20ms
初值=65536-11059200*0.0001/12=65536-92.16=64430=0xFFA3 0.1ms
*****************************************************************/
void TimerInit()
{
control_signal=0;
TMOD=0x01; //设置定时器0为工作方式1
EA=1; //开总中断
ET0=1; //定时器0中断允许
TH0 = 0xFF; //定时器装初值
TL0 = 0xA3;
TR0=1; //启动定时器0
}
/**********************************************
定时器0中断服务函数
***********************************************/
void timer0(void) interrupt 1 using 0
{
TH0=0xFF;
TL0=0xA3; //定时器0重新装入数值
if (++key_stime_counter>=200)
{
key_stime_counter=0;
control_signal=1;
key_stime_ok = 1; // 20ms到
timeT_counter=0;
}
if (key_stime_ok&&(++timeT_counter>=hight_votage))
{
key_stime_ok=0;
timeT_counter=0;
control_signal=0; // hight_votage*0.1ms到
}
}
/*********************************************
名称:键盘扫描
功能:在按键稳定期内判断键值,并返回键值
**********************************************/
uchar keyscan(void)
{
static char key_state = 0;
static char key_value = 0;
uchar key_press, key_return = 0;
key_press = turn_left & turn_right; //读按键I/O电平
switch (key_state)
{
case 0 : // 按键初始态
if (key_press==0) key_state = 1; // 键被按下,但需要确认是否是干扰
break;
case 1 : // 按键确认态
if (key_press==0)//如有键按下则不是干扰,判断键值
{
if(turn_left==0) //判断是哪一个按键被按下
{
key_value=1; //按键较多时可采用switch选择结构
}
else if(turn_right==0)
{
key_value=2;
}
else
{
key_value=0;
key_state = 2; // 状态转换到键释放态
}
}
else
{
key_state = 0; // 按键已抬起,属于干扰,转换到按键初始态
}
break;
case 2 :
if (key_press==1)
{
key_return=key_value;//按键释放后再输出键值,如果按下键就输出则可省略key_value
key_value=0;
key_state = 0; //如果按键释放,转换到按键初始态
}
break;
}
return key_return; //返回键值
}
/*********************************************
名称:按键处理
功能:
**********************************************/
void key_operation(void)
{
switch (keyscan()) //根据键值不同,执行不同的内容
{
case 1:
hight_votage -= 1;
if(hight_votage < 5)
{
hight_votage = 5;
}
break;
case 2:
hight_votage += 1;
if(hight_votage > 25)
{
hight_votage = 25;
}
break;
default :
break;
}
}
//LED显示函数
void diplay()
{
if(hight_votage>=5&&hight_votage<=7) p1="0xFD; " 1灯亮,舵机接近或到达右转极限位置 if(hight_votage>7&&hight_votage<=10) p1="0xFB; " 2灯亮 if(hight_votage>10&&hight_votage<=13) p1="0xF7; //3灯亮" if(hight_votage>13&&hight_votage<=16) p1="0xEF; //4灯亮,舵机到达中间位置" if(hight_votage>16&&hight_votage<=19) p1="0xDF; //5灯亮" if(hight_votage>19&&hight_votage<=22) p1="0xBF; //6灯亮" if(hight_votage>22&&hight_votage<=25) p1="0x7F; //7灯亮,舵机接近或到达左转极限位置" } *主程序* void main(void) { timerinit(); while(1) { key_operation(); diplay(); } }< code></=25)></=22)></=19)></=16)></=13)></=10)></=7)></reg51.h>
/*-----------------------------------------------
名称:LCD1602
编写:shifang
日期:2009.5
修改:无
内容:通过标准程序动态显示字符
引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
sbit RS = P2^4; //定义端口
sbit RW = P2^5;
sbit EN = P2^6;
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
// while(LCD_Check_Busy()); //忙则等待
DelayMs(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
//while(LCD_Check_Busy()); //忙则等待
DelayMs(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
unsigned char i;
unsigned char *p;
LCD_Init();
while (1)
{
i = 1;
p = "www.doflye.net";
LCD_Clear();
LCD_Write_String(2,0,"Welcome to");
DelayMs(250);
while (*p)
{
LCD_Write_Char(i,1,*p);
i ++;
p ++;
DelayMs(250);
}
DelayMs(250);
}
}</intrins.h></reg52.h>
引用 hansd:电调认为输入油门过大。所以进入编程模式了。。。
代码没看,楼主确定不是电调油门保护了?
引用 月下孤狼:哦哦,谢谢。只是我手里的52有现成的最小系统板,已经烧录器都有,所以就先用这个了。
为什么不用STC12C5A60s2?这个带推挽模式输出,适合驱动MOS管。
89C52是过时的STC产品,官网都不推荐使用
引用 仓生木品:谢谢。我改改用。
对电调不熟
1602显示的代码可以参考一下
/*-----------------------------------------------
名称:LCD1602
编写:shifang
日期:2009.5
修改...
引用 仓生木品:谢谢层主~
【PERIAN作品】51单片机自制8通道2.4G遥控器简明教程!!!
推荐楼主看一下这个教程。
200字以内,仅用于支线交流,主线讨论请采用回复功能。