矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: 往事已去

单片机学习路线求教

[复制链接]
     
发表于 2023-11-18 15:35:29 | 显示全部楼层
学习单片机,肯定是51入门,建议用KeilC,调试程序比较方便,先用最简单硬件平台,C语言开始先不要使用指针,试着写跑马灯>>>读写串口(学会用串口作为调试的一种手段,会终身受益)>>>使用定时器>>>读取键盘>>>使用外部中断>>>驱动数码管>>>读写IIC EEPROM>>>驱动LCD>>>扩展IO/RAM/ROM,等把一款单片机所有的内部模块都玩会,顺带摸透单片机里的各种寄存器,基本上C语言已经能简单应用了,这时如果想提高C语言水平,可以学习使用C指针.搞单片机开发,不会用指针也能玩好,但没法发挥C语言的强项,C教材都有涉及指针方面的知识,只要用心学,一般一周左右可以熟练运用了(因人而异,汗).
下面就可以试着做一个综合性的小项目练练手,例如将前面学习的简单例子综合在一起,这时候就需要学习多文件源程序的管理,keilC在这方面很友好,将源文件加入工程就好,这期间主要学习编写复杂点的逻辑代码,全局变量的管理,C语言的知识点,宏定义>>>数据结构>>>联合体>>>枚举>>>函数指针等等,在这个小项目中尽量能够用上这些知识,如果都能做到,已经可以熟练应用C语言.
到这一步,会面临不同选择,有点人偏向于硬件,例如尝试玩这种单片机,有的人选择偏向于软件,例如选择一款ARM平台,从简单的RTOS开始玩起,比如keilM自带RTX,可以使用标准C库,把它玩好了,也就对操作系统也熟悉了,也可以玩玩其他简单的RTOS如UCOS,freertos,rt-thread等,这些RTOS基本思路都一致,有了keil RTX的基础,学习起来都很容易,当然前面列出的RTOS,学习顺序可以根据自己的兴趣决定,玩精通一种便可.以后可以玩更高性能的ARM(或其他架构),玩更高深的linux,玩到这一层次,会发现前面学习的知识只是一条小溪流,后面要接触的却一片汪洋,里面有穷其一生也学习不完的知识,但是玩单片99%的人都一直在小溪流里洄游,离大海还很远.
能从51单片机玩到linux,算是嵌入式了,不局限于硬件和软件,两者都应该通吃设计到,搭建硬件平台(使用核心板或从头搞起)>>>搭建linux内核编译平台>>>编译linux内核>>>移植新硬件编写驱动程序>>>给APP开发任意搭建运行环境>>>编写linuxAPP,这是嵌入式linux路线,还有一条Android计算路线,只有最后一步是编写的安卓APP,前面的步骤相同,.如果是搞linux应用,需要学习gcc+make编译工程>>>调取系统显示缓存显示画面>>>接入鼠标/键盘/触摸屏>>>应用网络/wifi+网络编程(如果需要联网),如果是安卓路线,恶补Java知识>>>搭建android开发环境>>>编写安卓APP,
C语言玩好了,也可以转PC软件路线,也可以继续玩硬件,每个人在学会了一项技能后都会有更多选择等着你.没有人能全知全会,必须学会在一些时间节点选择什么放弃什么,只有学会的才是自己的.
楼主如果已经有了一点单片机基础,建议STM32/arduino选择一条路,深耕下去,对什么感兴趣就学什么.如果楼主年龄比较大的话,建议玩玩arduino吧,它容易入门,容易做出东西,网上的资料也多,硬件也好搞.
回复 支持 反对

使用道具 举报

     
发表于 2023-11-19 14:03:32 来自手机 | 显示全部楼层
abbey_tom 发表于 2023-1-2 12:07
这种东西其实没有必要,
看着就头大,
并且输入程序时,


这种拼音命名法才是真正糟蹋了汉字 ,汉字本来是表意文字不需要知道读音就能知道意思,而换成拼音后得拼读出来,还要纠结声调对不对才能猜出意思。
而英文就显得更表意一些,写程序又不需要读出来,一看那个单词的形就知道是什么意思。这也是很多程序员对程序里用拼音命名的行为深恶痛绝的原因
回复 支持 反对

使用道具 举报

     
发表于 2023-11-19 14:51:03 | 显示全部楼层
SPKBL 发表于 2023-11-19 14:03
这种拼音命名法才是真正糟蹋了汉字 ,汉字本来是表意文字不需要知道读音就能知道意思,而换成拼 ...

那就有点两难了,
汉字虽然很优秀,
但还是不适合用于编程,
个人觉得主要原因,
是汉语之间没有空格,
很容易发生歧义,
不利于编译器的实现。

尽管拼音确实有您说的诸多不足,
但在可预见的相当长时间,
纯汉字编程是不切实际的。
拼音是不习惯用英文的人编程的权宜之计,
作为助记符至少可行并且难有其它更好的替代方式
虽然拼起来费劲一些,
但可以在不改变任何现有环境的条件下立即上手使用。

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-11-19 19:51:43 | 显示全部楼层
SPKBL 发表于 2023-11-19 14:03
这种拼音命名法才是真正糟蹋了汉字 ,汉字本来是表意文字不需要知道读音就能知道意思,而换成拼 ...

“而英文就显得更表意一些,……,一看那个单词的形就知道是什么意思”
说反了吧?汉字一目十行,英文要仔细看每个字母,反正我英语不行,得详细看字母,中文非常快
回复 支持 反对

使用道具 举报

     
发表于 2023-11-19 21:06:09 来自手机 | 显示全部楼层
往事已去 发表于 2023-11-19 19:51
“而英文就显得更表意一些,……,一看那个单词的形就知道是什么意思”
说反了吧?汉字一目十行,英文要 ...

我说的是:英语和汉字拼音相比,英语更表意一些,看满屏的汉语拼音你能一目十行吗?至少我看英语比拼音快多了
回复 支持 反对

使用道具 举报

     
发表于 2023-11-19 21:25:54 | 显示全部楼层
SPKBL 发表于 2023-11-19 21:06
我说的是:英语和汉字拼音相比,英语更表意一些,看满屏的汉语拼音你能一目十行吗?至少我看英语比拼音快 ...

同意,英文单词尤其某些缩写,的确很简洁明了

临时变量写作 tmp 很直观,写作 lssz (临时数值)这都啥
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-11-20 08:26:24 | 显示全部楼层
t3486784401 发表于 2023-11-19 21:25
同意,英文单词尤其某些缩写,的确很简洁明了

临时变量写作 tmp 很直观,写作 lssz (临时数值)这都 ...

确实拼音不行,即便把拼音拼写全也费劲,重码率太高,如果能用汉字的话太好了。以前2003年学的时候说keil对中文支持不好,不知道现在怎么样了?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-11-20 08:56:59 | 显示全部楼层
天天爱玛丽 发表于 2023-11-18 15:35
学习单片机,肯定是51入门,建议用KeilC,调试程序比较方便,先用最简单硬件平台,C语言开始先不要使用指针,试着 ...

感谢回复,知道了更远大的发展路线。但是对于初学者来说,看了这些头会变大 。反正我现在是先入个门,之前汇编算是入门了,但是也忘差不多了,不过再翻书应该能很快找回来。眼下的问题是C语言入门,现在看来不算太难,虽然书中有的地方还存疑惑,但估计问题不大。然后操练一下练练手,然后尝试做几个板子,成为二把刀 。再下来应该是算法的问题,怎么去实现指定的功能要求的问题了。然后就看自己的能力了,我觉得我成不了高手,也就二把刀-半瓶水的程度,中下水平。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-9 21:01:53 | 显示全部楼层
ztzp 发表于 2023-11-16 12:40
谢谢回复。
现在的编程平台也支持一键提示,而且还是智能的。
如果你还是觉得中文编程好,你可以通过宏 ...

想先搞个12864的屏操练下,抄了书上的驱动,然后把一些东西改成中文,主程序也是抄书上然后修改。但是出来一大堆错误,看样子不能用中文,例如#define 无符号字符型 unsigned char,行不通,具体不懂。书上说标识符只能由字母、数字、下划线组成,且以字母或下划线开头,没办法,人家做的软件,咱又改不了。然后我改回英文试试
4.jpg
3.jpg
2.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-13 11:46:28 | 显示全部楼层
本帖最后由 往事已去 于 2023-12-13 11:54 编辑

还是改成英文,又是一堆错误,逗号、括号不能用中文,大小写什么的,看来中英文混打确实不方便,中英文切换本身简单,但是会出错造成麻烦。改了几次后通过了。然后再试中文还是不行,人家不认中文 。然后用2003年买的TOP851编程器写入AT89C2051中。2051来自路边捡的板子 ,编程器还以为不行了,以为现在的电脑比以前快了很多,它有个10秒时间测试,实际不到2秒就走完了,通讯测试报告错误,想不到实际写成功了。但是开机后白屏,根本没字。驱动是照抄书上的,主程序是略加修改,改了字的内容,去掉连续闪3次,应该是可以的,清高手赐教。2051是搭棚焊,修改程序还得重焊。
12864屏程序.rar (1.46 KB, 下载次数: 5)
这是主程序:(怎么变成斜体了?)
#include <reg51.h>
#include <intrins.h>
#include <12864LCD Drive_Parallel.h>
#define uchar unsigned char
#define uint unsigned int
uchar code line1_data[] ={"12864屏操练"};
uchar code line2_data[] ={"C语言不能用中文"};
uchar code line3_data[] ={"还得用英文,但是"};
uchar code line4_data[] ={"不需要会英语"};
/*********以下是设定显示位置函数*********/
void LCD_pos (uchar X,uchar Y)
{
  uchar pos;
  if (X==1){X=0x80;}
  else if (X==2){X=0x90;}
  else if (X==3){X=0x88;}
  else if (X==4){X=0x98;}
  pos = X+Y;
  lcd_wcmd(pos);
}
/*********以下是主函数*********/
void main()
{
  uchar i;
  Delay_ms(100);                //上电等待
  lcd_init();
  while(1)
  {
     LCD_pos (1,0);           //设显示位置为第一行第一位
     for(i=0;i<16;i++)
       {
        lcd_wdat(line1_data);
        Delay_ms(100);             //每个字符停留时间100mS
       }
     LCD_pos (2,0);           //设显示位置为第二行第一位
     for(i=0;i<16;i++)
       {
        lcd_wdat(line2_data);
        Delay_ms(100);             //每个字符停留时间100mS
       }
     LCD_pos (3,0);           //设显示位置为第三行第一位
     for(i=0;i<16;i++)
       {
        lcd_wdat(line3_data);
        Delay_ms(100);             //每个字符停留时间100mS
       }
     LCD_pos (4,0);           //设显示位置为第四行第一位
     for(i=0;i<16;i++)
       {
        lcd_wdat(line4_data);
        Delay_ms(100);             //每个字符停留时间100mS
       }
==============
这是驱动:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*********12864LCD引脚定义*********/
#define LCD _data P1              // 数据口
sbit LCD_RS = P3^0;               //寄存器选择输入
sbit LCD_RW = P3^1;               //液晶读/写控制
sbit LCD_EN = P3^2;               //液晶使能控制
sbit LCD_PSB = P3^3;              //串/并方式控制,高为并,低为串
sbit LCD_RST = P3^5;              //液晶复位端口
/*********以下是函数声明*********/
void Delay_ms(uint xms);          //延时函数声明
void DelayNOP();                  //短延时函数声明
bit lcd_busy();                   //忙检查函数声明
void lcd_wcmd(uchar cmd);         //写指令函数声明
void lcd_wdat(uchar cmd);         //写数据函数声明
void lcd_init();                  //LCD并行初始化函数
void lcd_clr();                   //清屏函数声明
/*********以下是延迟函数*********/
void Delay_ms(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)              //i=xms即延迟x毫秒
      for(j=110;j>0;j--);
}
/*********以下是短延迟函数*********/
void DelayNOP()
{_nop_();_nop_();_nop_();_nop_();}
/*********以下是LCD忙检查函数,bit lcd_busy为1时忙,为0时闲,可写指令与数据*********/
bit lcd_busy()
{
  bit result;
  LCD_RS =0;
  LCD_RW =1;
  LCD_EN =1;
  DelayNOP();
  result = (bit)(P0&0x80);
  LCD_EN =0;
  return(result);
}
/*********以下是写指令函数*********/
void lcd_wcmd(uchar cmd)
{
  while(lcd_busy());
  LCD_RS =0;
  LCD_RW =0;
  LCD_EN =0;
  _nop_();
  _nop_();
  P1 = cmd;
  DelayNOP();
  LCD_EN =1;
  DelayNOP();
  LCD_EN =0;
}
/*********以下是写数据函数*********/
void lcd_wdat(uchar dat)
{
  while(lcd_busy());
  LCD_RS =1;
  LCD_RW =0;
  LCD_EN =0;
  P1 = dat;
  DelayNOP();
  LCD_EN =1;
  DelayNOP();
  LCD_EN =0;
}
/*********以下是LCD并行初始化函数*********/
void lcd_init()
{
  LCD_PSB =1;                    //设置为并口方式
  LCD_RST =0;                    //液晶屏复位
  Delay_ms(3);
  LCD_RST =1;
  Delay_ms(3);
  lcd_wcmd(0x34);                 //扩充指令操作
  Delay_ms(5);
  lcd_wcmd(0x30);                 //基本指令操作
  Delay_ms(5);
  lcd_wcmd(0x0C);                 //显示开,关光标
  Delay_ms(5);
  lcd_wcmd(0x01);                 //清除LCD的显示内容
  Delay_ms(5);
}
/*********以下是LCD清屏函数*********/
void lcd_clr()
{
  lcd_wcmd(0x01);                 //清除LCD的显示内容
  Delay_ms(5);
}
2.jpg
3.jpg
4.jpg
回复 支持 反对

使用道具 举报

     
发表于 2023-12-13 13:21:16 | 显示全部楼层
12864有一个引脚是调节显示内容对比度的,可能是第三脚,用一个电位器接在5V和0V之间,第三脚接电位器动片,上图没接吧
回复 支持 反对

使用道具 举报

     
发表于 2023-12-13 13:32:19 | 显示全部楼层
2051不是每个IO都能输出高电平,有些需要加外部上拉电阻。
2051.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-13 18:42:36 | 显示全部楼层
luosifu 发表于 2023-12-13 13:32
2051不是每个IO都能输出高电平,有些需要加外部上拉电阻。

这个屏本身自带电位器的,VC是空脚,板上JP1接上才能外面调节。电位器已经调过了,还是出不来字。
用MF30表5V档测电压,
P3.5 RST 4.8V,这个用数字表测是有10K上拉电阻的
P3.3 PSB发现与V+短路,然后才发现是板上P点短接的缘故,说明中说短接P是并口模式,短接S是串口模式,并口时建议短接P点,但没交代是直接接电源的,此时不要外面再接线
以下数字表测对V+都是1.3X兆欧,红接V+
P3.2 EN 2.6V
P3.1 RW4.7V
P3.0 RS 0V
P1.7-P1.2都是1.8V
P1.1-P1.0都是1.2V
上面都有电压说明有上拉电阻的,P3.0 RS 虽然是0V,但是本身这个脚就仅一瞬间有电压,0V正常,接10K上拉电阻还是不行。
晶体接了个11M的,电容43P,这没问题吧?REST 10u+10K,电容接V+,电源104CBB+100u电解。
2.jpg
回复 支持 反对

使用道具 举报

     
发表于 2023-12-13 18:48:26 | 显示全部楼层
找一个闲置的引脚,接一个发光二极管,在这个程序里加一段让这个发光管闪烁的代码,靠这个发光管看看单片机运行起来没有。
回复 支持 反对

使用道具 举报

     
发表于 2023-12-13 18:54:07 | 显示全部楼层
用万用表测单片机IO不适合,对于5V  TTL电平,1.2V不是高电平,1.8V也不是可靠的状态。这两个电压值,要么是IO反复翻转,电压表算出来的一个假数值,要么是高阻状态,所以这两个电压值不能直接说明问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-8 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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