📄 main.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 + -