单片机的一些开发实用技巧
大家知道,51单片机的外部中断只有2个,书本上曾介绍了一种扩展外部中断源的方法,但是需增加硬件开销(见图5)。经或非门引入外中断源输入端(/INT0或/INT1),同时又连到某I/0口。这样,每个“源”都可能引起中断,在中断服务程序中通过软件查询便可确定哪一个是正在申请的中断源,其查询的次序则由中断源优先级决定,这就可实现多个外部中断源的扩展。
图5 这种方法尽管扩展了外部中断源,但也有不尽人意之处,如设计一个具有8个中断源的电路,则需一个8输入端的或非门(或门),显然,对体积与成本都不利。这里介绍笔者设计的扩展外部中断源的方法,由纯软件实现,不添加一个元件(见图6)。
图6 #include < P>
staticunsigned char data m;//m为全局变量
/*-------延时子程序-------*/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i
for(j=0;j<121;j++)
{;}}
}
/*---外部中断INT0子程序---*/
void init0()interrupt 0
{
delay(10);//延时10mS抗抖动干扰
if(P3_2==0)
{
EX0=0;//关INT0中断
EA=0;//关总中断
P3_2=0;//置P3.2为低电平
P2=0xff;//置P2口为全1
m=P2;//读取P2口状态至m
P2=0x00;//恢复P2口为全0
P3_2=1; //置P3.2为高电平
IT0=1;//置INT0为边沿触发
EX0=1; //开INT0中断
EA=1;} //开总中断
}
/********主程序*********/
void main(void)
{
P2=0x00;// 置P2口为全0
P3_2=1;// 置P3.2为高电平
IT0=1;// 置INT0为边沿触发
EX0=1;// 开INT0中断
EA=1; //开总中断
while(1)//无限循环
{
P0=m;//将全局变量m中的内容输出至P0口
P3_0=!P3_0;//P3.0取反,指示程序状态
delay(500);//延时500mS
}
}
程序解释:无按键按下时,P3.0的发光管闪亮,作程序状态显示。主程序初始化时,置P2口为全0,置P3.2为高电平,同时置INT0为边沿触发,并开放中断。8个按键的任一个按下时都会引起INT0中断,进入中断服务子程序后,首先关闭中断,然后置P3.2为低电平,置P2口为全1,再读取P2口状态至m,通过查询m的状态字即可知道正在申请的中断源。这里我们采用的方法是将m输出至P0口点亮LED作指示。退出中断时,重新开放中断。
三。库函数的生成
当将自己开发的程序提供给他人使用但又不便公开源代码时,把源代码做成库函数是一种可行的办法,这样可以保护自己的知识产权及利益,这里我们介绍生成库函数的方法及使用。
/*------------程序名test1.c------------*/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i
for(j=0;j<121;j++)
{;}}
}
1.按照keil的使用方法,建立工程文件test1.uv2并添加上面的源程序test1.c。
2.点击工程,在弹出的下拉菜单中点Options for Target ‘Target 1’,在Output 页面中,选中“Create Library:”后进行编译,则在指定的路径上生成与项目同名的“Lib”文件(图1)。需注意的是,存储模式(Large或Small)应与所使用的系统设置相同。
图1 3. 建立另一个工程文件test2.uv2。
/*------------程序名test2.c------------*/
#include P 晶振频率12.000MHz<>
/****************/
extern void delay(void);
void main (void)//主函数,其功能使P1.0交替输出高、低电平的方波
{
while(1)
{P1_0=!P1_0;
delay();}
}
4.将包含主程序的test2.c及刚才生成的test1.LIB添加到工程中(图2)。在Output 页面中,勾选建立hex文件。
评论