找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1624|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STC8A4K32S2A12單片機(jī)與STC8A8K64D4單片機(jī)程序兼容問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
大佬們,之前我用STC8AK432S2A12單片機(jī)弄輸入控制輸出的程序。后來換了STC8A8K64D4的板子。然后接收程序不變,中斷程序按照燒錄軟件的例程復(fù)制過來。然而運(yùn)行后一直沒有反應(yīng)。之后一直改都亦是如此。我也是有點(diǎn)懵了。所以浪費(fèi)大佬們的一點(diǎn)時(shí)間來幫我看看具體是什么問題...

#include "main.h"
#include <intrins.h>

unsigned char ucSystemMode = 0;/*系統(tǒng)工作模式,對應(yīng)256個實(shí)驗(yàn)*/
unsigned char CP = 0;          /*時(shí)序邏輯門電路需要的時(shí)序信號*/
unsigned char CP_RisingEdge = 0;/*上升沿信號*/
unsigned char CP_FallingEdge = 0;/*下降沿信號*/


sysFunction mdFunctionList[MAX_FUNC_ITEM] =
{
        Input1NotDoor,   /*1輸入非門*/
        
        /***************兩輸入邏輯門實(shí)驗(yàn)***/
        Input2AndDoor,        /*兩輸入與門*/
        Input2OrNotDoor, /*兩輸入或非門*/
        Input2OrDoor,        /*兩輸入或門*/
        Input2AndNotDoor, /*兩輸入與非門*/
        Input2YiHuoDoor, /*兩輸入異或門*/
        Input2TongHuoDoor,/*2輸入同或門*/
        
        /**********三輸入邏輯門實(shí)驗(yàn)******/
        Input3AndDoor,        /*3輸入與門*/
        Input3AndNotDoor,/*3輸入與非門*/
        Input3OrDoor,/*3輸入或門*/
        Input3OrNotDoor, /*3輸入或非門*/
        Input3XorDoor,/*3輸入異或門*/
        
        /**********四輸入邏輯門實(shí)驗(yàn)******/
        Input4AndDoor,/*4輸入與門*/
        Input4AndNotDoor,/*4輸入與非門*/
        Input4OrDoor,/*4輸入或門*/
        Input4OrNotDoor,/*4輸入或非門*/
        
        /******組合邏輯門電路實(shí)驗(yàn)********/
        ComperDoor,                /*比較器*/
        QuanAdd,                /*全加器*/
        SiRenBiaoJueQi, /*四人表決器*/
        ZuHeLogic1,                /*組合邏輯門1*/
        ZuHeLogic2,                /*組合邏輯門2*/
        ParityCheck3,        /*三輸入的奇偶校驗(yàn)器*/
        BinEncode,                /*二進(jìn)制編碼器*/
#if 0
        ShanRenBiaoJueQi,/*3人表決器*/
        OneBitBanAdd,
        /********時(shí)序邏輯門電路實(shí)驗(yàn)*****/
        RsTrigger,
        DTringger,
        JKTrigger,
#endif
};
void Delay100ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
/*################################################1輸入邏輯門####################################################*/

/******************************************************************************************************************
函數(shù)功能:OutPutPortReset
函數(shù)說明:將輸出端口的電平狀態(tài)進(jìn)行重設(shè)
******************************************************************************************************************/
void OutPutPortReset()
{
        OutputPort0 = 0X00;
        OutputPort1 = 0X00;
}
/*################################################1輸入邏輯門####################################################*/

/******************************************************************************************************************
函數(shù)功能:1輸入非門
函數(shù)說明:
******************************************************************************************************************/
void Input1NotDoor()
{
        OutPutPortReset();
        OutputY1 = !InputA;
}
/*################################################2輸入邏輯門####################################################*/

/******************************************************************************************************************
函數(shù)功能:2輸入門
函數(shù)說明:
******************************************************************************************************************/
void Input2AndDoor()
{
        OutPutPortReset();
        if(InputA && InputB)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
}
/******************************************************************************************************************
函數(shù)功能:2輸入或非門
函數(shù)說明:
******************************************************************************************************************/
void Input2OrNotDoor()
{
        OutPutPortReset();
        if(!InputA && !InputB)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
}
/******************************************************************************************************************
函數(shù)功能:2輸或門
函數(shù)說明:
******************************************************************************************************************/
void Input2OrDoor()
{
        if(InputA || InputB)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
}
/******************************************************************************************************************
函數(shù)功能:2輸入與非門
函數(shù)說明:
******************************************************************************************************************/
void Input2AndNotDoor()
{
        unsigned char ucData = InputA & InputB;
        OutPutPortReset();
        OutputY1 = !ucData;
}
/******************************************************************************************************************
函數(shù)功能:2輸入異或門
函數(shù)說明:相異出1  相同出0
******************************************************************************************************************/
void Input2YiHuoDoor()
{
        OutPutPortReset();
        if(InputA == InputB)
        {
                OutputY1 = 0;
        }
        else
        {
                OutputY1 = 1;
        }
}
/******************************************************************************************************************
函數(shù)功能:2輸入同或門
函數(shù)說明:
******************************************************************************************************************/
void Input2TongHuoDoor()
{
        OutPutPortReset();
        if(InputA == InputB)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
}
/*################################################3輸入邏輯門####################################################*/

/******************************************************************************************************************
函數(shù)功能:3輸入與門
函數(shù)說明:
******************************************************************************************************************/
void Input3AndDoor()
{
        OutPutPortReset();
        if(InputA && InputB && InputC)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
}
/******************************************************************************************************************
函數(shù)功能:3輸入與非門
函數(shù)說明:
******************************************************************************************************************/
void Input3AndNotDoor()
{
        OutPutPortReset();
        if(InputA && InputB && InputC)
        {
                OutputY1 = 0;
        }
        else
        {
                OutputY1 = 1;
        }
}
/******************************************************************************************************************
函數(shù)功能:3輸入或非門
函數(shù)說明:
******************************************************************************************************************/
void Input3OrNotDoor()
{
        OutPutPortReset();
        if(InputA == 0 && InputB == 0 && InputC == 0)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
}
/******************************************************************************************************************
函數(shù)功能:3輸入或門
函數(shù)說明:
******************************************************************************************************************/
void Input3OrDoor()
{
        OutPutPortReset();
        if(InputA == 0 && InputB == 0 && InputC == 0)
        {
                OutputY1 = 0;
        }
        else
        {
                OutputY1 = 1;
        }
}
/******************************************************************************************************************
函數(shù)功能:3輸入或門
函數(shù)說明:
******************************************************************************************************************/
void Input3XorDoor()
{
        unsigned char flag = 0;
        OutPutPortReset();
        if(InputA == InputB)
        {
                flag = 0;
        }
        else
        {
                flag = 1;
        }
        if(flag == InputC)
        {
                OutputY1 = 0;
        }
        else
        {
                OutputY1 = 1;
        }
}

/******************************************************************************************************************
函數(shù)功能:4輸入與門
函數(shù)說明:
******************************************************************************************************************/
void Input4AndDoor()
{
        OutPutPortReset();
        
        if(InputA && InputB && InputC && InputD)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
}
/******************************************************************************************************************
函數(shù)功能:4輸入與非門
函數(shù)說明:
******************************************************************************************************************/
void Input4AndNotDoor()
{
        OutPutPortReset();
        if(InputA && InputB && InputC && InputD)
        {
                OutputY1 = 0;
        }
        else
        {
                OutputY1 = 1;
        }
}

/******************************************************************************************************************
函數(shù)功能:4輸入或門
函數(shù)說明:
******************************************************************************************************************/
void Input4OrDoor()
{
        OutPutPortReset();
        if(InputA == 0 && InputB == 0 && InputC == 0 && InputD == 0)
        {
                OutputY1 = 0;
        }
        else
        {
                OutputY1 = 1;
        }
}

/******************************************************************************************************************
函數(shù)功能:4輸入或非門
函數(shù)說明:
******************************************************************************************************************/
void Input4OrNotDoor()
{
        OutPutPortReset();
        if(InputA == 0 && InputB == 0 && InputC == 0 && InputD == 0)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
}
/*################################################組合邏輯門####################################################*/

/******************************************************************************************************************
函數(shù)功能:比較器
函數(shù)說明:
******************************************************************************************************************/
void ComperDoor()
{
        OutPutPortReset();
        /*Y1 = A + B*/
        if(InputA || InputB )
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
        /*Y2 = /A + B*/
        if(!InputA || InputB)
        {
                OutputY2 = 1;
        }
        else
        {
                OutputY2 = 0;
        }
        /*Y3 = /A/B*/
        if(!InputA || !InputB)
        {
                OutputY3 = 1;
        }
        else
        {
                OutputY3 = 0;
        }
        /*Y4 = /Y1/Y2/Y3*/
        OutputY4 = !(OutputY1 & OutputY2 & OutputY3);
        /*邏輯功能A大于等于B則輸出高電平,否則輸出低電平*/
}
/******************************************************************************************************************
函數(shù)功能:一位半加器
函數(shù)說明:
******************************************************************************************************************/
void OneBitBanAdd()
{
        if(InputA || InputB)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
        if(InputA && InputB)
        {
                OutputY2 = 1;
        }
        else
        {
                OutputY2 = 0;
        }
}
/******************************************************************************************************************
函數(shù)功能:一位半加器
函數(shù)說明:
******************************************************************************************************************/
void QuanAdd()
{
        OutPutPortReset();
        
        OutputY1 = !(InputA & InputB & InputC);
        OutputY2 = (InputA | InputB | (!InputC));
        OutputY3 = (InputA | (!InputB) | InputC);
        OutputY4 = ((!InputA) | InputB | InputC);
        
        OutputY5 = !(OutputY1 & OutputY2 & OutputY3 & OutputY4);/*合數(shù)*/
        
        OutputY6 = (InputA | (!InputB) | (!InputC));
        OutputY7 = ((!(InputA & InputC)) | InputB);
        OutputY8 = ((!(InputA & InputB)) | InputC);
        
        OutputY9 = !(OutputY1 & OutputY6 & OutputY7 & OutputY8);/*進(jìn)位*/
}
/******************************************************************************************************************
函數(shù)功能:4人表決器
函數(shù)說明:
******************************************************************************************************************/
void SiRenBiaoJueQi()
{
        OutPutPortReset();
        
        OutputY1 = !(InputA & InputB & InputC);
        
        OutputY2 = !(InputA & InputB & InputD);
        
        OutputY3 = !(InputA & InputC & InputD);
        
        OutputY4 = !(OutputY1 & OutputY2 & OutputY3);
}
/******************************************************************************************************************
函數(shù)功能:組合邏輯門實(shí)驗(yàn)1
函數(shù)說明:
******************************************************************************************************************/
void ZuHeLogic1()
{
        OutPutPortReset();
        
        OutputY1 = !(InputA & InputB & InputC & InputC);
        
        OutputY2 = !(OutputY1 & InputD);
        
        OutputY3 = !OutputY2;
        
        OutputY4 = !(OutputY3 & InputC);
        
        OutputY5 = !(OutputY4 & InputA & OutputY1 & OutputY2);
}
/******************************************************************************************************************
函數(shù)功能:組合邏輯門實(shí)驗(yàn)2
函數(shù)說明:
******************************************************************************************************************/
void ZuHeLogic2()
{
        OutPutPortReset();
        
        OutputY1 = ((!InputA) & (!InputB) & (InputC)) | (InputB & (!InputC));
        
        OutputY2 = !InputB;
        
        OutputY3 = (InputA & (!InputC)) | (InputB & (!InputC));
        
}
/******************************************************************************************************************
函數(shù)功能:3輸入奇偶校驗(yàn)器
函數(shù)說明:
******************************************************************************************************************/
void ParityCheck3()
{
        OutPutPortReset();
        
        OutputY1 = !(InputA & (!InputB) & (!InputC));
        
        OutputY2 = !((!InputA) & InputB & (!InputC));
        
        OutputY3 = !((!InputA) & (!InputB) & InputC);
        
        OutputY4 = !(InputA & InputB & InputC);
        
        OutputY5 = !(OutputY1 & OutputY2 & OutputY3 & OutputY4);
}
/******************************************************************************************************************
函數(shù)功能:二進(jìn)制編碼器
函數(shù)說明:
******************************************************************************************************************/
void BinEncode()
{
        OutPutPortReset();
        
        OutputY1 = !((!InputA) & (!InputC) & (!InputE) & (!InputG));
        OutputY2 = !((!InputB) & (!InputC) & (!InputF) & (!InputG));
        OutputY3 = !((!InputD) & (!InputE) & (!InputF) & (!InputG));
        
}
/******************************************************************************************************************
函數(shù)功能:二進(jìn)制譯碼器
函數(shù)說明:
******************************************************************************************************************/
void BinDecode()
{
        OutPutPortReset();
        
        OutputY1 = (!InputA) & (!InputB) & (!InputC);
        OutputY2 = (!InputA) & (!InputB) & InputC;
        OutputY3 = (!InputA) & InputB & (!InputC);
        OutputY4 = (!InputA) & InputB & InputC;
        OutputY5 = InputA & (!InputB) & InputC;
        OutputY6 = InputA & InputB & (!InputC);
}
/******************************************************************************************************************
函數(shù)功能:三人表決器
函數(shù)說明:四與非門實(shí)現(xiàn)
******************************************************************************************************************/
void ShanRenBiaoJueQi()
{
        if(InputA && InputB)
        {
                OutputY1 = 0;
        }
        else
        {
                OutputY1 = 1;
        }
        if(InputA && InputC)
        {
                OutputY2 = 0;
        }
        else
        {
                OutputY2 = 1;
        }
        if(InputB && InputC)
        {
                OutputY3 = 0;
        }
        else
        {
                OutputY3 = 1;
        }
        if(OutputY1 && OutputY2 && OutputY3)
        {
                OutputY4 = 0;
        }
        else
        {
                OutputY4 = 1;
        }
}
/*################################################時(shí)序門電路####################################################*/
/******************************************************************************************************************
函數(shù)功能:基本RS觸發(fā)器
函數(shù)說明:不需要CP信號
******************************************************************************************************************/
void  RsTrigger()
{
        /*A為R輸入端  B為S輸入端   Y2 為Q輸出 Y1 !Q輸出*/
        unsigned char ucData1 = 0;
        unsigned char ucData2 = 0;
        
        ucData1        = InputA & OutputY2;
        OutputY1 = !ucData1;
        ucData2 = InputB & OutputY1;
        OutputY2 = !ucData2;
}
/******************************************************************************************************************
函數(shù)功能:JK觸發(fā)器
函數(shù)說明:
******************************************************************************************************************/
void JKTrigger()
{
        
}
/******************************************************************************************************************
函數(shù)功能:D觸發(fā)器
函數(shù)說明:
******************************************************************************************************************/
void DTringger()
{
        if(InputA && CP_RisingEdge)
        {
                OutputY1 = 0;
        }
        else
        {
                OutputY1 = 1;
        }
        if(CP_RisingEdge && OutputY1)
        {
                OutputY2 = 0;
        }
        else
        {
                OutputY2 = 1;
        }
        if(OutputY1 && OutputY4)
        {
                OutputY3 = 0;
        }
        else
        {
                OutputY3 = 1;
        }
        if(OutputY2 && OutputY3)
        {
                OutputY4 = 0;
        }
        else
        {
                OutputY4 = 1;
        }
        
        CP_RisingEdge = 0;/*清除邊緣信號*/
}
void clkCreateInit()
{
        /*使用定時(shí)器模擬一個時(shí)序邏輯門電路的時(shí)鐘信號*/
        AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xCD;                //設(shè)置定時(shí)初值 1K
        TH0 = 0xD4;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
}
void UsartSendByte(char dat)
{
        SBUF = dat;
        while(!TI);                        
        TI = 0;
}
char putchar(char c)//重定向
{
        UsartSendByte(c);
        return c;
}
void UsartSendString(char *string)
{
        while(*string != '\0')
        {
                UsartSendByte(*string);
                string++;
        }
}
void UsartInit()
{
        SCON = 0x50;  
        TMOD = 0x00;  
        AUXR = 0X40;               
  TL1 = (65535 - (24000000 / 4/ 115200));   
        TH1 = (65535 - (24000000 / 4 / 115200)) >> 8;        
        TR1  = 1;                                                                           
        EA   = 1;   
}
int systemInit()
{
        P1 = 0X00;
        P0 = 0X00;
        P2 = 0X00;
        UsartInit();
}
/******************************************************************************************************************
函數(shù)功能:模式狀態(tài)掃描
函數(shù)說明:
******************************************************************************************************************/
void SysteModeScan()
{
        unsigned int uidata = 0;
        unsigned char ucModePinStatus = 0;
        static unsigned char ucLastSystemMode = 0xff;
        
        ucModePinStatus |= SW_PIN5;
        ucModePinStatus <<= 1;
        
        ucModePinStatus |= SW_PIN4;
        ucModePinStatus <<= 1;
        
        ucModePinStatus |= SW_PIN3;
        ucModePinStatus <<= 1;
        
        ucModePinStatus |= SW_PIN2;
        ucModePinStatus <<= 1;
        
        ucModePinStatus |= SW_PIN1;
        ucModePinStatus <<= 1;
        
        ucModePinStatus |= SW_PIN0;


        if(ucModePinStatus >= 0 && ucModePinStatus <= 255)
        {
                ucSystemMode = ucModePinStatus;
        }
        else
        {
                ucSystemMode = 0;
        }
        if(ucLastSystemMode != ucSystemMode)
        {
                ucLastSystemMode = ucSystemMode;
                uidata = ucSystemMode + 1;
                printf("SysteMode:%d\r\n",uidata);
        }
}
int main()
{
        systemInit();
        
        while(1)
        {
                SysteModeScan();
                mdFunctionList[ucSystemMode]();
               
        }
}
void clkInterrupt(void) interrupt 1 using 1
{
        static unsigned char LastCP = 0;
        
        LastCP = CP;/*記錄上一次的電平狀態(tài)*/
        CP = !CP;/*電平信號*/
        
        if(LastCP  && !CP)
        {
                CP_FallingEdge = 1;/*下降沿信號*/
        }
        else
        {
                CP_FallingEdge  = 0;
        }
        if(!LastCP && CP)
        {
                CP_RisingEdge = 1;/*上身沿信號*/
        }
        else
        {
                CP_RisingEdge = 0;
        }
}

#ifndef MAIN_H
#define MAIN_H

#include "stc8.h"
#include "stdio.h"

/*模式切換按鈕輸入管腳*/
sbit SW_PIN0        =         P3^7;
sbit SW_PIN1        =         P3^6;
sbit SW_PIN2        =         P3^5;
sbit SW_PIN3        =                P3^4;
sbit SW_PIN4        =                P3^3;
sbit SW_PIN5        =         P3^2;


/*8組輸入信號*/
sbit InputA                =        P1^0;
sbit InputB                =        P1^1;
sbit InputC                =        P1^2;
sbit InputD                =        P1^3;
sbit InputE                =        P1^4;
sbit InputF                =        P1^5;
sbit InputG                =        P1^6;
sbit InputH                =        P1^7;


/*16路輸入信號*/
sbit OutputY1        =         P0^7;
sbit OutputY2        =         P0^6;
sbit OutputY3        =         P0^5;
sbit OutputY4        =         P0^4;
sbit OutputY5        =         P0^3;
sbit OutputY6        =         P0^2;
sbit OutputY7        =         P0^1;
sbit OutputY8        =         P0^0;

#define OutputPort0 P0
#define OutputPort1 P2

sbit OutputY9                =         P2^7;
sbit OutputY10        =         P2^6;
sbit OutputY11        =         P2^5;
sbit OutputY12        =         P2^4;
sbit OutputY13        =         P2^3;
sbit OutputY14        =         P2^2;
sbit OutputY15        =         P2^1;
sbit OutputY16        =         P2^0;


#define MAX_FUNC_ITEM                256

typedef void (*sysFunction)(void);

int systemInit();
void Input1NotDoor();
void Input2AndDoor();
void Input2OrNotDoor();
void Input2OrDoor();
void Input2AndNotDoor();
void Input2YiHuoDoor();
void Input2TongHuoDoor();

void Input1NotDoor();

void Input3AndDoor();
void Input3AndNotDoor();
void Input3OrDoor();
void Input3OrNotDoor();
void Input3XorDoor();

void Input4AndDoor();
void Input4AndNotDoor();
void Input4OrDoor();
void Input4OrNotDoor();

void ComperDoor();
void OneBitBanAdd();
void QuanAdd();
void SiRenBiaoJueQi();
void ZuHeLogic1();
void ZuHeLogic2();
void ParityCheck3();
void BinEncode();
void ShanRenBiaoJueQi();


void RsTrigger();
void DTringger();
void JKTrigger();

#endif

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1085441 發(fā)表于 2023-7-4 11:33 | 只看該作者
STC8A8K64D的IO口要設(shè)置,默認(rèn)是高阻模式,要設(shè)置為準(zhǔn)IO模式
回復(fù)

使用道具 舉報(bào)

板凳
ID:1085441 發(fā)表于 2023-7-4 11:41 | 只看該作者
這里不能截圖啊,見STC8A8K64D4數(shù)據(jù)手冊的第4頁
初始化時(shí)請加上
        P0M0 = 0;
        P0M1 = 0;
        P1M0 = 0;
        P1M1 = 0;
        P2M0 = 0;
        P2M1 = 0;
        P3M0 = 0;
        P3M1 = 0;
        P4M0 = 0;
        P4M1 = 0;
        P5M0 = 0;
        P5M1 = 0;
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2023-7-4 16:24 | 只看該作者
兩者IO口默認(rèn)模式有區(qū)別


回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表