描述:
#include <reg52.h>
#include<stdio.h>
#define jingzhen 11059200UL /*使用22.1184M晶体*/
#define botelv 9600UL /*波特率定义为9600*/
unsigned char zifuchuan[]="abcdefg哈哈"; //待显示字符。
volatile unsigned char sending;
unsigned char i=0,print_flag=0;
unsigned int time=0;
sbit s3=P3^2; //INT0 s3触发关
sbit s2=P3^3; //INT1 s2触发开
sbit led1=P1^0;
sbit led2=P1^1;
void waibuzhongduan_init()
{
//P3|=0x0f;
EA=1; //开启全局中断
EX0=1; //外部中断0开启
IT0=1; //下降沿触发
EX1=1; //外部中断1开启
IT1=1; //下降沿触发
}
void delay(unsigned char i)
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=90;k>0;k--);
}
void Timer0_init() //定时器初始化函数
{
TMOD|=0x20; //设置计数器1的工作方式2
TH1=0xfd; //设置计数器1的初值,决定波特率
TL1=0xfd; //设置计数器1的初值,决定波特率
PCON=0x00; // 波特率倍增0x00不加倍 0x80加倍
SCON=0x50; //设置工作方式1 开启接受允许
EA=1; //开启总中断
ES=1; //开启串口接受中断
TR1=1; //计数器1开始运行
TMOD|=0x01;//选择T016位定时器模式
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;//赋初值
//EA=1;//全局中断开
ET0=1;//T0中断开
TR0=0;// T0计时器关
}
/*void on_off()
{
if(s2==0)
{
delay(10);
if(!s2)
{
while(!s2);
TR0=~TR0;//s2为计时开关
}
}
} */
void display_str ()
{
unsigned int idata times[10];
if(2==i)
{
//sendc(zifuchuan);
sprintf(times,"%d",++time);
ES=0;
TI=1;
printf("%s\n",times);
while(!TI);
TI=0;
ES=1;
i=0;
}
led2=~led2;
}
void main()
{
waibuzhongduan_init();
Timer0_init();
while(1)
{
if(print_flag==1)
display_str();
}
}
void timer0 ()interrupt 1 //中断函数 (50ms)
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;//赋初值
i++;
}
void ITN1 ()interrupt 2 //中断函数 开启定时器
{
print_flag=0;
TR0=1;
led1=~led1;
}
void ITN0()interrupt 0 //中断函数 关闭定时器
{
TR0=0;
display_str();
delay(5);
i=0;//置0
time=0;
print_flag=1;
led1=~led1;
}
解决方案1:
void ITN0()interrupt 0 //中断函数 关闭定时器
这个函数里不要放那么多东西
display_str();
delay(5);
去掉