找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 845|回复: 3
打印 上一主题 下一主题
收起左侧

STC8A4K32S2A12单片机与STC8A8K64D4单片机程序兼容问题

[复制链接]
跳转到指定楼层
楼主
大佬们,之前我用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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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口默认模式有区别


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表