做算法和嵌入式开发怎么选择?

成都双非硕士,电子信息专业,研0,导师方向搞算法深度学习,但是毕业将近28,网上说做算法35岁左右就不行了,建议嵌入式方向,35岁危机没这么严重,有过来人知道具体情况吗,算法和嵌入式哪个好啊,或者还有其他哪个方向好啊

算法是方向 , 目前这么火没看出来吗? 大厂都在搞 如有帮助给个采纳谢谢 , 所谓的35职业危机, 根据个人而言, 牛逼的人从来没有听说过35的这个问题, 只是一笑了之, 普通的人,可能不到35 就对这个行业say bey 了 , 如有帮助给个采纳谢谢

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7809102
  • 你也可以参考下这篇文章:(1)三相电机中相电压与线电压之间的关系 (2)电机转速,机器速度,电角速度之间的关系(3)磁链估算和磁场定向的定义
  • 除此之外, 这篇博客: 【笔记】6位数码管显示定时器定时的时分秒,通过按键控制时间,自定义串口通信协议,根据单片机接收到的指令控制数码管显示中的 4、源代码  部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • /*******************************************************************************
    程序功能:1.时分秒的动态显示。2.用三个按键实现时分秒的修改,调节的数字闪烁提示。
    3.串口控制时钟的暂停、开始、清零、读取、设置时间
    串口协议格式:s+指令+数据+e
    s:表示开始码
    指令:
    	|	p:计时暂停(无数据位)	         |
    	|	r:计时重启(无数据位)	         |
    	|	c:显示清零(无数据位)	         |
    	|	q:查询当前时间(无数据位)        
    	|	t:设置时间(数据位格式为6位数字) 
    *******************************************************************************/
    
    #include <reg52.h>		 //包含需要的头文件
    
    #define u8 unsigned char
    #define u16 unsigned int	
    
    u8 WeiMa[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
    u8 DuanMa[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    
    //函数声明
    void Delay_ms(u16 xms);
    void ShuMaGuan(u8 wei,u8 duan);
    void Display_Timer(u8 hour,u8 min,u8 sec);
    u8 Key_Scan();
    void PutChar(u8 n);
    void UartInit();
    void PutString(u8 *p);
    void Key_Timer_Set();
    void Uart_Timer_Set();
    void Pintf_Uart();
    
    
    //引脚定义
    sbit SW1=P3^2;
    sbit SW2=P3^3;
    sbit SW3=P3^4;
    
    u8 Hour=0,Min=0,Sec=0;//全局变量,时分秒
    u8 mode=0;//全局变量:状态切换,0:时钟显示,1:调节时;2:调节分;3:调节秒
    bit flash_tip=1;//数码管闪烁标志,为0时数码管熄灭,为一时数码管显示
    
    #define Data_SIZE 15 //数据长度
    u8 USART_RX_BUF[Data_SIZE]; //接收缓冲,最大Data_SIZE个字节.末字节为换行符 
    u8 Start_Receiving=0; //开始接收标志位
    u8 Receive_OK=0;   //接收完毕接收位 1为接收完毕
    
    //函数功能:定时器初始化
    void Time0init()
    {
    	TMOD|=0x01;				//设置定时器模式
    	TF0=0;					//清除TF0标志
    	TH0=(65536-50000)/256;  //设置定时初值
    	TL0=(65536-50000)%256;	//设置定时初值
    	TR0=1;					//定时器0允许计时
    	ET0=1;					//中断允许
    	EA=1;					//CPU中断允许位打开
    }
    
    //串口初始化
    void UartInit()  //9600bps@11.0592MHz
    {
     
    	 PCON &= 0x8F;  //波特率倍速
    	 SCON = 0x50;  //8位数据,可变波特率
    	 TMOD &= 0x0F;  //清除定时器1模式位
    	 TMOD |= 0x20;  //设定定时器1为8位自动重装方式
    	 TL1 = 0xFD;   //设定定时初值
    	 TH1 = 0xFD;  //设定定时器重装值
    	 TR1 = 1;  //启动定时器1
    	 EA=1;
    	 ES=1;  //打开接收中断
    }
    
    /*******************************************************************************
    * 函 数 名: void main()
    * 函数功能: 主函数
    *******************************************************************************/
    void main()
    {
    	
    	
    	Time0init();//定时器
    	UartInit(); //串口
    	Pintf_Uart();//输入提示
    	while(1)
    	{
    		Key_Timer_Set();//按键控制时钟
    		Uart_Timer_Set();//按键调节时钟
    		Display_Timer(Hour,Min,Sec);//数码管显示
    		
    	}
    }
    
    /*******************************************************************************
    * 函 数 名: void Pintf_Uart()
    * 函数功能: 串口助手输入指示
    *******************************************************************************/
    void Pintf_Uart()
    {
    	/***************输入指示*******************/
    	PutString("Please input:s+command(data)+e\r\n");
    	PutString("Stop_Time:spe\r\n");
    	PutString("Start_Time:sre\r\n");
    	PutString("Zero_Time:sce\r\n");
    	PutString("Read_Time:sqe\r\n");
    	PutString("Set_Time:st******e\r\n");
    	/*******************************************/
    }
    
    /*******************************************************************************
    * 函 数 名: void Key_Timer_Set()
    * 函数功能: //按键调节时钟
    *******************************************************************************/
    void Key_Timer_Set()
    {
    	u8 keynum;
    	keynum=Key_Scan();//按键返回值
    	if(keynum)   //非0表示有按键按下
    	{
    		switch(keynum)  //判断是哪个按键按下,按键一调节模式,按键2自加,按键3自减
    		{
    			case 1:if(++mode>=4) mode=0;break;  //++mode为先自增再判断是否大于4
    			case 2:
    				if(mode==1) if(++Hour>=24) Hour=0;//++mode为先自增再判断是否大于4
    				if(mode==2) if(++Min>=60) Min=0;//++Min先自增再判断是否大于60
    				if(mode==3) if(++Sec>=60) Sec=0;//++Sec先自增再判断是否大于60
    				break;										
    			case 3:
    				if(mode==1)	if(--Hour==255) Hour=23;//--Hour先自增再判断是否溢出
    				if(mode==2) if(--Min==255) Min=59;//--Min先自增再判断是否大溢出
    				if(mode==3) if(--Sec==255) Sec=59;//--Sec先自增再判断是否大溢出
    				break;
    			default:break;
    		}
    	}	
    }
    /*******************************************************************************
    * 函 数 名: void Key_Timer_Set()
    * 函数功能: 串口调节时钟
    串口协议格式:s+指令+数据+e
    s:表示开始码
    指令:
    	|	p:计时暂停(无数据位)	|
    	|	r:计时重启(无数据位)	|
    	|	c:显示清零(无数据位)	|
    	|	q:查询当前时间(无数据位)         
    	|	t:设置时间(数据位格式为6位数字)  
    *******************************************************************************/
    void Uart_Timer_Set()
    {
    	static u8 Hour_1,Min_1,Sec_1;//时间暂存 
    	if(Receive_OK) //如果串口接收到数据
    	{
    		Receive_OK=0;
    		switch(USART_RX_BUF[0])//存入数组的数据没有开始码,所以第一个数据是指令
    		{
    			case 'p':   //时钟暂停
    				if(USART_RX_BUF[1]!='e')//说明第2位数组的数据不是停止码
    					PutString("Error!\r\n");
    				else
    				{
    					TR0=0;
    					PutString("Stop OK!\r\n");
    				}
    				
    				break;
    			case 'r':   //开始计时
    				if(USART_RX_BUF[1]!='e')//说明第2位数组的数据不是停止码
    					PutString("Error!\r\n");
    				else
    				{
    					TR0=1;
    					PutString("Start OK!\r\n");
    				}
    				break;
    			case 'c':   //清零
    				if(USART_RX_BUF[1]!='e')//说明第2位数组的数据不是停止码
    					PutString("Error!\r\n");
    				else
    				{
    					Hour=0;
    					Min=0;
    					Sec=0;
    					PutString("Zero OK!\r\n");
    				}
    				
    				break;
    			case 'q':   //查询当前时间
    				if(USART_RX_BUF[1]!='e')//说明第2位数组的数据不是停止码
    					PutString("Error!\r\n");
    				else
    				{
    					PutString("The time is:");
    					PutChar(Hour/10+48);  //转化ASCII码字符,0为48,1为48+1=49.....
    					PutChar(Hour%10+48);
    					PutChar(':');
    					PutChar(Min/10+48);
    					PutChar(Min%10+48);
    					PutChar(':');
    					PutChar(Sec/10+48);
    					PutChar(Sec%10+48);
    					PutString("\r\n");
    				}
    				
    				break;
    			case 't':   //设置时间
    				if(USART_RX_BUF[7]!='e')//如果接收到的数据不是6位数字,说明第7位数组的数据不是停止码
    					PutString("Error!\r\n");
    				else
    				{
    					Hour_1=(USART_RX_BUF[1]-48)*10+(USART_RX_BUF[2]-48); //转化成十进制
    					Min_1=(USART_RX_BUF[3]-48)*10+(USART_RX_BUF[4]-48); //转化成十进制
    					Sec_1=(USART_RX_BUF[5]-48)*10+(USART_RX_BUF[6]-48); //转化成十进制
    					if(Hour_1>23 || Min_1>59 || Sec_1>59)  //超出时间阈值
    						PutString("Error!\r\n");	
    					else  
    					{
    						Hour=Hour_1;  
    						Min=Min_1;
    						Sec=Sec_1;
    						PutString("Set OK!\r\n");
    					}
    				}
    				break;
    			default:PutString("Error!\r\n");break;
    		}
    		ES=1;  //开启接收
    	}
    }
    
    /*******************************************************************************
    * 函 数 名: void Delay_ms(u16 xms)
    * 函数功能: 软件延时函数,xms为延时多少毫秒
    *******************************************************************************/
    void Delay_ms(u16 xms)
    {
    	
    	unsigned char i, j;
    	while(xms--)
    	{
    		i = 2;
    		j = 135;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}
    }
    
    /*******************************************************************************
    * 函 数 名: void ShuMaGuan(u8 wei,u8 duan)
    * 函数功能: 静态显示一位,参数:wei控制位选duan控制段选,表示要显示的一个数字
    *******************************************************************************/
    void ShuMaGuan(u8 wei,u8 duan)
    {
    	P1=WeiMa[wei];    //位选
    	P2=DuanMa[duan];  //段选
    	Delay_ms(1); //间隔一段时间扫描
    	P1=0xFF;    
    	P2=0xFF;	   //消隐
    }
    
    /*******************************************************************************
    * 函 数 名: void Display_Timer(u8 hour,u8 min,u8 sec)
    * 函数功能:数码管动态显示
      flash_tip为数码管闪烁标志,为0时数码管熄灭,为一时数码管显示
      flash_tip每4.5秒进行取反
    *******************************************************************************/
    void Display_Timer(u8 hour,u8 min,u8 sec)
    {
    	if(mode!=1 || flash_tip==1) //mode=1时,左边的条件一直为假,当flash_tip=1时,或运算为真,进入if,数码管显示
    	{
    		ShuMaGuan(5,hour/10);
    		ShuMaGuan(4,hour%10);
    	}
    	else P1=0xFF;
    	
    	
    	if(mode!=2 || flash_tip==1)//mode=2时,左边的条件一直为假,当flash_tip=1时,或运算为真,进入if,数码管显示
    	{
    		ShuMaGuan(3,min/10);
    		ShuMaGuan(2,min%10);
    	}
    	else P1=0xFF; 
    	
    	
    	if(mode!=3 || flash_tip==1)//mode=3时,左边的条件一直为假,当flash_tip=1时,或运算为真,进入if,数码管显示
    	{
    		ShuMaGuan(1,sec/10);
    		ShuMaGuan(0,sec%10);
    	}
    	else P1=0xFF;  
    }
    
    /*******************************************************************************
    * 函 数 名: u8 Key_Scan()
    * 函数功能: 独立按键检测,按键按下分别返回1.2.3
    *******************************************************************************/
    u8 Key_Scan()
    {
    	static u8 key_up=1; //按键按松开标志
    	if(key_up && (SW1==0 || SW2==0 || SW3==0))
    	{
    		Delay_ms(10); //去抖动
    		key_up=0; //松手标志为0,那么下次再检测,if结果为0,则不会进入这里的语句
    		if(SW1==0) return 1;
    		if(SW2==0) return 2;
    		if(SW3==0) return 3;
    	}
    	else if(SW1 == 1 && SW2 == 1 && SW3 == 1) key_up=1; //松手标志
    	return 0; // 无按键按下
    }
    
    /*******************************************************************************
    * 函 数 名: void PutChar(u8 n)
    * 函数功能: 发送一个字符
    *******************************************************************************/
    void PutChar(u8 n)
    {
    	 SBUF=n;
    	 while(!TI);
    	 TI=0;
    }
    
    /*******************************************************************************
    * 函 数 名: void PutString(u8 *p)
    * 函数功能: 发送字符串
    *******************************************************************************/
    void PutString(u8 *p)
    {
    	while(*p!='\0')
    	{
    		PutChar(*p);
    		p++;
    	}
    }
    /*******************************************************************************
    * 函 数 名: void uart() interrupt 4
    * 函数功能: 串口中断服务函数,单片机接收数据并存入USART_RX_BUF[]数组中
    开始码s不存入数组
    *******************************************************************************/
    void uart() interrupt 4
    {
    	static u8 Data_count=0;
    	u8 Data;
    	if(RI==1)
    	{
    		RI=0;
    		Data=SBUF;
    		if(Data=='s')
    		{
    			Start_Receiving=1;  //开始接收数据
    		}
    		else if(Start_Receiving)
    		{
    			USART_RX_BUF[Data_count++]=Data;//数据还没结束发送,就存到USART_RX_BUF[]数组中
    			if(Data=='e')
    			{
    				Start_Receiving=0;
    				Data_count=0;
    				Receive_OK=1;
    				ES=0;
    			}
    			
    		}
    		
    	}
    }
    
    /*******************************************************************************
    * 函 数 名: void Time0() interrupt 1
    * 函数功能: 定时器0中断服务函数,时钟效果
    *******************************************************************************/
    void Time0() interrupt 1
    {
    	static unsigned char flag_1,flag_2; 
    	TH0=(65536-50000)/256;  
    	TL0=(65536-50000)%256;//重新赋初值
    	
    	if(mode==0)flag_1++;  //mode为0时,数码管正常显示
    	else flag_2++;   
    	
    	if(flag_1==20 && mode==0)  //每秒执行一次
    	{
    		flag_1=0;
    		if(++Sec>=60) //++Sec先自增再判断是否大于60  
    		{
    			Sec=0;
    			if(++Min>=60)//++Min先自增再判断是否大于60
    			{
    				Min=0;
    				if(++Hour>=24)//++Hour先自增再判断是否大于60
    				{
    					Hour=0;
    				}
    			}
    		}
    	}
    	if(flag_2==9)
    	{
    		flash_tip=~flash_tip;//每4.5秒进行取反
    		flag_2=0;
    	}
    
    }

  • 您还可以看一下 徐朋老师的2021年软考系统集成项目管理工程师基础知识(下)软考视频教程课程中的 法和法律、诉讼时效、法律体系小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对选择做算法和嵌入式开发方向时需要注意的因素,可以从以下几个方面进行考虑:

    1. 自身兴趣和志向

    选择自己喜欢的方向可以更好地激发自己的积极性,提高工作效率,取得更好的职业发展。因此,应该优先考虑自己对于算法和嵌入式开发的兴趣和志向。

    1. 就业前景和市场需求

    就业前景和市场需求也是影响选择方向的重要因素。可以通过查阅各方面的就业数据,了解当前市场对于算法和嵌入式开发人才的需求状况,以及未来发展趋势,来做出更科学的选择。

    1. 个人能力和技能

    个人能力和技能也是制约选择方向的重要因素。算法方向需要具备扎实的数学功底、编程能力和创新能力;嵌入式开发方向需要具备电路设计能力、嵌入式开发能力和相关硬件知识等。根据自己的能力和技能进行合理选择能够更好地发挥自身优势,提高成功率和职业发展。

    1. 行业趋势和技术变革

    行业趋势和技术变革对于选择方向也具有一定的影响。例如,在智能物联网时代,嵌入式系统的应用越来越广泛,需要借助互联网和云计算等技术不断进行升级和变革;同时,算法方向也需要不断跟随技术变革,开发出更加实用和高效的算法应用。

    综上,选择做算法和嵌入式开发方向时应该综合考虑以上因素,并进行科学的选择。同时,还可以参考一些过来人的经验和教训,了解行业发展趋势和实际工作,进行更加明智的选择。