模块

 #include <reg51.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

unsigned char xdata *a;
unsigned char code b[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
while(1)
{
unsigned int i,j;
a=0x8005;

for(i=0;i<6;i++)
{*a=*(b+i);
 for(j=0;j<10000;j++);
 a--;}
}

}

 

 

uchar code seg[]={     //七段码表
0x3f,0x06,0x5b,0x4f,0x66,    //0~4
0x6d,0x7d,0x07,0x7f,0x6f,    //5~9
0x77,0x7c,0x39,0x5e,0x79,    //A~E
0x71,0x40,0x46,0x00     //F,-,-1,全灭

 


void t0_serv() interrupt 1    //定时器0钟中断服务
{ TH0=19453/256;     //重装50ms定时数据
  TL0=19453%256;

 

TMOD=0x01;      //定时器0方式1定时
  TH0=19453/256;     //定时50Ms
  TL0=19453%256;
  count=20;      //配合定时器定时1秒
  IE=0x82;      //开中断
  TR0=1;      //启动定时器

 

void delay_10us(uchar n)    //10微秒级延时
{ do
  { _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
  }while(--n);
}
void delay_ms(uint n)     //毫秒级延时
{ do delay_10us(131);
  while(--n);
}

 


for(i=0;i<8;i++)     //输出ch中8个位
  { DAT_164=ch&0x01;     //从D0位开始向HC164DAT输出位数据
    CLK_164=0;      //制造CLK_164上跳使74HC164移位
    CLK_164=1;
    ch>>=1;      //ch右移1位


disbuf[0]=clk.h/10;     //十时位
  disbuf[1]=clk.h%10;     //时位
  disbuf[2]=clk.m/10;     //十分位
  disbuf[3]=clk.m%10;     //分位
  disbuf[4]=clk.s/10;     //十秒位
  disbuf[5]=clk.s%10;     //秒位

 

void delay_1ms()
  {
   unsigned int i;
   for (i=0;i<1140;i++);

 

//--------10ms延时子程序-------------
void delay10ms(unsigned char time)
{
unsigned char a,b,c;
for(a=0;a<time;a++)
for(b=0;b<10;b++)
  for(c=0;c<120;c++);
}

 

static unsigned char sts=0; 
7.       static unsigned char i=0; // (0≤i≤7) 循环刷新显示,由于是静态变量,此赋值只做一次。   

8.        P2 = 0xff;  //显示消隐,以免下一段码值显示在前一支SLED   
19.   void Timer0Init( void )   

20.   { TMOD=(TMOD & 0xf0) | 0x01; //初始化,定时器T0,工作方式1   

21.    TL0 = -1000; //定时1ms   

22.    TH0 = (-1000)>>8;   

23.    TR0 = 1;   //允许T0开始计数   

24.    ET0 = 1;   //允许T0计数溢出时产生中断请求   

25.   }   


基础知识:C51单片机编程基础

单片机的外部结构:

DIP40双列直插;
P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)
电源VCC(PIN40)和地线GND(PIN20);
高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)
内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)
程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)
P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1
单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)

四个8位通用I/O端口,对应引脚P0、P1、P2和P3;
两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)
一个串行通信接口;(SCON,SBUF)
一个中断控制器;(IE,IP)
针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。

C语言编程基础:

十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
++var表示对变量var先增一;var—表示对变量后减一。
x |= 0x0f;表示为 x = x | 0x0f;
TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;}
在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P1.3   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P1_3 = 1;   //给P1_3赋值1,引脚P1.3就能输出高电平VCC   

5.        While( 1 );  //死循环,相当 LOOP: goto LOOP;   

6.       }  


注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。

在某引脚输出低电平的编程方法:(比如P2.7引脚)

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P2.7   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P2_7 = 0;   //给P2_7赋值0,引脚P2.7就能输出低电平GND   

5.        While( 1 );  //死循环,相当 LOOP: goto LOOP;   

6.       }  

在某引脚输出方波编程方法:(比如P3.1引脚)

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P3.1   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

5.        {   

6.       P3_1 = 1;  //给P3_1赋值1,引脚P3.1就能输出高电平VCC   

7.         P3_1 = 0;  //给P3_1赋值0,引脚P3.1就能输出低电平GND   

8.        }    //由于一直为真,所以不断输出高、低、高、低……,从而形成方波   

9.       }  

将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) )

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P1_1 = 1;   //初始化。P1.1作为输入,必须输出高电平   

5.       While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

6.        {   

7.       if( P1_1 == 1 )  //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC   

8.         { P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND   

9.         else     //否则P1.1输入为低电平GND   

10.     //{ P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND   

11.     { P0_4 = 1;  } //给P0_4赋值1,引脚P0.4就能输出高电平VCC   

12.    }    //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平   

13.   }  

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P3 = 0xff;  //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平   

5.       While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

6.        {    //取反的方法是异或1,而不取反的方法则是异或0   

7.       P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出   

8.        }    //由于一直为真,所以不断将P3取反输出到P2   

9.       }  


注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。

 

#ee0000; FONT-FAMILY: 宋体">初始化。P1.1作为输入,必须输出高电平   

5.       While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

6.        {   

7.       if( P1_1 == 1 )  //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC   

8.         { P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND   

9.         else     //否则P1.1输入为低电平GND   

10.     //{ P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND   

11.     { P0_4 = 1;  } //给P0_4赋值1,引脚P0.4就能输出高电平VCC   

12.    }    //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平   

13.   }  

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P3 = 0xff;  //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平   

5.       While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

6.        {    //取反的方法是异或1,而不取反的方法则是异或0   

7.       P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出   

8.        }    //由于一直为真,所以不断将P3取反输出到P2   

9.       }  


注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。

   TMOD=0x01;             //设定定时器0为工作方式1
   TH0=0xEC;
   TL0=0x78;                //设定计时器5ms延时

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/

TMOD=0x01;
TH0=-(4800/256);
TL0=-(4800%256);
IE=0x82;
TR0=1;


F0:if(P2_4==0)goto F0; /*按键未释放,在此等候*/


//---------------------------------------------------
#include <reg52.h>
//---------------------------------------------------
//重定义I/0引脚名称
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;

sbit P13=P1^3;
//---------------------------------------------------
//全局变量及位标志定义
bit FINT0;
bit FINT1;
bit FT0;
bit FT1;
bit FT2;

unsigned char T0_10ms;
unsigned char T0_50ms;
unsigned char T0_100ms;
//---------------------------------------------------
//固定函数声明
void int_0();       //外部中断0
void int_1();       //外部中断1
void timer_0();     //定时器中断1
void timer_1();     //定时器中断2
void serial_1();    //串行中断1
void serial_2();    //串行中断2
//---------------------------------------------------
//用户函数声明
void initial();     //初始化


//---------------------------------------------------
void main(){
 initial();

 while(1){

        P13=0;          //为了使按'取消'、'确定'键能够产生INT0及INT1中断
        //led4=0;       //上一句等价于此句
 
        if(FINT0){      //中断0来到要做什么事情
   FINT0=0;
   led1=0;     //INT0中断时点亮
   led2=0;    
   led3=0;
   led3=0;  //可以在此设一个断点
  }
  if(FINT1){      //中断1来到要做什么事情
   FINT1=0;   
   led1=1;     //INT1中断时熄灭
   led2=1;
   led3=1;
  }
        if(FT0){
            FT0=0;
            if(++T0_10ms>30){
                T0_10ms=0;
                //定时多少做什么事,未初始化里定时器尚未设置
            }
        }
 }
}
//-------------------------------------------------------------------
void initial(){
 EA=1;               // CPU所有中断开(IE最高位MSB)

 EX0=1;              // INT0中断开
 IT0=0;              // INT0低电平触发(为1则为下降沿触发)

 EX1=1;              // INT1中断开
 IT1=0;              // INT1低电平触发(为1则为下降沿触发)

 return;
}
//-------------------------------------------------------------------
//INT0中断  由P3.2引脚产生
void int_0() interrupt 0 using 0
{
    FINT0=1;
}
//-------------------------------------------------------------------
//INT1中断  由P3.3引脚产生
void int_1() interrupt 2 using 1
{
 FINT1=1;
}
//-------------------------------------------------------------------
//定时器0中断
void timer_0() interrupt 1 using 2
{
 FT0=1;
}
//-------------------------------------------------------------------
//定时器1中断
void timer_1() interrupt 3 using 3
{
 FT1=1;
}
//-------------------------------------------------------------------
//串行中断1
void serial_1() interrupt 4
{

}
//-------------------------------------------------------------------
//定时器2中断
void timer_2() interrupt 5
{
 FT2=1;
}
//-------------------------------------------------------------------


unsigned char tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};共阳极

 

 

#include <reg51.h>
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>

unsigned char xdata *a;
unsigned char code b[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
while(1)
{
unsigned int i,j;
a=0x8005;

for(i=0;i<6;i++)
{*a=*(b+i);
 for(j=0;j<10000;j++);
 a--;}
}

}

 

 

uchar code seg[]={     //七段码表
0x3f,0x06,0x5b,0x4f,0x66,    //0~4
0x6d,0x7d,0x07,0x7f,0x6f,    //5~9
0x77,0x7c,0x39,0x5e,0x79,    //A~E
0x71,0x40,0x46,0x00     //F,-,-1,全灭

 


void t0_serv() interrupt 1    //定时器0钟中断服务
{ TH0=0x3c;     //重装50ms定时数据
  TL0=0xb0;

 

  TMOD=0x01;      //定时器0方式1定时
  TH0=0x3c;     //定时50Ms
  TL0=0xb0;
  count=20;      //配合定时器定时1秒
  IE=0x82;      //开中断
  TR0=1;      //启动定时器

 

void delay_10us(uchar n)    //10微秒级延时
{ do
  { _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
  }while(--n);
}
void delay_ms(uint n)     //毫秒级延时
{ do delay_10us(131);
  while(--n);
}

 


for(i=0;i<8;i++)     //输出ch中8个位
  { DAT_164=ch&0x01;     //从D0位开始向HC164DAT输出位数据
    CLK_164=0;      //制造CLK_164上跳使74HC164移位
    CLK_164=1;
    ch>>=1;      //ch右移1位


disbuf[0]=clk.h/10;     //十时位
  disbuf[1]=clk.h%10;     //时位
  disbuf[2]=clk.m/10;     //十分位
  disbuf[3]=clk.m%10;     //分位
  disbuf[4]=clk.s/10;     //十秒位
  disbuf[5]=clk.s%10;     //秒位

 

void delay_1ms()
  {
   unsigned int i;
   for (i=0;i<1140;i++);

 

//--------10ms延时子程序-------------
void delay10ms(unsigned char time)
{
unsigned char a,b,c;
for(a=0;a<time;a++)
for(b=0;b<10;b++)
  for(c=0;c<120;c++);
}

 

static unsigned char sts=0; 
7.       static unsigned char i=0; // (0≤i≤7) 循环刷新显示,由于是静态变量,此赋值只做一次。   

8.        P2 = 0xff;  //显示消隐,以免下一段码值显示在前一支SLED   
19.   void Timer0Init( void )   

20.   { TMOD=(TMOD & 0xf0) | 0x01; //初始化,定时器T0,工作方式1   

21.    TL0 = -1000; //定时1ms   

22.    TH0 = (-1000)>>8;   

23.    TR0 = 1;   //允许T0开始计数   

24.    ET0 = 1;   //允许T0计数溢出时产生中断请求   

25.   }   


基础知识:C51单片机编程基础

单片机的外部结构:

DIP40双列直插;
P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)
电源VCC(PIN40)和地线GND(PIN20);
高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)
内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)
程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)
P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1
单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)

四个8位通用I/O端口,对应引脚P0、P1、P2和P3;
两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)
一个串行通信接口;(SCON,SBUF)
一个中断控制器;(IE,IP)
针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。

C语言编程基础:

十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
++var表示对变量var先增一;var—表示对变量后减一。
x |= 0x0f;表示为 x = x | 0x0f;
TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;}
在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P1.3   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P1_3 = 1;   //给P1_3赋值1,引脚P1.3就能输出高电平VCC   

5.        While( 1 );  //死循环,相当 LOOP: goto LOOP;   

6.       }  


注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。

在某引脚输出低电平的编程方法:(比如P2.7引脚)

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P2.7   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P2_7 = 0;   //给P2_7赋值0,引脚P2.7就能输出低电平GND   

5.        While( 1 );  //死循环,相当 LOOP: goto LOOP;   

6.       }  

在某引脚输出方波编程方法:(比如P3.1引脚)

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P3.1   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

5.        {   

6.       P3_1 = 1;  //给P3_1赋值1,引脚P3.1就能输出高电平VCC   

7.         P3_1 = 0;  //给P3_1赋值0,引脚P3.1就能输出低电平GND   

8.        }    //由于一直为真,所以不断输出高、低、高、低……,从而形成方波   

9.       }  

将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) )

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P1_1 = 1;   //初始化。P1.1作为输入,必须输出高电平   

5.       While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

6.        {   

7.       if( P1_1 == 1 )  //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC   

8.         { P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND   

9.         else     //否则P1.1输入为低电平GND   

10.     //{ P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND   

11.     { P0_4 = 1;  } //给P0_4赋值1,引脚P0.4就能输出高电平VCC   

12.    }    //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平   

13.   }  

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P3 = 0xff;  //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平   

5.       While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

6.        {    //取反的方法是异或1,而不取反的方法则是异或0   

7.       P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出   

8.        }    //由于一直为真,所以不断将P3取反输出到P2   

9.       }  


注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。

 

#ee0000; FONT-FAMILY: 宋体">初始化。P1.1作为输入,必须输出高电平   

5.       While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

6.        {   

7.       if( P1_1 == 1 )  //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC   

8.         { P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND   

9.         else     //否则P1.1输入为低电平GND   

10.     //{ P0_4 = 0;  } //给P0_4赋值0,引脚P0.4就能输出低电平GND   

11.     { P0_4 = 1;  } //给P0_4赋值1,引脚P0.4就能输出高电平VCC   

12.    }    //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平   

13.   }  

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )

代码

1.       #include  //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3   

2.       void main( void )  //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口   

3.       {   

4.        P3 = 0xff;  //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平   

5.       While( 1 )  //非零表示真,如果为真则执行下面循环体的语句   

6.        {    //取反的方法是异或1,而不取反的方法则是异或0   

7.       P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出   

8.        }    //由于一直为真,所以不断将P3取反输出到P2   

9.       }  


注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。

   TMOD=0x01;             //设定定时器0为工作方式1
   TH0=0xEC;
   TL0=0x78;                //设定计时器5ms延时

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/

TMOD=0x01;
TH0=-(4800/256);
TL0=-(4800%256);
IE=0x82;
TR0=1;


F0:if(P2_4==0)goto F0; /*按键未释放,在此等候*/
//---------------------------------------------------
#include <reg52.h>
//---------------------------------------------------
//重定义I/0引脚名称
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;

sbit P13=P1^3;
//---------------------------------------------------
//全局变量及位标志定义
bit FINT0;
bit FINT1;
bit FT0;
bit FT1;
bit FT2;

unsigned char T0_10ms;
unsigned char T0_50ms;
unsigned char T0_100ms;
//---------------------------------------------------
//固定函数声明
void int_0();       //外部中断0
void int_1();       //外部中断1
void timer_0();     //定时器中断1
void timer_1();     //定时器中断2
void serial_1();    //串行中断1
void serial_2();    //串行中断2
//---------------------------------------------------
//用户函数声明
void initial();     //初始化


//---------------------------------------------------
void main(){
 initial();

 while(1){

        P13=0;          //为了使按'取消'、'确定'键能够产生INT0及INT1中断
        //led4=0;       //上一句等价于此句
 
        if(FINT0){      //中断0来到要做什么事情
   FINT0=0;
   led1=0;     //INT0中断时点亮
   led2=0;    
   led3=0;
   led3=0;  //可以在此设一个断点
  }
  if(FINT1){      //中断1来到要做什么事情
   FINT1=0;   
   led1=1;     //INT1中断时熄灭
   led2=1;
   led3=1;
  }
        if(FT0){
            FT0=0;
            if(++T0_10ms>30){
                T0_10ms=0;
                //定时多少做什么事,未初始化里定时器尚未设置
            }
        }
 }
}
//-------------------------------------------------------------------
void initial(){
 EA=1;               // CPU所有中断开(IE最高位MSB)

 EX0=1;              // INT0中断开
 IT0=0;              // INT0低电平触发(为1则为下降沿触发)

 EX1=1;              // INT1中断开
 IT1=0;              // INT1低电平触发(为1则为下降沿触发)

 return;
}
//-------------------------------------------------------------------
//INT0中断  由P3.2引脚产生
void int_0() interrupt 0 using 0
{
    FINT0=1;
}
//-------------------------------------------------------------------
//INT1中断  由P3.3引脚产生
void int_1() interrupt 2 using 1
{
 FINT1=1;
}
//-------------------------------------------------------------------
//定时器0中断
void timer_0() interrupt 1 using 2
{
 FT0=1;
}
//-------------------------------------------------------------------
//定时器1中断
void timer_1() interrupt 3 using 3
{
 FT1=1;
}
//-------------------------------------------------------------------
//串行中断1
void serial_1() interrupt 4
{

}
//-------------------------------------------------------------------
//定时器2中断
void timer_2() interrupt 5
{
 FT2=1;
}
//-------------------------------------------------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值