⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 *本程序四位数码管作倒计时.P0为位选,P1数码管.P3.5输出(低电平).P3.0,P3.1串口通讯.
💻 C
字号:
/**
 *MCU:STC89C51RC;晶振:22.1184M;波特率:19200,无校验,数据位8,停止位1
 *本程序四位数码管作倒计时.P0为位选,P1数码管.P3.5输出(低电平).P3.0,P3.1串口通讯.
 */
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>     //包括一个52标准内核的头文件

/*定义位选*/
sbit D1=P0^7;
sbit D2=P0^6;
sbit D3=P0^5;
sbit D4=P0^4;
sbit P35=P3^5;
//sbit D5=P0^3;
sbit D6=P0^2;
/*数码管数据*/
uchar tempdata[4];
uint count = 0;//倒计时时间(单位:分)
uint flag = 0;//开关标志位
uint temp = 0;//秒计时
#define DT P1 //数码管输出
/*字符集,根据选用数码管共阴(阳)更改*/
unsigned char code dis[11]={
	0XC0,/*0*/
	0XF9,/*1*/
	0XA4,/*2*/
	0XB0,/*3*/
	0X99,/*4*/
	0X92,/*5*/
	0X82,/*6*/
	0XF8,/*7*/
	0X80,/*8*/
	0X90,/*9*/
	0XFF,/*NULL*/
};

/*数码管扫描延时*/
void delay(unsigned int c)
{
	unsigned int i,j;
	for(i=0;i<c;i++)
	for(j=0;j<100;j++);
}
/*数码管显示*/
void  display(unsigned char *x)
{
	DT=dis[*x];//查表
	D1=0;//开位选
	delay(10);//延时显示
	D1=1;//关位选
	
	DT=dis[*(x+1)];
	D2=0;
	delay(10);
	D2=1;
	
	DT=dis[*(x+2)];
	D3=0;
	delay(10);
	D3=1;
	
	DT=dis[*(x+3)];
	D4=0;
	delay(10);
	D4=1;	
/*
	DT=dis[*(x+4)];
	D5=0;
	delay(10);
	D5=1;	

	DT=dis[*(x+5)];
	D6=0;
	delay(10);
	D6=1;	
	*/
}
/*初始化*/
void init() {
	TMOD=0x20; //确定定时器工作模式
	TH1=0xFD;
	PCON&=0x80; //SMOD=1
	TR1=1; //开启定时器1
	SCON=0x50; //串口工作方式1
	IE|=0x90;
	tempdata[0]=10;
	tempdata[1]=10;
	tempdata[2]=10;
	tempdata[3]=10;
//	tempdata[4]=10;
//	tempdata[5]=10;
}
/*计算时间分配数码管位*/
void calCount() {
//	tempdata[5]=10;
//	tempdata[4]=10;
	if(count > 999)
		tempdata[3]=(count/1000)%10;
	else
		tempdata[3]=10;
	if(count > 99)
		tempdata[2]=(count/100)%10;
	else 
		tempdata[2]=10;
	if(count > 9)
		tempdata[1]=(count/10)%10;
	else
		tempdata[1]=10;
	if(count >= 0)
		tempdata[0]=count%10;
	else
		tempdata[0]=10;
}
/*倒计时*/
void deCount() {
	temp++;
	if(temp == 60 && count >= 0) {
			count --;
			temp = 0;
	}
}

void main(void)	
{
	
	RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
	RCAP2L =0x00;	
	TR2=1;	  //启动定时器
//	ET2=1;    //打开定时器2中断
	EA=1;     //打开总中断	
	init();
	while(1)  //程序循环
	{	
		calCount();
		//此处倒计到0时.数码管显示0,若需要全黑.则解开下列注释
	/*	if(count == 0) {
			init();
		}*/
		display(tempdata);
		
		if(flag == 1)
			P35=0;
		if(count > 0) {
			P35=0;
		}
		if(count == 0 && flag == 0){
			ET2 = 0;
			P35=1;
			temp = 0;
		}
	}
}
//定时器2中断
timer2() interrupt 5  
{
	static uchar t;
	TF2=0;
	t++; 
	if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
	{
		t=0;
		deCount();
	}
}
void serial_intr(void) interrupt 4 using 2		//串口中断服务程序
{
	unsigned int refData;
    if(RI)
	{ 
		RI=0;
		ET2=1;
		refData=SBUF&0X0F;
		if(refData == 0){
			flag = 1;
			ET2=0;
			count = 0;
		} else if (refData == 1) {
			flag = 0;
			ET2=0;	
			count = 0;
		} else if (refData == 2) {
			flag = 1;
			count = 0;
			ET2 = 0;
		}else if (refData == 3) {
			flag = 0;
			count = 1;
		} else if (refData == 4) {
			flag = 0;
			count = 2;
		} else if (refData == 5) {
			flag = 0;
			count = 3;
		} else {
			if (flag == 1)
				ET2=0;	
		}			
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -