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; // 清除数据传送标志
}*/
}
}