📄 mcs51-项目开发经典.c
字号:
}
/***********************************************************************/
/*名称: EWDS_93C46() */
/*说明: 93C46的编程关闭.操作码(100 00XXXX) */
/**********************************************************************/
void EWDS_93C46()
{
START_93C46();
SEND_DATA_93C46(0X04,0X03);
SEND_DATA_93C46(0X00,0X06);
END_93C46();
}
/***********************************************************************/
/*名称:READ() */
/*说明:93C46的字读取程序 */
/*输入:要读取的字地址(6位) */
/*输出:读取的字数值 */
/**********************************************************************/
uint READ_93C46(uchar address)
{data uchar temp1;
data uint temp2;
START_93C46();
SEND_DATA_93C46(0x06,0x03);
SEND_DATA_93C46(address,0x06);
temp2=0;//存放返回数据的缓冲先清零*
for(temp1=0;temp1<16;temp1++)//循环读出16个数据
{temp2=temp2<<1;
SK_93C46=1;
SK_93C46=0;
if(DO_93C46==1){temp2=temp2|0x0001;}
}
END_93C46();
return temp2;
}
/**********************************************************************/
/*名称:WRITE() */
/*说明:93C46的字写入程序 */
/*输入: address 要写入的字地址(6位) */
/* op_data 要写入的数据(16位) */
/*输出: 读取的字数值 */
/**********************************************************************/
uchar WRITE_93C46(uchar address,uint op_data)
{data uchar temp1;
data uint temp2;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(0X05,0X03);
SEND_DATA_93C46(address,0X06);
SEND_DATA_93C46(op_data,0X10);
CS_93C46=0;
CS_93C46=1;
temp1=2;
temp2=50000; /*设置一个最大延时等待数值.注意在不同的晶振下延时是不同的*/
while(!DO_93C46)//DO_93C46为低电平,表示写操作正在进行
{temp2=temp2-1;//最大等待延时后说明写操作失败
if(temp2==0)
{temp1=0;
break;
}
}
END_93C46();
EWDS_93C46();
return temp1;
}
/***********************************************************************/
/*名称:ERASE() */
/*说明:93C46的字擦除程序 */
/*输入: address 要擦除的字地址(6位) */
/**********************************************************************/
/*
uchar ERASE(uchar address)
{data uchar temp1;
data uint temp2;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(0X07,0X03);
SEND_DATA_93C46(address,0X06);
CS_93C46=0;
CS_93C46=1;
temp1=1;
temp2=50000;
while(!DO_93C46)
{temp2=temp2-1;
if(temp2==0)
{temp1=0;
break;
}
}
END_93C46();
EWDS_93C46();//返回表示擦除状态的特征
return temp1;
}
*/
/**********************************************************************/
/*名称:ERAL() */
/*说明:93C46的全部擦除程序 */
/**********************************************************************/
uchar ERAL()
{data uchar temp1;
data uint temp2;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(0X04,0X03);
SEND_DATA_93C46(0X20,0X06);
CS_93C46=0;
CS_93C46=1;
temp1=1;
temp2=50000;
while(!DO_93C46)
{temp2=temp2-1;
if(temp2==0)
{temp1=0;
break;
}
}
END_93C46();
EWDS_93C46(); /*返回表示擦除状态的特征*/
return temp1;
}
/***********************************************************************/
/*名称:WRAL() */
/*说明:93C46的写全部程序 */
/*输入: op_data 要写入的数据(16位) */
/*输出: 读取的字数值 */
/***********************************************************************/
/*
uchar WRAL(uint op_data)
{data uchar temp1;
data uint temp2;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(0X04,0X03);
SEND_DATA_93C46(0X10,0X06);
SEND_DATA_93C46(op_data,0X10);
CS_93C46=0;
CS_93C46=1;
temp1=1;
temp2=50000;//设置一个最大延时等待数值.注意在不同的晶振下延时是不同的
while(!DO_93C46)
{temp2=temp2-1;
if(temp2==0)
{temp1=0;
break;
}
}
END_93C46();
EWDS_93C46();
return op_data;
}
*/
//=================================================================================================
// L297驱动程序
// 形参:cw_ccw =1正转,0反转
// hf =1全步,0半步
// step_delay 步进脉冲时间间隔,10的整数倍,单位是毫秒
//=================================================================================================
//=================================================================================================
// 直流电机控制程序
//=================================================================================================
// 函数功能:正转
void dc_motor_z(void)
{ TURN_Z_DCMOTOR=OPEN;
TURN_F_DCMOTOR=CLOSE;
}
//------------------------------
// 函数功能:反转
void dc_motor_f(void)
{ TURN_Z_DCMOTOR=CLOSE;
TURN_F_DCMOTOR=OPEN;
}
//------------------------------
// 函数功能:停止
void dc_motor_stop(void)
{ TURN_Z_DCMOTOR=CLOSE;
TURN_F_DCMOTOR=CLOSE;
}
//=================================================================================================
// 数制转换相关程序
//=================================================================================================
uchar change_bcd_to_hex(uchar shu)//转换BCD码成十进制数
{ uchar shu_h;
uchar shu_l;
shu_l=shu&0x0f;
shu_h=shu&0xf0;
shu_h=shu_h>>4;
return (shu_h*10+shu_l);
}
//-------------------------------------------------------------------------------------------------
uchar change_hex_to_bcd(uchar shu)//转换十进制数成BCD码
{ uchar shu_h;
uchar shu_l;
shu_l=shu%10;
shu_h=shu/10;
return ((shu_h<<4)|shu_l);
}
//-------------------------------------------------------------------------------------------------
uchar change_askii_to_hex(uchar askii)//转换ASKII码成HEX,实参范围:30-39、41-46
{ if(askii<=0x39) return(askii-0x30);
else return(askii-0x37);
}
//-------------------------------------------------------------------------------------------------
uchar change_hex_to_askii(uchar data_hex)//HEX转换成ASKII,实参范围:0-9、A-F
{ if(data_hex<=0x09) return(data_hex+0x30);
else return(data_hex+0x37);
}
//=================================================================================================
// 函数功能:将格式为"data1,data2,...datan#" 的字符串中的data数据全部取出,并存储于temporary_data[]
//=================================================================================================
void get_data(uchar * how_much_data)
{
uchar i;
uchar j=0;
uchar k=0;
uchar how_much_temp_askii=0;
uchar temp_askii[5];
uint return_data;
for(i=0; i<strlen(how_much_data); i++)
{
if( (how_much_data[i] != ',') && (how_much_data[i] != '#') )
{
temp_askii[j] = how_much_data[i];
j=j+1;
how_much_temp_askii=how_much_temp_askii+1;
}
else
{j=0;
switch (how_much_temp_askii)
{case 1:{return_data = change_askii_to_hex(temp_askii[0]);
break;
}
case 2:{return_data = change_askii_to_hex(temp_askii[0])*10+
change_askii_to_hex(temp_askii[1]);
break;
}
case 3:{return_data = change_askii_to_hex(temp_askii[0])*100+
change_askii_to_hex(temp_askii[1])*10 +
change_askii_to_hex(temp_askii[2]);
break;
}
case 4:{return_data = change_askii_to_hex(temp_askii[0])*1000+
change_askii_to_hex(temp_askii[1])*100 +
change_askii_to_hex(temp_askii[2])*10 +
change_askii_to_hex(temp_askii[3]);
break;
}
case 5:{return_data = change_askii_to_hex(temp_askii[0])*10000+
change_askii_to_hex(temp_askii[1])*1000 +
change_askii_to_hex(temp_askii[2])*100 +
change_askii_to_hex(temp_askii[3])*10 +
change_askii_to_hex(temp_askii[4]);
break;
}
default:break;
}
temporary_data[k] = return_data;
k=k+1;
how_much_temp_askii=0;
}
}
}
//=================================================================================================
// 函数功能:字符串匹配函数
//=================================================================================================
char * strstr(char * haystack, char * needle)
{ char *ptr1, *ptr2;
weizhi=0;
// Protect against NULL pointer
if (*needle == 0) return(haystack);
for( ; *haystack; haystack++ ,weizhi++)
{// Look for needle in haystack. If there is a
// match then this will continue all the way
// until ptr1 reaches the NULL at the end of needle
for(ptr1 = needle, ptr2 = haystack; *ptr1 && (*ptr1 == *ptr2); ++ptr1, ++ptr2);
// If there is a match then return pointer to needle in haystack
if(*ptr1 == 0) return(haystack);
}
return NULL;// no matching string found
}
//=================================================================================================
// 液晶ST7920驱动程序
//=================================================================================================
// 函数功能:液晶模块初始化
void init_lcd (void)
{
write_lcd (comm,0x30); //6 功能设定:使用基本指令动作,8位控制接口
write_lcd (comm,0x01); //1 清屏:DDRAM全部写20H,地址指针指向00H
write_lcd (comm,0x02); //2 地址归位:地址指针指向00H
write_lcd (comm,0x06); //3 点设定:置光标右移,AC自动加 1,整体显示不移动
write_lcd (comm,0x0c); //4 显示状态设定:置整体显示开,光标关,光标位置不反白闪烁
write_lcd (comm,0x14); //5 光标或显示移位控制:光标右移,AC加 1
}
//--------------------------------------------------
// 函数功能:显示汉字或字符
// 12232C液晶模块的显示结构为:共2行显示,每行可显示15个字符或7个半汉字
// 显示内容可以字符和汉字混排,方法如下:
// 即一个汉字为2字节,一个字符1字节,汉字字符可以穿插,只要保证每行15字节就可正确显示
void chinese_or_character_display (uchar code *char_name)
{
uchar i;
write_lcd (comm,0x30);
write_lcd (comm,0x80);//设定DDRAM地址到地址计数器AC,即第一行显示首址
for (i=0;i<15;i++)
{write_lcd (dat,char_name[i]);//显示第一行内容,要显示字符串
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -