欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2106|回復: 3
收起左側

STC8A4K32S2A12單片機與STC8A8K64D4單片機程序兼容問題

[復制鏈接]
ID:1087144 發表于 2023-7-4 10:49 | 顯示全部樓層 |閱讀模式
大佬們,之前我用STC8AK432S2A12單片機弄輸入控制輸出的程序。后來換了STC8A8K64D4的板子。然后接收程序不變,中斷程序按照燒錄軟件的例程復制過來。然而運行后一直沒有反應。之后一直改都亦是如此。我也是有點懵了。所以浪費大佬們的一點時間來幫我看看具體是什么問題...

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

unsigned char ucSystemMode = 0;/*系統工作模式,對應256個實驗*/
unsigned char CP = 0;          /*時序邏輯門電路需要的時序信號*/
unsigned char CP_RisingEdge = 0;/*上升沿信號*/
unsigned char CP_FallingEdge = 0;/*下降沿信號*/


sysFunction mdFunctionList[MAX_FUNC_ITEM] =
{
        Input1NotDoor,   /*1輸入非門*/
        
        /***************兩輸入邏輯門實驗***/
        Input2AndDoor,        /*兩輸入與門*/
        Input2OrNotDoor, /*兩輸入或非門*/
        Input2OrDoor,        /*兩輸入或門*/
        Input2AndNotDoor, /*兩輸入與非門*/
        Input2YiHuoDoor, /*兩輸入異或門*/
        Input2TongHuoDoor,/*2輸入同或門*/
        
        /**********三輸入邏輯門實驗******/
        Input3AndDoor,        /*3輸入與門*/
        Input3AndNotDoor,/*3輸入與非門*/
        Input3OrDoor,/*3輸入或門*/
        Input3OrNotDoor, /*3輸入或非門*/
        Input3XorDoor,/*3輸入異或門*/
        
        /**********四輸入邏輯門實驗******/
        Input4AndDoor,/*4輸入與門*/
        Input4AndNotDoor,/*4輸入與非門*/
        Input4OrDoor,/*4輸入或門*/
        Input4OrNotDoor,/*4輸入或非門*/
        
        /******組合邏輯門電路實驗********/
        ComperDoor,                /*比較器*/
        QuanAdd,                /*全加器*/
        SiRenBiaoJueQi, /*四人表決器*/
        ZuHeLogic1,                /*組合邏輯門1*/
        ZuHeLogic2,                /*組合邏輯門2*/
        ParityCheck3,        /*三輸入的奇偶校驗器*/
        BinEncode,                /*二進制編碼器*/
#if 0
        ShanRenBiaoJueQi,/*3人表決器*/
        OneBitBanAdd,
        /********時序邏輯門電路實驗*****/
        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輸入邏輯門####################################################*/

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

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

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

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

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

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

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

/******************************************************************************************************************
函數功能:比較器
函數說明:
******************************************************************************************************************/
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則輸出高電平,否則輸出低電平*/
}
/******************************************************************************************************************
函數功能:一位半加器
函數說明:
******************************************************************************************************************/
void OneBitBanAdd()
{
        if(InputA || InputB)
        {
                OutputY1 = 1;
        }
        else
        {
                OutputY1 = 0;
        }
        if(InputA && InputB)
        {
                OutputY2 = 1;
        }
        else
        {
                OutputY2 = 0;
        }
}
/******************************************************************************************************************
函數功能:一位半加器
函數說明:
******************************************************************************************************************/
void QuanAdd()
{
        OutPutPortReset();
        
        OutputY1 = !(InputA & InputB & InputC);
        OutputY2 = (InputA | InputB | (!InputC));
        OutputY3 = (InputA | (!InputB) | InputC);
        OutputY4 = ((!InputA) | InputB | InputC);
        
        OutputY5 = !(OutputY1 & OutputY2 & OutputY3 & OutputY4);/*合數*/
        
        OutputY6 = (InputA | (!InputB) | (!InputC));
        OutputY7 = ((!(InputA & InputC)) | InputB);
        OutputY8 = ((!(InputA & InputB)) | InputC);
        
        OutputY9 = !(OutputY1 & OutputY6 & OutputY7 & OutputY8);/*進位*/
}
/******************************************************************************************************************
函數功能:4人表決器
函數說明:
******************************************************************************************************************/
void SiRenBiaoJueQi()
{
        OutPutPortReset();
        
        OutputY1 = !(InputA & InputB & InputC);
        
        OutputY2 = !(InputA & InputB & InputD);
        
        OutputY3 = !(InputA & InputC & InputD);
        
        OutputY4 = !(OutputY1 & OutputY2 & OutputY3);
}
/******************************************************************************************************************
函數功能:組合邏輯門實驗1
函數說明:
******************************************************************************************************************/
void ZuHeLogic1()
{
        OutPutPortReset();
        
        OutputY1 = !(InputA & InputB & InputC & InputC);
        
        OutputY2 = !(OutputY1 & InputD);
        
        OutputY3 = !OutputY2;
        
        OutputY4 = !(OutputY3 & InputC);
        
        OutputY5 = !(OutputY4 & InputA & OutputY1 & OutputY2);
}
/******************************************************************************************************************
函數功能:組合邏輯門實驗2
函數說明:
******************************************************************************************************************/
void ZuHeLogic2()
{
        OutPutPortReset();
        
        OutputY1 = ((!InputA) & (!InputB) & (InputC)) | (InputB & (!InputC));
        
        OutputY2 = !InputB;
        
        OutputY3 = (InputA & (!InputC)) | (InputB & (!InputC));
        
}
/******************************************************************************************************************
函數功能:3輸入奇偶校驗器
函數說明:
******************************************************************************************************************/
void ParityCheck3()
{
        OutPutPortReset();
        
        OutputY1 = !(InputA & (!InputB) & (!InputC));
        
        OutputY2 = !((!InputA) & InputB & (!InputC));
        
        OutputY3 = !((!InputA) & (!InputB) & InputC);
        
        OutputY4 = !(InputA & InputB & InputC);
        
        OutputY5 = !(OutputY1 & OutputY2 & OutputY3 & OutputY4);
}
/******************************************************************************************************************
函數功能:二進制編碼器
函數說明:
******************************************************************************************************************/
void BinEncode()
{
        OutPutPortReset();
        
        OutputY1 = !((!InputA) & (!InputC) & (!InputE) & (!InputG));
        OutputY2 = !((!InputB) & (!InputC) & (!InputF) & (!InputG));
        OutputY3 = !((!InputD) & (!InputE) & (!InputF) & (!InputG));
        
}
/******************************************************************************************************************
函數功能:二進制譯碼器
函數說明:
******************************************************************************************************************/
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);
}
/******************************************************************************************************************
函數功能:三人表決器
函數說明:四與非門實現
******************************************************************************************************************/
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;
        }
}
/*################################################時序門電路####################################################*/
/******************************************************************************************************************
函數功能:基本RS觸發器
函數說明:不需要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;
}
/******************************************************************************************************************
函數功能:JK觸發器
函數說明:
******************************************************************************************************************/
void JKTrigger()
{
        
}
/******************************************************************************************************************
函數功能:D觸發器
函數說明:
******************************************************************************************************************/
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()
{
        /*使用定時器模擬一個時序邏輯門電路的時鐘信號*/
        AUXR |= 0x80;                //定時器時鐘1T模式
        TMOD &= 0xF0;                //設置定時器模式
        TL0 = 0xCD;                //設置定時初值 1K
        TH0 = 0xD4;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
}
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();
}
/******************************************************************************************************************
函數功能:模式狀態掃描
函數說明:
******************************************************************************************************************/
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;/*記錄上一次的電平狀態*/
        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

回復

使用道具 舉報

ID:1085441 發表于 2023-7-4 11:33 | 顯示全部樓層
STC8A8K64D的IO口要設置,默認是高阻模式,要設置為準IO模式
回復

使用道具 舉報

ID:1085441 發表于 2023-7-4 11:41 | 顯示全部樓層
這里不能截圖啊,見STC8A8K64D4數據手冊的第4頁
初始化時請加上
        P0M0 = 0;
        P0M1 = 0;
        P1M0 = 0;
        P1M1 = 0;
        P2M0 = 0;
        P2M1 = 0;
        P3M0 = 0;
        P3M1 = 0;
        P4M0 = 0;
        P4M1 = 0;
        P5M0 = 0;
        P5M1 = 0;
回復

使用道具 舉報

ID:213173 發表于 2023-7-4 16:24 | 顯示全部樓層
兩者IO口默認模式有區別
無標題.jpg

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表