资源下载(CSDN):http://download.csdn.net/download/zhlechn/5868923
/**********************************************************************
通用配置函数
说明:通用配置函数,包含一些基本的定义。另外嵌入普通 UART 串口函数
,即用 SBUF 的编的那种(生成代码小),而不是库里 ZL_UART.h 里用
printf 编的那种(生成代码大)。
示例:
##define C51MCU
#include "C51MCU.h"
//#include "ZL_UART.h" //不包含也可以,因为 C51MCU.h 里也含 UART 函数,只不过没 ZL_UART.h 里的函数用着方便
static void delay(ui time)
{
uc j;
for(;time>0;time--)
for(j=110;j>0;j--);
}
void main(void)
{
init_UART(11.0592,9600);
while(1)
{
send_UART(0xFF);
delay(1500);
send_UART(0x60);
delay(1500);
send_UART(0x09);
delay(1500);
send_UART(0x00);
delay(1500);
send_UART(0xFF);
delay(1500);
}
}
void serial() interrupt 4 using 2 //串口中断程序(STC12C5A60S2)
{
if(RI) //后来的添加,为了优化算法而加,防止在执行主函数的send_UART时,同时执行了中断域内的算法
{
if(rece_UART()==0X06)
P0=0xF0;
else
P0=0xff;
send_UART(rece_UART());
}
}
附注:
对于所有工程,请在 Options for Target 里将
Memory Model 设为 Large : variables in XDATA;
Code Rom Size 设为 Large : program
否则有的工程可能非语法错误出错。
都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
E-mail : [email protected]
后续更新中....
2013 By 赵磊
**********************************************************************/
#pragma message ("欢迎使用本 C51 库(Version: 3.718; Author: 赵磊),请大家在了解硬件和C语言的情况下使用本库。")
#ifndef _C51MCU_H_
#define _C51MCU_H_
#ifdef C51MCU
#include "reg52.h"
#undef C51MCU
#endif
#ifdef STC12
#include "stc12c5a60s2.h"
#undef STC12
#endif
#define uc unsigned char
#define ui unsigned int
/*
typedef struct bitf
{
uc bit0 : 1;
uc bit1 : 1;
uc bit2 : 1;
uc bit3 : 1;
uc bit4 : 1;
uc bit5 : 1;
uc bit6 : 1;
uc bit7 : 1;
}BIT;
*/
typedef enum port
{
PORT0, PORT1, PORT2, PORT3,
P00 = 00, P01, P02, P03, P04, P05, P06, P07,
P10 = 10, P11, P12, P13, P14, P15, P16, P17,
P20 = 20, P21, P22, P23, P24, P25, P26, P27,
P30 = 30, P31, P32, P33, P34, P35, P36, P37,
}PORTx;
#pragma message ("不足或错误之处还请联系我,谢谢! E-mail : [email protected]")
extern void set_IO(uc PORT ,bit TTL); //内部使用
extern void turn_IO(uc PORT); //内部使用
extern bit read_IO(uc PORT); //内部使用
/************************************************************************************
///////////////////////最下面 2 个是通过 SBUF 缓冲写的,可以进行单片机///////////////////
//////////////////////与单片机间、单片机与电脑间、单片机与其它串口器///////////////////
//////////////////////件之间的通信。且是双向的。 ////////////////////
************************************************************************************/
extern void init_UART(float MHZ,ui baud); //MHZ:晶振值(11.0592 or 12.0)。 baud : 波特率(12MHZ下可选择:1200,2400,4800,7200)
// (11.0592MHZ下可选择:1200,2400,4800,7200,9600,14400,19200)
extern uc rece_UART(); //接收串口发来的数据
extern void send_UART(uc dat); //通过串口发送数据
#endif
/***************************************************************
4*4矩阵键盘函数
说明:使用了全局变量 g_key ,所以需要在主函数所在的 main.c
中声明 uc g_key;
如果连接没错的话 (连接见图片(捕获.PNG)),按不同的
按键 g_key 将被赋予 1—16 之间的不同的值;
g_key=1 代表第一排第1个按键;
g_key=2 代表第一排第2个按键;
g_key=3 代表第一排第3个按键;
g_key=4 代表第一排第4个按键;
g_key=5 代表第二排第1个按键;
g_key=6 代表第二排第2个按键;
.
.
.
使用:(如P3口)
第一行接P30 ;第二行接P31 ;第三行接P32 ;第四行接P33 ;
第一列接P34 ;第二列接P35 ;第三列接P36 ;第四列接P37 ;
示例:
#define C51MCU //定义单片机使用类型
#include "C51MCU.h"
#include "ZL_matrix_key.h"
uc g_key;
void main()
{
while(1)
{
matrix_key(PORT3); //矩阵键盘扫描(接P3口)
if(g_key == 2)
P0=0x00;
else
P0=0xff;
}
}
附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
E-mail : [email protected]
后续更新中....
2013 By 赵磊
******************************************************************/
#ifndef _ZL_matrix_key_H_
#define _ZL_matrix_key_H_
extern uc g_key;
extern void matrix_key(PORTx); // PORTx:定义矩阵键盘的接口....(可取 PORT0 PORT1 PORT2 PORT3)
#endif
/***************************************************************
步进电机函数(已测)
说明:此函数以28BYJ48减速电机为例(其他步进电机也适用,比如
48BYJ等),其减速比为1:64,若没有减速齿轮步进角为5.625°,
现在减速为原来的1/64,因此实际步进角为5.625/64≈0.0879°。
每8步约0.7°,即每调用一次函数转0.7° 。
示例:
#define C51MCU
#include "C51MCU.h"
#include "ZL_step_motor.h"
void main()
{
ui i;
init_step_motor(P20,P21,P22,P23);
for(i=514;i>0;i--) //正转0.7*514≈360°
step_forward(100); //不同单片机调节其传递的参数的值
for(i=514;i>0;i--) //正转0.7*514≈360°
step_backward(100);
}
附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
E-mail : [email protected]
后续更新中....
2013 By 赵磊
******************************************************************/
#ifndef _ZL_step_motor_H_
#define _ZL_step_motor_H_
extern void init_step_motor(PORTx blue,PORTx pink,PORTx yellow,PORTx orange);// 分别对应 blue,pink,yellow,orange 的接口情况。
// 比如 init_step_motor_IO(P20,P21,P22,P23); 必须初始化。
extern void step_backward(uc spe); //一 - 二相励磁,共8步。1-2-3-4-5-6-7-8-1-2....。参数 spe 表示速度,传递不同值可以调速 (每调用一次函数转0.7°)
extern void step_forward(uc spe); //一 - 二相励磁,共8步。8-7-6-5-4-3-2-1-8-7....。但是 spe 不能过大,也不能过小。且不同 (每调用一次函数转0.7°)
// 单片机 spe 也不同 。
#endif
/***************************************************************
1602 LCD函数(已测)
说明:需设置 Options for Target ---> Memory Model 为 Large :variables in XDATA。否则出错。
液晶显示地址(内部RAM,大小为80B):00|01|02...0e|0f 10|11|12...1f|20|21......27 (40B)
40|41|42...4e|4f 50|51|52...5f|60|61......67 (40B)
命令(order)说明: 0x01:数据指针和显示清0;
0x02:数据指针清0;
0x14:光标右移;
0x10:光标左移;
0x20:左清除一位显示;
0x38:设置模式为16*2显示,5*8阵,8位接口;
0x1c:整屏右移,光标跟随;
0x18:整屏左移,光标跟随;
0x04:读或写一个字符时,指针减1,光标减1,整屏显示不移动;
0x06:读或写一个字符时,指针加1,光标加1,整屏显示不移动;
0x05:整屏显示右移,得到光标不移动而屏幕移动的效果(读或写一个字符时,指针减1,光标减1);
0x07:整屏显示左移,得到光标不移动而屏幕移动的效果(读或写一个字符时,指针加1,光标加1);
00001DCB:D=1开显示,D=0关显示; C=1显示光标,C=0不显示光标;B=1光标闪烁,B=0光标不闪烁。
示例:
#define C51MCU
#include "C51MCU.h"
#include "ZL_1602.h"
void main()
{
init_1602_IO(P10,P11,P12,PORT0);
init_1602(0x38,0x0c,0x06,0x01);
dis1602_str1("13232",200);
w_order(0x01); //清屏
dis1602_str2(0x01,"gigi",50); //清屏
dis1602_var(0x40,"%d",-562);
while(1);
}
附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
E-mail : [email protected]
后续更新中....
2013 By 赵磊
******************************************************************/
#ifndef _ZL_1602_H_
#define _ZL_1602_H_
extern void w_order(uc command); //写命令
extern void w_data(uc dat); //写数据
extern void w_addr(uc z); //写地址
extern void init_1602_IO(PORTx rs,PORTx rw,PORTx e,PORTx); //分别对应 rs/rw/e/并口数据 接口。 init_1602_IO(P26,P25,P27,PORT0);
extern void init_1602(uc order1,uc order2,uc order3,uc order4); //初始化命令,即实现不同的显示方式,默认为 init_1602(0x38,0x0c,0x06,0x01)
extern void dis1602_str1(uc a1[50],ui spe); //显示模式1(a1[50] : 要显示的字符串数组,将字符串数组的首地址传递过来)(注:未使用指针)(spe默认200)
extern void dis1602_str2(uc addr,uc a2[16],ui spe); //显示模式2(短字符串、位置自定模式,16个)(addr:显示位置,第一行从0x00开始)(spe:显示速度,默认50)
extern void dis1602_var(uc addr,const uc *,float); //显示模式3(变量显示、位置自定)(addr:显示位置,第二行从0x40开始)
// (float: 要显示的变量(这里不论整型、字符型、浮点型都用float代替))
//const uc * :字符串传递,即说明传递类型,内只编了3种,即 %d %c %f (保留3位小数)
// 示例 :dis1602_num(0x40,"%f",-545.76)
#endif