c++和linux,去做单片机c51会不会有一种格格不入,或者太过于奢侈

学习了c,数据结构是不是可以适应c51了。c++这样的语言在51中感觉使用不多,开发环境大多都是keil。感觉linux也没有太多使用。所以c+++linux会不会对于单片机来说,有一种华而不实的感觉。

以下内容部分参考ChatGPT模型:


学习C和数据结构是可以适应C51的,因为C语言是C51的主要开发语言之一。虽然C++在C51中使用较少,但是对于一些高级应用,比如面向对象编程,C++也有一定的应用。关于Linux,虽然在单片机中使用较少,但是在嵌入式系统中,Linux也有一定的应用,比如嵌入式Linux系统的开发。对于C++和Linux的使用,可以提高程序的可维护性和可拓展性。因此,学习C/C++和Linux对于单片机开发来说是有用的,并不会有“华而不实”的感觉。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

chatgpt:
C语言是单片机编程中常用的语言之一,尤其在51单片机编程中应用广泛。学习了C语言和数据结构后,可以让你更加轻松地掌握单片机编程。

C++语言相比C语言具有更多的特性和功能,例如类、继承、多态、模板等。这些功能在单片机编程中用处相对较少,因为单片机的资源有限,需要精简的代码和低功耗。因此,C++语言在单片机编程中的应用相对较少,C语言是主流。

然而,学习C++语言和Linux操作系统也有其优点。C++语言是一种面向对象的编程语言,具有更高的抽象层次和更强的代码重用性,可以帮助你更好地组织代码。同时,Linux操作系统是开源的,具有广泛的应用和丰富的资源,可以帮助你更好地理解计算机系统和开发嵌入式系统。此外,C++语言和Linux操作系统也是嵌入式Linux系统开发中的重要组成部分。

总之,学习C++语言和Linux操作系统不仅可以帮助你更好地理解计算机系统和软件工程,也可以为你未来的职业发展提供更多的选择。对于单片机编程来说,C语言是必须的,而C++语言和Linux操作系统则是可选的,具体应根据自己的需求和兴趣进行选择。

那肯定了,51单片机应该没法运行linux,内存太小

其实C++的地位确实有点尴尬
嵌入式领域不如C应用广泛,即使是在Linux或windows上,现在用它开开发应用的也不多

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7788298
  • 这篇博客也不错, 你可以看下C51源程序中中断函数不能进行参数传递,中断函数中包含任何参数声明导致变易出错,但网上都说可以。可能是KEIL改进了。还要注意变量声明和定义的区别。定义包含声明,声明不一定是定义
  • 除此之外, 这篇博客: 基于51单片机的简易减法器设计制作中的 基于C51单片机的简易减法器设计制作 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 51单片机可实现很多功能,今天笔者介绍一种使用C51编写程序,通过4*4矩阵键盘和8位共阴数码管实现的简易减法器。矩阵键盘以及数码管的原理图如下:

    (1)4*4矩阵键盘原理图:

    在这里插入图片描述
    (2)数码管的原理图:
    本文通过动态数码管来实现运算数字的显示
    通过3-8译码器实现数码管的动态显示

    编程代码如下:

    #include <reg52.h> 
    #include "math.h"
    
    #define GPIO_KEY P1
    
    typedef unsigned int u16;      
    typedef unsigned char u8;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    u8 b[8]={0,0,0,0,0,0,0,0};
    
    u16 l,m,KeyValue,flag;
    
    u8 DisplayData[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};   
    u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //0-9(十六进制)数组 
    void delay(u16 i)   //延时函数 
    {
    	while(i--); 
    }
    
    void KeyDown()    //按键函数 
    {
    	GPIO_KEY=0x0f;
    	if(GPIO_KEY!=0x0f)
    	{
    		delay(1000);
    		if(GPIO_KEY!=0x0f)
    	  	{ 
    	   		//测试列
    	   		GPIO_KEY=0X0f;
    			switch(GPIO_KEY)
    	   		{
    	    		case(0X07): KeyValue=0;break;
    	    		case(0X0b): KeyValue=1;break;
    	    		case(0X0d): KeyValue=2;break;
    	    		case(0X0e): KeyValue=3;break;
    	   		}
    	   		//测试行
    	   		GPIO_KEY=0Xf0;
    	   		switch(GPIO_KEY)
    	   		{
    	    		case(0X70): KeyValue=KeyValue;break;
    	    		case(0Xb0): KeyValue=KeyValue+4;break;
    	    		case(0Xd0): KeyValue=KeyValue+8;break;
    	    		case(0Xe0): KeyValue=KeyValue+12;break;
    	   		}
    	   }
    	   if(KeyValue==0||KeyValue==1||KeyValue==2||KeyValue==3||KeyValue==4||KeyValue==5||KeyValue==6||KeyValue==7||KeyValue==8||KeyValue==9)
    	   {
    	   		flag=1;
    	   }
    	   else if(KeyValue==10)    //S11位减号 
    	   {
    	   		flag=2;
    	   }
    	   else if(KeyValue==11)   //S12为等于号 
    	   {
    	   		flag=3;
    	   }
    	   while(GPIO_KEY!=0Xf0)   //判断按键是否松开 
    	   {
    	   		delay(5);
    	   }
    	}		
    }
    
    void DigDisplay()   //在数码管上显示 DisplayData里的元素 
    {
     	u8 j;
     	for(j=0;j<8;j++)
     	{	
      		switch(j)  
      		{
            	case(7):
    				LSA=1;LSB=1;LSC=1;break;//显示第0位
    			case(6):
    				LSA=0;LSB=1;LSC=1;break;//显示第1位
    			case(5):
    				LSA=1;LSB=0;LSC=1;break;//显示第2位
    			case(4):
    				LSA=0;LSB=0;LSC=1;break;//显示第3位
    			case(3):
    				LSA=1;LSB=1;LSC=0;break;//显示第4位
    			case(2):
    				LSA=0;LSB=1;LSC=0;break;//显示第5位
    			case(1):
    				LSA=1;LSB=0;LSC=0;break;//显示第6位
    			case(0):
    				LSA=0;LSB=0;LSC=0;break;//显示第7位	
      		}
      		P0=DisplayData[j];
      		delay(100);
      		P0=0x00;   //数码管消隐 
     	}
    }
    
    
    
    void main()
    {
    	u16 i,d,e,f=0,s,g=0,t,z,y,h,am;
    	u16 lm[8]={0};
    	while(1)
    	{
    		DigDisplay();
    		KeyDown();
    		if(flag==1)
    		{
    	 		for(i=7;i>0;i--)
    			{
    				b[i]=b[i-1];
    			}
    			b[0]=KeyValue;
    			
    			//减数与被减数判断 
    			if(g==0) 
    			{
    				l=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
    			}
    			else
    			{
    				m=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
    			}
    			
    			//判断输入的数的位数 
    			for(e=0;e<8;e++)
    			{
    				if(b[e]!=0)
    				{
    					f=e+1;
    				}
    			}
    			
    			//由上面得到输入的数的位数,接下来确定哪几个数码管显示 
    			for(d=0;d<f;d++)
    			{
    				DisplayData[d]=smgduan[b[d]]; 
    			}
    			flag=100;
    		}
    		
    		if(flag==2)   //减号
    		{
    			for(s=0;s<8;s++)   //b数组和DisplayData数组清零 
    			{
    				b[s]=0;
    				DisplayData[s]=0x00;
    			}
    			DisplayData[0]=0x40;   //减号显示,按下减号之后数码管上显示“—”号 
    			flag=100;
    			g++;	
    		}
    		if(flag==3)   //等于号 
    		{
    			if(l>m)
    			{	
    				t=l-m;
    				lm[7]=t/10000000;
    				lm[6]=(t%10000000)/1000000;
    				lm[5]=((t%10000000)%1000000)/100000;
    				lm[4]=(((t%10000000)%1000000)%100000)/10000;
    				lm[3]=(((t%10000000)%1000000)%100000)%10000/1000;
    				lm[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
    				lm[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
    				lm[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
    				for(z=0;z<8;z++)
    				{
    					if(lm[z]!=0)
    					{
    						y=z+1;
    					}
    				}
    				for(h=0;h<y;h++)
    				{
    					DisplayData[h]=smgduan[lm[h]];
    				}
    				for(am=y;am<8;am++)
    				{
    					DisplayData[am]=0x00;
    				}
    			}
    			if(l<m)
    			{
    				t=m-l;
    				lm[7]=t/10000000;
    				lm[6]=(t%10000000)/1000000;
    				lm[5]=((t%10000000)%1000000)/100000;
    				lm[4]=(((t%10000000)%1000000)%100000)/10000;
    				lm[3]=(((t%10000000)%1000000)%100000)%10000/1000;
    				lm[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
    				lm[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
    				lm[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
    				for(z=0;z<8;z++)
    				{
    					if(lm[z]!=0)
    					{
    						y=z+1;
    					}
    				}
    				DisplayData[y]=0x40;
    				for(h=0;h<y;h++)
    				{
    					DisplayData[h]=smgduan[lm[h]];
    				}
    				for(am=y+1;am<8;am++)
    				{
    					DisplayData[am]=0x00;
    				}
    					
    			}
    			flag=100;
    		}
    		DigDisplay(); 
    	}
    }