#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;
}
//-------------------------------------------------------------------