找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: xiekailun
打印 上一主题 下一主题
收起左侧

c语言很差 可以学单片机吗

  [复制链接]
521#
ID:414357 发表于 2018-10-23 22:58 | 只看该作者
可以的,相信自己
回复

使用道具 举报

522#
ID:414349 发表于 2018-10-23 22:59 | 只看该作者
其实在学校理论学习和应用中实践学习完全不同,实践中学习比较容易上手,遇到问题就查,慢慢就掌握了
回复

使用道具 举报

523#
ID:413530 发表于 2018-10-23 23:37 | 只看该作者
可以学的,我也是c语言基础不好,学了这么久发现单片机编程和c语言还是有很大差别的,学单片机主要是各种芯片和模块的使用方法和编程方法,但毋庸置疑的是C语言学好了的话学起来轻松很多,建议先看郭天祥的教学视频比较基础,成熟后可以看看吴剑鹰的。
回复

使用道具 举报

524#
ID:414385 发表于 2018-10-24 01:05 来自手机 | 只看该作者
c语言事基础,你可以带有兴趣的去学习,平时找一些小程序看看,单片机制作也会带来兴趣
回复

使用道具 举报

525#
ID:414432 发表于 2018-10-24 09:07 | 只看该作者
慢慢来 万事开头难 到后面就不难了
回复

使用道具 举报

526#
ID:413467 发表于 2018-10-24 09:30 | 只看该作者
可以的,可以多看看C语言这反面的书
回复

使用道具 举报

527#
ID:400683 发表于 2018-10-24 09:41 | 只看该作者
可以学,一边学一边不上
回复

使用道具 举报

528#
ID:414461 发表于 2018-10-24 09:58 来自手机 | 只看该作者
感觉好像没有必然联系,可以慢慢学,不断进步
回复

使用道具 举报

529#
ID:414462 发表于 2018-10-24 10:01 | 只看该作者
放弃吧,也是需要天赋的
回复

使用道具 举报

530#
ID:414510 发表于 2018-10-24 11:04 | 只看该作者
可以,先从基本的硬件电路了解,软件后续跟进
回复

使用道具 举报

531#
ID:414432 发表于 2018-10-24 11:06 | 只看该作者
C语言入门就可以 基础的一定要学好  单片机对c的要求不高
回复

使用道具 举报

532#
ID:414520 发表于 2018-10-24 11:09 | 只看该作者
边学边用,用多了就会了
回复

使用道具 举报

533#
ID:414590 发表于 2018-10-24 14:06 | 只看该作者
c语言很简单的,常用语句就那么几个。很快就能学会,如果用汇编那就麻烦了,开发效率很低,不过你要代码优化,那就要学汇编了。一般用不着。
回复

使用道具 举报

534#
ID:414604 发表于 2018-10-24 14:07 | 只看该作者
C语言是单片机基础
回复

使用道具 举报

535#
ID:241273 发表于 2018-10-24 15:33 | 只看该作者
可以啊
回复

使用道具 举报

536#
ID:324786 发表于 2018-10-24 16:02 | 只看该作者
学的差可以学,学不好就算了。C只是一门语言,但是总是看到有人说学不好C可以学其他的,怎么说,这是一种思维,一门学不好,都学不好。我说的
回复

使用道具 举报

537#
ID:414732 发表于 2018-10-24 16:49 | 只看该作者
什么都有个开始
回复

使用道具 举报

538#
ID:413632 发表于 2018-10-24 18:21 | 只看该作者
当然可以了,只要坚持就会学会,我没学过C语言就开始学习使用单片机,但是你要有一本C语言资料书可以查,查来直接用,渐渐地你就学会C语言了
回复

使用道具 举报

539#
ID:414809 发表于 2018-10-24 18:54 | 只看该作者
啥也别唠了,给你看一下最简单的六位时钟的一部分程序
#include <reg52.H>          //为了布线方便用到了P4口,故包含了STC专用的头文件,可以在STC-ISP软件中下载
#define LEDPORT P0
#define uchar unsigned char
#define uint unsigned int

sbit D1=P3^3;
sbit D2=P3^4;
sbit D3=P3^5;
sbit D4=P3^6;
sbit D5=P3^7;
sbit D6=P4^0;
sbit LED1=P2^5;
sbit LED2=P2^6;

sbit CLK =P2^1;                                         
sbit IO   =P2^2;
sbit RST =P2^3;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

unsigned char hour,min,sec;                //小时、分钟、秒
bit rev_start,rev_stop;                                   //GPS接收开始、结束标志位
unsigned char code tab[ ]={0xA0,0xBE,0x64,0x2C,0x3A,0x29,0x21,0xBC,0x20,0x28,0xFF};//0-9,灭

unsigned char  buf[10];         //GPS数据接收缓冲

unsigned char  irtime;//红外用全局变量,用于计算2个下降沿之间的时间
bit decode_ok,irok;
static unsigned char ircode[4];
unsigned char irdata[33];

uchar set,temp,dot;
bit flag,test;                                          
uint cnt;


void Timer_Init()
{
        TMOD=0x22;
        TH0=0x00; //重载值
        TL0=0x00; //初始化值
        ET0=1;    //开中断
        TR0=1;
        IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
        EX0 = 1;   //使能外部中断
        TL2 = 0xCD;                //设置定时初值
        TH2 = 0xF8;                //设置定时初值
        RCAP2L = 0xCD;                //设置定时重载值
        RCAP2H = 0xF8;                //设置定时重载值
        ET2=1;
        TR2=1;        
        
        TH1 = 0xFD;                //9600波特率的初值
    TL1 = TH1;                //9600波特率的初值
        TR1 = 1;  
        
        SCON = 0x50;        //使用串行工作方式1,10位异步收发8位数据,波特率可变(由T1的溢出率控制)
//        ES = 1;
        EA=1;
}

void inputbyte(unsigned char ucDa)
{
        unsigned char i;
        ACC = ucDa;
        for(i=8; i>0; i--)
        {
                IO = ACC0;                   //相当于汇编中的 RRC
                CLK = 1;
                CLK = 0;
                ACC = ACC >> 1;
        }
}

unsigned char outputbyte(void)
{
        unsigned char i;
        for(i=8; i>0; i--)
        {
        ACC = ACC >>1;                      //相当于汇编中的 RRC
        ACC7 = IO;
        CLK = 1;
        CLK = 0;
        }
        return(ACC);
}

void write(unsigned char ucAddr, unsigned char ucDa)
{
        RST = 0;
        CLK = 0;
        RST = 1;
        inputbyte(ucAddr);                    //地址,命令
        inputbyte(ucDa);                      //写1Byte数据
        CLK = 1;
        RST =0;
}

unsigned char read(unsigned char ucAddr)
{
        unsigned char ucDa;
        RST = 0;
        CLK = 0;
        RST = 1;
        inputbyte(ucAddr);                    //地址,命令
        ucDa = outputbyte();                 //读1Byte数据
        CLK = 1;
        RST =0;
        return(ucDa);
}

void DS1302_init()
{
        if(read(0xc1)!=0x82)  //如果1302掉电,写入下面的初始值
        {
                write(0x8e,0x00);//关闭写保护
                write(0x80,0x22); //设置秒
                write(0x82,0x22);//设置分钟
                write(0x84,0x22); // 小时
                write(0x90,0xa5);//涓流充电
                write(0xc0,0x82);//掉电标志位
        }
}

void decode(void)//红外码值处理函数
{
  unsigned char i, j, k;
  unsigned char cord,value;

  k=1;
  for(i=0;i<4;i++)      //处理4个字节
     {
      for ( j=1; j<=8;  j++) //处理1个字节8位
         {
          cord=irdata[k];
          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
                    {
             value=value|0x80;
                        }
          else
                    {
             value=value;
                        }
          if(j<8)
                    {
                         value=value>>1;
                        }
           k++;
         }
     ircode[i]=value;
     value=0;     
     }
         if(ircode[2]==~ircode[3])
         decode_ok=1;//解码完毕后标志位置1
     
}

void Display(unsigned char a,b,c)   //数码管显示
{
        static unsigned char i;
        LEDPORT=0xff;
        switch (i)
        {
                case 0: if(a/16) LEDPORT=tab[a/16]&dot; else LEDPORT=tab[10]&dot;D1=0;D2=D3=D4=D5=D6=1;        break;
                case 1: LEDPORT=tab [a%16];   D2=0;D1=D3=D4=D5=D6=1;    break;
                case 2: LEDPORT=tab [b/16];            D3=0;D1=D2=D4=D5=D6=1;        break;
                case 3: LEDPORT=tab [b%16];        D4=0;D1=D2=D3=D5=D6=1;        break;
                case 4: LEDPORT=tab [c/16];            D6=0;D1=D2=D3=D4=D5=1;        break;
                case 5: LEDPORT=tab [c%16];    D5=0;D1=D3=D4=D6=D2=1;        break;
        }
        i++;
        if(i==6)i=0;
}

void ir_work()
{
        if(ircode[2]==0x1e)
        test=!test;
        if(ircode[2]==0x05)
        {
                set++;
                if(set==4)
                set=0;
        }
                                          if(set==1)
                                                  {
                                                                  if(ircode[2]==0x02|ircode[2]==0x06)                                                //hour
                                                                {
                                                                 temp=(read(0x85)/16)*10+read(0x85)%16;
                                                                 temp++;if(temp==24)temp=0;
                                                                 write(0x84,(temp/10)*16+temp%10);
                                                                        
                                                                }
                                                                if(ircode[2]==0x08|ircode[2]==0x04)
                                                                {
                                                                        temp=(read(0x85)/16)*10+read(0x85)%16;
                                                                 temp--;if(temp==-1)temp=23;
                                                                 write(0x84,(temp/10)*16+temp%10);
                                                                }         
                                                  }

                                                  
                                                  if(set==2)                                                                         //min
                                                  {
                                                                  if(ircode[2]==0x02|ircode[2]==0x06)        
                                                                {
                                                                 temp=(read(0x83)/16)*10+read(0x83)%16;
                                                                 temp++;if(temp==60)temp=0;
                                                                 write(0x82,(temp/10)*16+temp%10);
                                                                        
                                                                }
                                                                if(ircode[2]==0x08|ircode[2]==0x04)
                                                                {
                                                                        temp=(read(0x83)/16)*10+read(0x83)%16;
                                                                 temp--;if(temp==-1)temp=59;
                                                                 write(0x82,(temp/10)*16+temp%10);
                                                                }         
                                                  }

                                                  if(set==3)                                                                         //sec
                                                  {
                                                                  if(ircode[2]==0x02|ircode[2]==0x06)        
                                                                {
                                                                 temp=(read(0x81)/16)*10+read(0x81)%16;
                                                                 temp++;if(temp==60)temp=0;
                                                                 write(0x80,(temp/10)*16+temp%10);
                                                                        
                                                                }
                                                                if(ircode[2]==0x08|ircode[2]==0x04)
                                                                {
                                                                        temp=(read(0x81)/16)*10+read(0x81)%16;
                                                                 temp--;if(temp==-1)temp=59;
                                                                 write(0x80,(temp/10)*16+temp%10);
                                                                }         
                                                  }
                                            decode_ok=0;        
}


void main()
{
        Timer_Init();
        DS1302_init();
        dot=0xff;
        flag=1;
        while(1)
        {                 
                        hour= read(0x85);
                        min = read(0x83);
                        sec  = read(0x81);
                        
                /*        if((hour==0x08)&&(min==0x00) )                         //可以设置为每天的某个时间打开GPS对一下时间再关掉,这里设置的是8:00
                        ES=1;
                        else
                        ES=0;*/
                        if(flag==1&&cnt>500)                                  //上电稍做延时再打开串口,防止数码管显示出错
                        {
                                flag=0;
                                cnt=0;
                                ES=1;
                        }
               
               
                        if((rev_stop==1)&&(buf[1]=='M')&&(buf[2]=='C')&&(buf[3]==','))//如果接收到GPRMC        就把GPS接收到的时间写入DS1302
                        {
                                          ES=0;
                                        hour= (buf [4]-0x30)* 16+ buf[5] -0x30;
                                        min=  (buf [6]-0x30)* 16+ buf[7]-0x30;
                                        sec=  (buf[8]-0x30)* 16+ buf[9]-0x30;
                                        hour=  hour / 16 * 10 + hour % 16;
                                        hour= (hour+8) % 24;        //UTC Time换算成北京时间
                                        hour=hour/10*16+hour%10;
                                        write(0x84,hour);
                                        write(0x82,min);
                                        write(0x80,sec);        
                                        ES=1;
                                        rev_stop=0;
                        }               

                        if( sec==  (buf[8]-0x30)* 16+ buf[9]-0x30)                                        //用左上角的小点显示有无GPS信号
                        dot=0xdf;
                        else
                        dot=0xff;
                           
                        if(irok)                        //如果接收到正确的红外信号后进行红外处理
                        {   
                          decode();
                          irok=0;
                        }
                        
                        if(decode_ok)                  //如果解码正确就进入调时程序
                        {
                                ir_work();
                        }
                        
                          if(test)                                                //需要时可以遥控关闭屏幕
                          {
                                            ET2=0;
                                          P0=0xff;
                                          LED1=LED2=1;
                          }
                          else
                          {
                                  ET2=1;
                          }         
                                   
        }                    
               
}

void int0 (void) interrupt 0 //外部中断0服务函数           用于红外解码
{
        static unsigned char  i;             //接收红外信号处理
        static bit startflag;                //是否开始处理标志位

        if(startflag)                        
        {
                if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
                i=0;                  
                irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
                irtime=0;
                i++;
                if(i==33)
                {
                         irok=1;
                         i=0;
                }
        }
        else
        {
                irtime=0;
                startflag=1;
        }

}
void timer0 (void) interrupt 1 //定时器0中断服务函数 ,红外解码
        {
            irtime++; //计算2个下降沿之间的时间
        }

void Uart_Receive(void) interrupt 4         //串口中断,用于GPS数据接收
{
        unsigned char ch,num;
        ES = 0;
        
        if (RI)                                        //如果接收完成则进入
        {
                ch = SBUF;
回复

使用道具 举报

540#
ID:414900 发表于 2018-10-24 21:05 | 只看该作者
可以学,买一块51单片机开发版,因为51的比较简单,先按照开发版的教程码代码,把原理搞明白了再自己拓展。51学会了可以学32的。用一些仿真软件慢慢练习
回复

使用道具 举报

541#
ID:414974 发表于 2018-10-24 23:03 | 只看该作者
自学,C语言是必须要的
回复

使用道具 举报

542#
ID:414979 发表于 2018-10-24 23:35 来自手机 | 只看该作者
c语言一定要补的,每天两小时,坚持一个月就可以很熟练运用了
回复

使用道具 举报

543#
ID:384353 发表于 2018-10-25 05:17 | 只看该作者
可以学单片机 但学习单片机的时候可能还需要巩固c语言知识 观察有什么差别 不过我觉得可以同时学习的
回复

使用道具 举报

544#
ID:277063 发表于 2018-10-25 09:29 | 只看该作者
学单片机是可以提高C语言的,所以加油吧
回复

使用道具 举报

545#
ID:415166 发表于 2018-10-25 13:08 | 只看该作者
可以,边学边练习,逐渐提高
回复

使用道具 举报

546#
ID:415169 发表于 2018-10-25 13:15 | 只看该作者
学单片机,最好多学学汇编编程,了解基本的CPU内部结构、指令码的组成执行方式等知识,为日后学习像ARM这种比较复杂的CPU建立好一些基础的概念。
回复

使用道具 举报

547#
ID:261175 发表于 2018-10-25 14:01 | 只看该作者
可以的,基础的单片机编程只用到了一点点c语言,后面复杂的话也可以一边学单片机一边学c语言
回复

使用道具 举报

548#
ID:415202 发表于 2018-10-25 14:10 | 只看该作者
其实单片机用的c语言都很基础,主要是与数电相结合,只需要基础就能编写程序的,所以不过太担心,只要想学就能学好的。花点时间就是了
回复

使用道具 举报

549#
ID:415210 发表于 2018-10-25 14:14 | 只看该作者
可以的 先慢慢的学 单片机里面不会的再对照着查 很简单的
回复

使用道具 举报

550#
ID:415199 发表于 2018-10-25 14:19 | 只看该作者
说汇编的……汇编更加偏向基础理解,如果要真正掌握微机原理,汇编更加好。但我们一般应用单片机还是用C语言更加易学易懂
回复

使用道具 举报

551#
ID:415222 发表于 2018-10-25 14:34 | 只看该作者
可以,51单片机的编程最开始学的主要是调用函数
回复

使用道具 举报

552#
ID:415241 发表于 2018-10-25 14:58 | 只看该作者
推荐郭天祥的10天学会单片机视频,上手巨快,一个国庆假期就差不多,而且刚开始的C语言很简单
回复

使用道具 举报

553#
ID:415254 发表于 2018-10-25 15:03 | 只看该作者
可以,不过单片机也可以用汇编语言或者c语言
回复

使用道具 举报

554#
ID:415254 发表于 2018-10-25 15:04 | 只看该作者
学单片机其实也是要学一部分C的
回复

使用道具 举报

555#
ID:415278 发表于 2018-10-25 15:34 | 只看该作者
可以的,虽然我C语言,单片机都重修了,但其实没学好并不妨碍单片机的学习。真的
回复

使用道具 举报

556#
ID:415267 发表于 2018-10-25 15:39 | 只看该作者
关键是兴趣,如果对单片机感兴趣,C语言有什么可以难倒你
回复

使用道具 举报

557#
ID:415306 发表于 2018-10-25 16:07 | 只看该作者
当然可以了,建议边学边复习c,在用的过程自然而然的就会了,c并不难,理解了逻辑就好。
回复

使用道具 举报

558#
ID:415302 发表于 2018-10-25 16:11 来自手机 | 只看该作者
可以的,单片机对c语言的要求不是很高,只要认真学习都是可以的
回复

使用道具 举报

559#
ID:415331 发表于 2018-10-25 16:34 | 只看该作者
可以的,这个只要入门就简单了
回复

使用道具 举报

560#
ID:413875 发表于 2018-10-25 17:37 | 只看该作者
当然可以,加油学习,慢慢来
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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