很全的C51库函数(通用配置、矩阵键盘、步进电机、1602函数)


组织结构树:



资源下载(CSDN):http://download.csdn.net/download/zhlechn/5868923


通用配置头文件(C51MCU.h)

/**********************************************************************
						
							通用配置函数
						
	说明:通用配置函数,包含一些基本的定义。另外嵌入普通 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矩阵键盘函数头文件(ZL_matrix_key.h)

/***************************************************************

						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

步进电机函数头文件(ZL_step_motor.h)

/***************************************************************

						步进电机函数(已测)

	说明:此函数以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函数头文件(ZL_1602.h)

/***************************************************************

						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																	
																	
																	
																	

其它,见下一篇。。。

注:*.c文件后续发布


你可能感兴趣的:(硬件编程(C51))