51单片机复习程序例举002
扫描二维码
随时随地手机看文章
1、使用外部中断INT0使P0口的8位LED灯的状态进行翻转
/******************************************************************************
*说明:AT89S52芯片,12M晶振
*中断服务程序voidname(void)interruptmusingn{中断时要执行的程序代码}
*修饰符1:interruptm:将该函数转化成中断函数,
*m=0--5分别对应:INT0,T0,INT1,T1,ES,T2
*修饰符1:usingn:指定本函数内部使用的寄存器组,可省略-->系统自行分配
*n=0--3表示寄存器组号
*本程序:使用外部中断INT0使P0口的8位LED灯的状态进行翻转
******************************************************************************/
#include
sbitSMG=P2^0;//要选通的数码管
sbitINT0_KEY=P3^2;//单片机INT0引脚(连接了一个独立按键)
/******************************************************************************
*名称:delay1ms()
*功能:延时1ms
*参数:intt
*返回:无
******************************************************************************/
voiddelay1ms(intt)
{
unsignedchari;
while(t--)
{
for(i=0;i<125;i++)
{
;
}
}
}
/******************************************************************************
*名称:INT0_Init()
*功能:初始化外部中断INT0
*参数:无
*返回:无
******************************************************************************/
voidINT0_Init(void)
{
/*------------------初始化中断-------------------*/
//1、配置定时器中断控制寄存器TCON:
//TCON:TF1,TR1,TF0,TR0,|IE1,IT1,IE0,IT0
IT0=0;
//2、配置中断允许寄存器IE:
//IE:EA,-,ET2,ES,ET1,EX1,ET0,EX0
EA=1;
EX0=1;
//3、配置优先级控制寄存器IP:(可不配置,默认按低优先级列表顺序排优先级)
//IP:-,-,PT2,PS,PT1,PX1,PT0,PX0
IP=0x00;
}
voidmain(void)
{
INT0_Init();//初始化中断
P0=0x00;//点亮P0口的LED灯
while(1)
{
;
}
}
/******************************************************************************
*名称:voidLED0_int0(void)
*功能:中断服务程序,实现P0口的8位LED状态翻转
*修饰符1:interrupt0:将该函数转化成中断INT0的中断服务程序
*修饰符2:using0:本函数内使用工作寄存器组0,可省略不写,系统自动分配
******************************************************************************/
voidLED0_int0(void)interrupt0using0
{
//1、判断是否中断源有按键按下,对按键进行软件消抖(单片机INT0引脚接了独立按键)
if(INT0_KEY==0)
{
delay1ms(15);
if(INT0_KEY==0)
{
//2、等待按键释放
while(!INT0_KEY)
{;}
//3、按键释放后,将P0端口的状态进行翻转
P0=~P0;
}
}
}
/******************************************************************************
*说明:AT89S52芯片,12M晶振
*中断服务程序voidname(void)interruptmusingn{中断时要执行的程序代码}
*修饰符1:interruptm:将该函数转化成中断函数,
*m=0--5分别对应:INT0,T0,INT1,T1,ES,T2
*修饰符1:usingn:指定本函数内部使用的寄存器组,最好省略-->系统自行分配
*n=0--3表示寄存器组号
*本程序:使用外部中断INT0增加数码管显示的数值,INT1减少数码管显示的值
******************************************************************************/
#include
sbitINT0_KEY=P3^2;//单片机INT0引脚(连接了一个独立按键)
sbitINT1_KEY=P3^3;//单片机INT1引脚(连接了一个独立按键)
sbitSMG=P2^0;//要选通的数码管
intkey_num;
unsignedcharcodekey_code[]={0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
unsignedcharcodeS8[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF};
//数组名前加code作用:将静态数组S8[16]存到AT89S52外部的8K的ROM中,而不是内部的256字节的RAM中。
//这样就节省了芯片内部宝贵的RAM资源。
//但是动态的(在程序运行过程中要发生变化的)变量或数组不能存放在外部的ROM中,变量名前面加code程序会出错
/******************************************************************************
*名称:delay1ms()
*功能:延时1ms
*参数:intt
*返回:无
******************************************************************************/
voiddelay1ms(intt)
{
unsignedchari;
while(t--)
{
for(i = 0 ; i < 125 ; i++)