谈谈你对单片机的认识?
从大一的时候在大学图书馆看到关于AVR单片机的书籍,到参加竞赛、工作,我和单片机已经打了六七年的交道了吧。其间我都是在做产品的软件开发,与硬件工程师合作,根据需求选择合适的单片机型号和外围器件,完成代码编写。积累了一点对单片机选型、特点的认识。
所以这篇想谈谈关于单片机特点和选型。
单片机
MCU,微处理器,他有很多名字,但是我还是喜欢叫他单片机,因为他就是单单的一片,没什么其他的模块,一片里面就集成了CPU,RAM、ROM等,冯·诺依曼必有的结构单元。只要外部给他晶振,给他电源,他就能像计算机一样工作起来。高级一点的单片机内部RC就能起振,外部晶振都可以免去,只要外部给个稳定的3.3V,就可以工作。
单片机设备做的可以有多小?看到老外玩的蚊子飞机,就知道了,大学的时候非常的震惊,也是这样,让我对飞行器着迷不已。
听过一个趣闻,就是为什么一个字节是8个BIT,而不是12个?据说是最早的芯片,因为工艺限制了,只能有八个引脚,想要更多的引脚怎么办,多用几个八脚芯片就好了,于是1个字节对应一个芯片,一个芯片的八个脚对应八个比特就顺理成章了。
计算机的技术从来都是往两个方向发展的,一个是计算速度快,资源多,同时可处理的事件多,相对应的,功耗大,体积大。一个就是计算速度慢,资源少,但是价格低廉,体积小,功耗低。
前者所发展而来的就是咱们的计算机,WINDOWSLINUX操作系统,后者就是单片机系统了,各种嵌入式操作系统。手机的范畴有点迷了,我还是愿意把手机放在单片机系统这个层面来看。
在从业人数规模来看,前者发展出来的计算机,软件编程带动了多少人的就业,我们把这从事这职业的人叫做“码农”,他们的工作就是在前人对计算机一层一层又一层的封装下,进行针对应用的开发。顶层软件层的开发需要,促成JAVA、C#、PYTHON这样的语言出现,这些语言本身不涉及底层,只是调用底层的接口函数。显而易见的,想通过JAVA让计算机主板发出一个方波信号出来,是何等困难,但对应的是用JAVA在通用电脑屏幕上显示一串数字是何等的简单。
后者单片机,开发的人数就不如通用计算机了,单片机资源少,可用的“轮子”少,啥玩意都需要自己自力更生。能快速的发出方波,如果有DDS芯片的话,可以调制出正弦波,等等通用主机模块做不到的功能。更加的自定义!缺陷的话,显而易见的,想通过单片机在屏幕上显示一串HELLO WORLD字符,那得是进阶的人才能做到的咯!
所以单片机软件开发不是“纯软件”开发,也需要对硬件有相当的学习,对数字电路、模拟电路也要了解才行。这一行门槛高,很难速成,一定是慢慢积累~
是否“裸奔”
裸奔,顾名思义就是单片机穿不穿衣服?衣服是啥,操作系统呗!
选单片机的时候,根据需求不同,首先要选此单片机是否需要跑操作系统,还是裸奔。
· 当需要用复杂协议栈的时候,操作系统变得非常有用。
例如,希望咱们的单片机可以连互联网,通过网线联网,或者通过WIFI信号联网,那么多半需要运行操作系统,如果不跑操作系统也行,但是工作量很大,不稳定。
工程师需要比方案,咱们比比方案。
1 、开源的RTOS几乎都提供TCP/IP协议栈,社区的开源代码经过很多人,很多年的稳定运行。
2、自己写TCP/IP协议栈,嵌入到裸奔工程中,稳定性未知,BUG数量未知。
两个方案肯定选择前者,笔者自己试过在ENC28J60网卡芯片上自己硬刚协议栈,其中艰难不言而喻,到最后还是妥协选择开源社区。
·当需要运行多个复杂任务的时候,操作系统很有用
操作系统提供TASK机制,消息管理机制,如果上位机编程经验的人,对线程会有很深刻的理解,不同的TASK就是不同的线程。有了TASK机制,对任务的管理就会方便的多。好像安卓系统运行起来了,咱们可以用JAVA为他随时增加新功能,下个APK包,安装就好了,对吧。
什么时候,我会选择裸奔单片机?
裸奔有裸奔的好处,笔者怕黑。认为“上位机”开发人员之所以天天加班,有干不完的事,改不完的BUG,最大的原因就是“黑”。黑盒子太多了。黑盒子指的是一个程序块,这个程序块你压根不知道他是怎么实现的,你只知道他提供什么功能,至于自己是不是正确的调用了黑盒子的接口,你只能通过文档去看,然后就不断不断的试错,效率极低。所以很多时候大神上位机开发人员,是对黑盒子(某语言提供的对象、方法)有深刻掌握的人!
裸奔的单片机不一样,如果你愿意,启动时的汇编代码都可以自己写,配置好时钟,配置好各样的寄存器,所有的代码都是你自己写的,出了问题自己找,自己的代码还找不出原因,那就废了。如果你觉得C语言也是黑盒子,为了躲避C语言开发者给你留的坑,你甚至可以用汇编写代码,当然这个我不推荐了,C语言很棒,bug很少。裸奔开发,你眼前唯一的黑盒子就是硬件是如何实现的,也只有硬件能坑你一把。
不言而喻,裸奔的单片机代码,虽然简单,但是所能做的功能也会有局限。
裸奔的话,联网什么的别想了。
所以如果需求比较简单,一定裸奔,需求困难,就跑操作系统。
什么单片机支持操作系统?
理论上,只要ROM/RAM资源足够,所有的单片机都可以执行嵌入式操作系统,但是,不是所有人都有移植操作系统的能力。
新手还是得靠厂家帮你移植操作系统,所以选单片机的时候,得问一下,上网查一下,它支持哪些操作系统?
以TI的 CC2640为例,这玩意支持TI自家的嵌入式操作系统 TI-RTOS,好用!
裸奔的话,所有单片机都能裸奔,毕竟不穿衣服谁不会啊~
温度特性
注意要看设计产品的工作温度区间,是民用级,还是军工级,有些单片机芯片高低温实验过不了的,会出现代码起飞,内部FLASH莫名丢几个等这些问题,不要等代码写好,送去拿证了,过不了高低温,被老板骂~
低功耗特性
芯片是否有较好的休眠模式,老牌的芯片厂家都非常注重硬件低功耗模式,提出了各种各样的睡眠方式,TI就是把低功耗做的很好的厂家。如果是设计电池供电的产品,一定要考虑低功耗。低功耗更多需要代码去优化,这看一个软件工程师的水平~
一个纽扣电池,产品用一年,那就太牛了!
开发环境
喜欢IAR还是MDK?笔者喜欢IAR多一点,感觉界面很硬朗,MDK的话显得像是在写上位机软件~CORTEX Mx系列的单片机多半都是用MDK开发的,STM32算是明星级产品了。TI的产品大多是用IAR。所以哪个开发环境你更熟悉,也可以作为考虑范畴。
芯片是否冷门?
STM32的技术支持是真的多,资料满天飞,所以如果对自己读DATASHEET的能力有所怀疑的话,一定要选类似STM32这样的popular芯片。
选冷门芯片是对自己的很大挑战,你会发现百度问题几乎没人答,你得写英文e-mail给原厂工程师,满心欢喜克服语言困难写完,他也不会理你。你得翻墙去国外论坛找资料。但是一旦你开发好,你会成就感爆棚,也会觉得,单片机不过如此~然后写一些关于这个芯片的CSDN文章,帮助建设社区!
学生的话可以推荐尝试尝试,工作的就算了,都996了别升级007咯~
最近的状态
大学的时候,对单片机,对飞行器的热情,我都在年复一年,日复一日的工作中慢慢淡去了。现在我唯一想的就是努力把产品做好,卖到世界的各个角落,这也算change world的一种方式吧~嘿嘿,自己给自己熬点鸡汤,愿明天会好~
分享的这些,若是有用的话,点个赞呗~
单片机节日彩灯课程设计,从两边向中间点亮依次循环不止。亮灭时间为0.25S,用一个开关控制彩灯的工作?
/* 程序详细功能介绍:
*利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。
*在用表格进行程序设计的时候,要用以下的指令来完成
*(1).利用MOV DPTR,#DATA16的指令来使数据指针寄存器指到表的开头。
*(2).利用MOVC A,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数据。
*因此,只要把控制码建成一个表,而利用MOVC 工,@A+DPTR做取码的操作,
*就可方便地处理一些复杂的控制动作.
*/
#include
unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,
0x00,0xff,0x00,0xff,
0x01};
unsigned char i;
void delay(void)
{
unsigned char m,n,s;
for(m=20;m>0;m–)
for(n=20;n>0;n–)
for(s=248;s>0;s–);
}
void main(void)
{
while(1)
{
if(table[i]!=0x01)
{
P0=table[i];
i++;
delay();
}
else
{
i=0;
}
}
}
********************************************************************/
/* 实验目的:掌握单片机的查表原理,掌握MOV DPTR,#DATA16指令,MOVC A,@A+DPTR的运用
* 实验内容:利用MOVC A,@A+DPTR的指令,控制8个发光二极管的流水亮灭。
*/
/* 程序详细功能介绍:
*利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。
*在用表格进行程序设计的时候,要用以下的指令来完成
*(1).利用MOV DPTR,#DATA16的指令来使数据指针寄存器指到表的开头。
*(2).利用MOVC A,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数
据。
*因此,只要把控制码建成一个表,而利用MOVC A,@A+DPTR做取码的操作,
*就可方便地处理一些复杂的控制动作.
*/
ORG 0000H
LJMP START
ORG 0100H
START:
MOV DPTR,#TABLE ;取DPTR的地址,即表格的起始地址
LOOP:
CLR A ;对A清零
MOVC A,@A+DPTR ;查表
CJNE A,#01H,LOOP1 ;判断是否到了表格的结尾处,当A等于01时程序往下执行,否则跳到 LOOP1
LJMP START ;跳到程序的开头循环执行
LOOP1:
MOV P0,A ;把取得的表格数据送到P0
LCALL DELAY ;延时
INC DPTR ;DPTR加一,即把DPTR指向下一个表格单元
LJMP LOOP
DELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间,从而改变流水灯移动速度
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
;以下为流水灯的花样表格,每个数据对应一个时刻下的LED的状态
;TABLE的数据最后会被编译器安排到单片机的FLASH程序存储区里,CPU运行时只能读取,不能修改。
TABLE:
DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH
DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH
DB 07FH,0BFH,0DFH,0EFH
DB 0F7H,0FBH,0FDH,0FEH
DB 07FH,0BFH,0DFH,0EFH
DB 0F7H,0FBH,0FDH,0FEH
DB 00H, 0FFH,00H, 0FFH
DB 01H
END
单片机实验心得体会
通过今次单片机实训,使我对单片机的认识有了更深刻的理解。
系统以51单片机为核心部件,利用汇编软件编程,通过键盘控制和数码管显示实现了基本时钟显示功能、时间调节功能,能实现本设计题目的基本要求和发挥部分。
由于时间有限和本身知识水平的限制,本系统还存在一些不够完善的地方,要作为实际应用还有一些具体细节问题需要解决。
例如:不能实现只用两个按键来控制时钟时间,还不能实现闹钟等扩展功能。
踉踉跄跄地忙碌了两周,我的时钟程序终于编译成功。
当看着自己的程序,自己成天相伴的系统能够健康的运行,真是莫大的幸福和欣慰。
我相信其中的酸甜苦辣最终都会化为甜美的甘泉。
但在这次实训中同时使我对汇编语言有了更深的认识。
当我第一次接触汇编语言就感觉很难,特别是今次实训要用到汇编语言,尽管困难重重,可我们还是克服了。
这次的实训使培养了我们严肃认真的做事作风,增强了我们之间的团队合作能力,使我们认识到了团队合作精神的重要性。
这次实训的经历也会使我终身受益,我感受到这次实训是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。
希望这次的经历能让我在以后学习中激励我继续进步。
我们电子工艺的期末作业 实验四 单片机最小系统设计 求大神解答 求原理图 么么哒
- 实验四 单片机最小系统设计一、实验步骤设计一带电源的单片机最小系统板,要求如下:1、带有电源模块,从外部输入电源到稳压芯片,将稳压芯片输出电压作为整个设计的供电电压。2、其中一个P口连接8盏LED灯,并且每个支路串联500欧姆限流电阻。3、其中一个P口连接8个按键开关。4、各口带上拉电阻,5.1k5、将四个口都引出对外接口7、各相关芯片需要有滤波用瓷介电容8、晶振采用12M9、采用子图设计,分为以下部分:(1)单片机子图(2)电源子图(3)LED灯子图(4)按键子图(5)重启子图 (一)、原理图绘制 根据要求绘制原理图,有需要用到自行绘制的芯片则采用库自行绘制 (二)、PCB板绘制 1、根据元器件大小绘制板边界 2、修改线宽规则Design – Rules – Routing – Width – Width – 改为需要的值 Min 8mil Max 50mil 3、按功能把各部分分别放置 4、绘制电路,电源线与地线要求50mil,其余为10mil 5、PCB姬定灌剐弑溉鬼税邯粳错误检查Tools – Design Rules Check – RunDesign Rules Check
- 做一个小小的电路板,挺好
c51单片机外部中断实验,需要编写程序,,,急急急!!!
- 你好!我想主程序跑一遍后,人为按键(外部中断0)暂停,待一些时间(时间不定)后再触发开始从头重跑程序,请各位大侠指导,万分感谢!
- 简单啊,你确定你学过单片机,这是最基本的了
msp430单片机开发板做数码管动态显示实验时有数码管显示有阴影 代码如下,,新手勿笑。
- #includemsp430x14x.hunsigned char hellow[8]={0x76,0x79,0x38,0x38,0x3f,0x40,0X3碃亥百酵知寂版檄保漏F,0X3F};unsigned char led[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xBF,0x7F,0xff};void delay(){ unsigned int i ; for(i=0;i300;i++);}void main(void){ unsigned char i; P4DIR|=0XFF;P4OUT|=0XFF; WDTCTL=WDTPW+WDTHOLD; P4DIR=0XFF; P6DIR=BIT6; P5DIR=BIT5; while(1) { for(i=0;i8;i++) { P5OUT=0X00; P6OUT=0XFF; P4OUT=hellow[i]; P6OUT=0X00; P5OUT=0XFF; P4OUT=led[i]; delay(); P5OUT=0X00; } }}问题补充: 有几条指令多余了,,使用p5.5控制位码锁存芯片hc573,,用p6.6控制的段码的 hc573,延时时间越短阴影越严重。 求大神帮忙。
- 有阴影是什么意思,更新太快?把延时时间加长。
这是stm32系列的单片机,这是跑马灯的实验,请问这个问题出现在哪里?
- 你应该是少了添加这个结构体的文件了
单片机做串口实验时程序里while的作用
- #include#define uint unsigned int#define uchar unsigned char uchar code d[]="I get ";uchar flag,i,a;void play(){ TMOD=0x20; TH1=0xf3; TL1=0xf3; TR1=1; SM0=0; SM1=1; REN=1; ES=1; EA=1; } void main () { play();while(1){ if(flag==1) { ES=0;for(i=0;i6;i++){ SBUF=d[i]; while(!TI); TI=0;}SBUF=a;while(!TI);TI=0;ES=1; } } } void intt()interrupt 4 { RI=0; a=SBUF; flag=1; }这是我的程序 当我把里面的while去掉 我要传送数据我传送一个q时 我要按好多下手动传送才能传送出去为什么问题补充: 程序:#include reg51.h#define uint unsigned int#define uchar unsigned char uchar code d[]="I get ";uchar flag,i,a;void play(){ TMOD=0x20; TH1=0xf3; TL1=0xf3; TR1=1; SM0=0; SM1=1; REN=1; ES=1; EA=1;}void main (){ play();while(1){ if(flag==1) { ES=0;for(i=0;i6;i++){ SBUF=d[i]; while(!TI); TI=0;}SBUF=a;while(!TI);TI=0;ES=1; }} } void intt()interrupt 4 { RI=0; a=SBUF;flag=1; }
- while可以让程序保持运行而不会结束
单片机实验74HC138译码器时,程序循环循环慢了只依次亮2、4、6、8灯,循环快了都依次亮,什么原因
- void main(void){unsigned char i = 0;while(1){switch(i) 位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;显示第0位case(1):LSA=1;LSB=0;LSC=0; break;显示第1位case(2):LSA=0;LSB=1;LSC=0; break;显示第2位case(3):LSA=1;LSB=1;LSC=0; 氦绩份啃莓救逢寻抚默break;显示第3位case(4):LSA=0;LSB=0;LSC=1; break;显示第4位case(5):LSA=1;LSB=0;LSC=1; break;显示第5位case(6):LSA=0;LSB=1;LSC=1; break;显示第6位case(7):LSA=1;LSB=1;LSC=1; break;显示第7位}Delay10ms(50);i++;if(i == 8){i = 0;}}}Delay10ms(50);改为5的时候8个灯都依次亮,大于10以上只依次亮第2、4、6、8灯什么原因啊,
- 需要给你写一份吗
单片机实验编写程序
- p1.0-p1.3作为输入口接波动开关k1-k4,p1.4-p1.5作为输出口,接发光管LED1-LED4,读取开关状态,将此尝恭佰枷脂磺拌委饱莲状态在LED1-LED4上显示出来,,,编写程序~~求大神
- 这么点程序还要帮忙?
单片机,ds1302时钟电路显示问题,时间一直跳变(在开发板上实验的正常)
- 单片机ds1302钟电路显示问题间跳变显示全发板测试实验切实现功能产间总跳其显示求帮助求指导
- 1302三根线加拉电阻试试
大家好,挑毛病:这是合泰单片机的一个调试程序,实验结果是pa不闪烁,请问为什么?
- **********************此程序调试结果,pa口不闪烁,请问为什么?**********************#include "HT66F0172.h"unsigned int i;void main(){ i=0; _wdtc=0b10101111;关闭看门狗 _acerl=0x00;/缉怠光干叱妨癸施含渐;关闭ADC _pac=0x00; _pa=0x00; _tm0c0=0x00;_t0ck0=_t0ck1=_t0ck2=0;时钟源,14系统时钟 _t0m0=_t0m1=1;工作模式,普通模式 _t0cclr=1;计数清零模式,计数器0比较清零 _tm0dl=0x00; _tm0dh=0x00; _tm0al=0xe8;初值1000 _tm0ah=0x03; _mf0e=1;使能CTM中断 _t0ae=1;比较器A中断使能 _emi=1;开总中断 _t0on=1;开始 while(1) { if(i=2000) { i=0; _pa=~_pa; } }}void __attribute((interrupt(0x0c))) isr_timer0 (void)定时器0中断{ i++; _mf0f=0; _t0af=0;}
- 关注这个问题