51mini板程序3

  • 格式:doc
  • 大小:42.50 KB
  • 文档页数:6

//实验三:中断使用

//基本要求:

1.理解中断的执行

2.学会单片机的定时器中断

3.完成电子钟程序

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

//定时器中断程序

#include

//

void Timer1() interrupt 3

{

unsigned int num;

TF1=0;

TR1 = 0; //暂时停止定时器(在重新设置初值之前必须暂停)

TH1 = 0xfc;

TL1 = 0x66; //重新设置定时器初值,设置时间为1ms

TR1 = 1; //重新启动定时器

if(num==1000) //是否定时了1000次,1ms的时间

{

num=0;

P3=~P3; //P3取反

}

else

num++;

}

///////////////////main()//////////////

void main()

{

EA = 0;//EA=0 中断总禁止,禁止所有中断。

TMOD &= 0x0F;//

TMOD |= 0x10;/*

GATE=0以运行控制位TR启动定时器

C/T=0定时工作方式

M1、M0=01 方式1

*/

TH1 = 0xfc;//给定时器计数器的高八位赋值

TL1 = 0x66;//给定时器计数器的低八位赋值

/*

计算方法: 定时时间=(2exp16一计数初值)×晶振周期×12

采用11.0592MHz的晶振,定时时间1ms

*/

TR1 = 1;//定时器1开始计时

TF1=0;

EA=1;

ET1=1;

while(1)

{

;

}

}

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

//时钟程序

#include

#define uchar unsigned char

#define uint unsigned int

unsigned char DispBuf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

uchar hour=12,minute=0,second=0,set_flag=0;//

uint m_second_1=0;

uchar led_bit=0;//

code unsigned char com[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

code unsigned char Tab[] =

{//定义0123456789-的数码管字型数据,按gfedcba的顺序/////// -

0x3F,0x06,0x5B,0x4F,0x66, //////0X40

0x6D,0x7D,0x07,0x7F,0x6F,0x40 ////////

};

/*

函数:T1INTSVC()

功能:定时器T1的中断服务函数

说明: 晶振频率为11.0592MHz

定时器初值=65536-T*(f0/12),其中f0为晶振频率,T为定时时间

*/

void T1INTSVC() interrupt 3

{

TR1 = 0; //暂时停止定时器(在重新设置初值之前必须暂停)

TH1 = 0xfc;

TL1 = 0x66; //重新设置定时器初值,设置时间为1ms

TR1 = 1; //重新启动定时器

/***********计时任务********************/

if(m_second_1>=999)

{

m_second_1=0;

if(second==59)

{

second=0;

if(minute==59)

{

minute=0;

if(hour==12)

{

hour=1;

}

else hour++;

}

else minute++;

}

else second++;

}

else m_second_1++;

/*******************数码管动态扫描******************/

if(led_bit>7) led_bit=0;

P3 = 0xFF; //暂停显示

P2 =DispBuf[led_bit];

P3 =~com[led_bit]; //重新显示

led_bit++;

}

/*

函数:SysInit()

功能:系统初始化

*/

void SysInit()

{

EA = 0;//关闭总中断

TMOD &= 0x0F;//定时器1工作在模式1

TMOD |= 0x10;

TH1 = 0xfc;//定时器赋初值

TL1 = 0x66;

TR1 = 1;//定时器1开始工作

ET1 = 1;//定时器1中断使能

EA = 1;//总中断使能

}

/****************main()***********************/

void main()

{

SysInit();

while(1)

{

/******数码管显示内容*********/

/*第一,二个数码管显示秒钟*/

DispBuf[0]=Tab[second%10];

DispBuf[1]=Tab[second/10];

/*第三个数码管显示-*/

DispBuf[2]=Tab[10];//小数点灭

/*第四,五个数码管显示分钟*/

DispBuf[3]=Tab[minute%10];

DispBuf[4]=Tab[minute/10];

/*第六个数码管显示-*/

DispBuf[5]=Tab[10];

/*第七,八个数码管显示时钟*/

DispBuf[6]=Tab[hour%10];

DispBuf[7]=Tab[hour/10];

}

}

//实验四:串口使用

//基本要求:

1.会使用51单片机的串口,查询方式和中断方式

2. 编写一个接收并显示PC串口发送过来的数据的程序。

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

******************************************************************************** 描述:

*

* com.c

单片机接收主机的数据,将数据加1, 并传回给主机; *

*

*

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

#include

/*

函数:UartINTSVC

功能:串行口中断服务程序

*/

unsigned char c;

void UartINTSVC() interrupt 4

{

if ( RI ) //接收中断

{

c = SBUF;

RI = 0;

c++;

SBUF =c ;

}

}

void main(void)

{

//unsigned char tmp=0;

TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率

TH1 = 0xFD; // 波特率9600

TL1 = 0xFD;

SCON = 0x50; // 设定串行口工作方式 PCON &= 0xef; // 波特率不倍增

TR1 = 1; // 启动定时器1

//IE = 0x00; // 禁止任何中断

ES = 1; //允许串行口中断

EA = 1; //允许中断

while(1)

{

/* if(RI) // 是否有数据到来

{

RI = 0;

tmp = SBUF; // 暂存接收到的数据

P2 = tmp; // 数据传送到P0口

SBUF = tmp+1;

while(!TI); // 等特数据传送

TI = 0; // 清除数据传送标志

}*/

}

}