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

📄 myproj.c

📁 暑假为学生培训写的51相关接口的所有源码及项目代码
💻 C
字号:
#include <reg52.h>
typedef unsigned char BYTE;
BYTE iNum;//当前秒表值
BYTE iInit;//倒计时初值
BYTE iTimes;//用于精确到秒
BYTE iMode;//定时器工作模式
BYTE iFunc;//当前按钮功能
BYTE iCMD;//接收到的命令
BYTE iDATA0;//接收到的参数0
BYTE iDATA1;//接收到的参数1
bit bState;//功能键状态 0为操作主菜单 1为操作子菜单
BYTE TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
BYTE RECVBUF[16];//接收缓冲区
BYTE iRECVNUM;//接收到的个数
void ExcuteCMD();//处理子程序
void Delay(int i);//延时子程序
void DispNum(void);//显示LED程序
void DispLed(void);//显示数码子程序
void CopyM(char des[],char src[],int iCnt);//显示LED程序
void ClearM(char src[],int iCnt);//显示数码子程序
void main()
{
    SP=0x60;	
    iNum=0x01;
	iTimes=0x10;
	P2=0x00;
	P0=0xff;
	TMOD=0x21;
	TH1=0xfd;
	TL1=0xFd;
	TH0=0x00;
	TL0=0x00;
	SCON=0x50;
	PCON=0x80;
	IE=0xd7;
    IT1=1;
    IT0=1;
    TR1=1;
	TR0=1;
	RI=0;
	iRECVNUM=0;
	bState=0;
	iFunc=0;
	iInit=30;
	iCMD=0xff;
    iDATA0=0xff;
    iDATA1=0xff;
    
	while(1)
    {
        if(iRECVNUM>=8)
            ExcuteCMD();
        DispLed();
        DispNum();
    }
}
void CopyM(char des[],char src[],int iCnt)
{
    int i;
    for(i=0;i<iCnt;i++)
        des[i]=src[i];           
}
void ClearM(char src[],int iCnt)
{
    int i;
    for(i=0;i<iCnt;i++)
        src[i]=0x00;
}
void DoCMD(void)
{
    switch(iCMD)  
    {
        case 0x00:
            TR0=1;
            break;
        case 0x01:
            TR0=0;
            break;
        case 0x02:
            iNum=0;
            break;
        case 0x03:
            if(iMode==0)
                iNum=00;
            else
                iNum=iInit;
            break;
        case 0x04:
            if(iDATA0>=0&&iDATA0<=1)
                iMode=iDATA0;
            break;
        case 0x05:
            if(iDATA0>=0&&iDATA0<=99)
                iInit=iDATA0;
            break;
        default:
            break; 
    }  
}
void ExcuteCMD()
{
    int i,j=0,k=0;
    if(RECVBUF[0]==0x02&&RECVBUF[2]==0x01&&RECVBUF[RECVBUF[1]+1]==0x03)
    {
        for(i=3;i<=(RECVBUF[1]-1);i++)
            j+=RECVBUF[i];
        if(j==RECVBUF[RECVBUF[1]])
        {
            iCMD=RECVBUF[3];
            iDATA0=RECVBUF[4];
            iDATA1=RECVBUF[5];
            DoCMD();
            k=iRECVNUM-RECVBUF[1]-2;//剩下的个数
            CopyM(RECVBUF,RECVBUF+RECVBUF[1]+2,k);
            ClearM(RECVBUF+k,iRECVNUM-k);
            iRECVNUM=k; 
        }
        else
        {
            CopyM(RECVBUF,RECVBUF+1,--iRECVNUM);
            ClearM(RECVBUF+iRECVNUM,1); 
        }
    }
    else
    {
        CopyM(RECVBUF,RECVBUF+1,--iRECVNUM);
        ClearM(RECVBUF+iRECVNUM,1); 
    }       
}
void serial(void) interrupt 4//定义串行口中断处理子程序
{
    ES=0;
    if(TI)
        TI=0;
    while(RI)
    {
        RECVBUF[iRECVNUM]=SBUF;
        iRECVNUM++;
        RI=0; 
    }
    ES=1;
}
void TimeSec(void) interrupt 1//定义定时器0中断处理子程序
{
    TR0=0x0;
    TL0=0x00;
	TH0=0x00;
	if(--iTimes<=0)
    {
        iTimes=0x10; 
        switch(iMode)
        {
            case 0:
                if(iNum++>=60)
                    iNum=0;
                break;
            case 1:
                if(iNum--<=0)
                    iNum=iInit;
                break;
            default:
                break; 
        }
    }   
    TR0=0x1;
}
void Int0Add(void) interrupt 0//定义中断0处理子程序
{
    EX0=0;
    if(bState)
    {
        switch(iFunc)   
        {
            case 4:
                if(++iMode>1)
                    iMode=0;
                break;
            case 5:
                if(++iInit>99)
                    iInit=0;
                break;
            default:
                break;
        } 
    }
    else
        if(++iFunc>5)
            iFunc=0;
    EX0=1;
}
void Int1Ent(void) interrupt 2//定义中断1处理子程序
{
    EX1=0;
    switch(iFunc)
    {
        case 0:
            TR0=1;
            break;
        case 1:
            TR0=0;
            break;
        case 2:
            iNum=0;
            break;
        case 3:
            if(iMode==0)
                iNum=00;
            else
                iNum=iInit;
            TR0=1;
            break;
        default:
            bState^=1;
            break;
    }
    EX1=1;
}
void DispNum(void)
{
    BYTE i,j;
    i=iNum/10;
    j=iNum%10;
    P0=TAB[i];
    P2=0x40;
    Delay(500);
    P0=TAB[j];
    P2=0x20;
    Delay(500);   
}
void DispLed(void)
{
    P2=0x80;
    if(bState)
    {
        if(iFunc==4)
            P0=iMode;
        else
            P0=iInit;    
    }
    else
        P0=iFunc;
    Delay(500);
}
void Delay(int i)
{
    while(--i);
}

⌨️ 快捷键说明

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