我是怎样自学单片机程序设计实例的

单片机视频教程_51单片机学习大全
单片机就是将一台电脑的结构(CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等))全部集成在一个芯片上,所以就称为单片机。那么如何才能学习好单片机呢?下面我们从简单开始,系统的学习单片机的操作及编程。
单片机视频教程
单片机学习资料
单片机编程
单片机原理图
技术交流、我要发言
发表评论,获取积分! 请遵守相关规定!提 交您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
自学单片机心得体会分析.docx 39页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:300 &&
你可能关注的文档:
··········
··········
  自学单片机心得体会
  无论是作为一名业余的电子爱好者还是一名电子行业的相关从业人员,掌握单片机技术无疑可以使您如虎添翼,为您的电子小制作或者开发设计电子产品时打开方便的大门!
  而且现在学习单片机技术的热潮正在不断升温,电子发烧友网开设了详细的单片机学习专栏和人气非常旺的论坛讨论组,对于想学习单片机的朋友来说帮助很大,可以说现在的单片机学习环境是最好的,经过一段时间的努力,采用单片机来开发设计电子产品已经不再是专业电子工程师的“专利”!作为一个普通的电子爱好者完全可以通过一番努力后熟练掌握!国外的电子爱好者采用单片机来设计小制作非常普及,一些智能机器人、智能自动装置内部都离不开单片机的身影~~~
  学习单片机技术有一定的难度,不花费一番努力是很难学会的,但是只要不断努力就一定能成功,套用一句广告歌词:努力总有回报!
  学习单片机最好从51系列开始,第一是书多、资料多,而且掌握51技术的人多,碰到问题能请教的老师也就多了,51系列的实验芯片AT89C51价格低廉而且很容易买到,AT89C51芯片而且可以反复擦写1000次以上,对于初学者来说真是太合适了,就算以后考虑工业运用,也可以先学透51后再学其他类型的单片机,毕竟技术是相通的。
  学习单片机的第一步是看书,单片机是一个知识密集的东东,不看书是绝对不行的,北京航空航天大学出版社出版了大量单片机方面的好书,你可以直接登录他们的网站进行邮购。本人认为第一本书应该是8051单片机的基础原理书,我看的第一本书是问单位一位大学生同事借的清华大学出版社的《单片机的原理及接口技术》这本是51的大学教科书,比较系统地介绍了51芯片的基础知识,我认为这本书对我帮助还是很大的,可以很系统地了解51单片机,虽然一开始不容易看懂,不过确实很有用,很有嚼头,可以先大致看一遍,不消化的可以以后在试验实践中反复研究。
  这里我推荐初学者一张学习单片机的多媒体光盘,这张光盘中有比较详细的单片机基础知识,因为是图文并茂,所以学习起来比较容易上手,学习容易产生兴趣,当然最终还是要看书的,毕竟书更系统全面。
  《MCS-51单片机实用接口技术》这是一本北京航空航天大学出版社出版的一本好书,它详细描述了单片机的常见接口技术,对于想以后开发产品的话,那就人手一本吧!《单片机实践与运用》这本书详细介绍了用单片机作的实验,有很实用的汇编源程序,可以通过学习模仿上面的程序加以试验,快速掌握单片机技术。
  学习单片机的第二步是购买工具,单片机芯片必须借助编程器才能写入程序,站长用的编程器是一种性能较好的Genius NSP 通用编程器,通用编程器的特点是专为开发单片机和烧写各类存储器而设计的通用机型,它的编程可靠性高,支持的器件品种很多。
  Genius NSP 通用编程器:
  4Opins万用锁紧插座。适应绝大多数器件编程之所需。使用适配器能够支持非DIP封装器件的编程。
  RS232窜口通讯。通讯波特率:57600bit/s
  9V/500mA电源转换器。
  主要功能:EPROM、EEPROM、FLASH、MPU/CPU、PLD。Serial EEPROM六大类器件的编程;RAM器件及CMOS/TTL器件的测试等等。
  可选择的器件插入自动探测启动功能,即当您选择该功能并启动后,不再需要每次点击鼠标启动操作,每次当您更换芯片并锁紧万用插座后操作自动启动。
  Genius NSP 可以在 WINDOS95、 98、me、2000、XP上运行。
  从长远的方面考虑,购置一台通用编程器是很有必要的。
  学习单片机的第三步是反复编程实践,这里需要一块AT89C51的试验板。
  仿真器对单片机初学者来说既是那么耳熟,同时又有些陌生,这主要是因为市场上传统的仿真器价格都在千元以上,对经济不是非常宽裕的人来说是不小的开支。同时仿真器是用来提高调试程序效率的,也不是非需不可的,所以站长在自学单片机开始的时候也没有用过仿真器,碰到程序出错的时候,只好苦思冥想,或者在程序中插入一些驱动端口的指令,然后再接上一些发光二极管做简单指示,一般调试一个程序,反复烧写几十次芯片是很经常的。
  现在我们介绍一种新型的廉价在线仿真器:它使用一片宏晶公司 【SST公司】的STC89C516RD 的单片机,仿真机通过串口与 PC 连接,该型号单片机是51系列单片机中的一种,具有ISP(在系统可编程)功能,程序可串行下载,可仿真63K用户程序空间,具有450个外部RAM字节。
  具备了必要的工具以后就可以开始学习单片机了,对单片机进行编程可以采用汇编语言或者C语言,汇编语言的特点是代码紧凑,对初学者的电脑水平要求低、上手快,但是程序编写工作量大,站长网站的程序范例就是采用汇编语言编写的,这里说的C语言是专用于51单
正在加载中,请稍后...前辈学51单片机的感悟是怎么样的?说说看 - 知乎684被浏览61109分享邀请回答int main(void) //一个main函数 搞定
P0 = 0xxx;
linux:驱动程序:
#include&linux/init.h&
#include&linux/module.h&
#include&linux/fs.h&
//file_operatios
#include&linux/device.h& //class_create/device_create
#include&linux/slab.h&
#include&asm/io.h&
#include&asm/uaccess.h&
#include"led.h"
struct s5pv210_device *s5pv210_dev;
volatile unsigned long *gpc0con = NULL;
volatile unsigned long *gpc0dat = NULL;
static int led_open(struct inode *inode, struct file *file)
printk(KERN_INFO"%s()-%d\n", __func__, __LINE__);
/*初始化GPC0_3,GPC0_4引脚功能为输出功能*/
*gpc0con &= ~((0xf&&12)|(0xf&&16));
*gpc0con |= ((0x1&&12)|(0x1&&16));
static int led_close(struct inode *inode, struct file *file)
printk(KERN_INFO"%s()-%d\n", __func__, __LINE__);
//iounmap(S5PV210_PA_GPC0CON);
static ssize_t led_read(struct file *file, char __user *buf, size_t count, loff_t *offset)
printk(KERN_INFO"%s()-%d\n", __func__, __LINE__);
//write(fd, &val, 4)
static ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)
unsigned int val;
printk(KERN_INFO"%s()-%d\n", __func__, __LINE__);
/*获取用户空间数据*/
ret = copy_from_user(&val,buf,count);
printk(KERN_ERR"copy data from user failed!\n");
return -ENODATA;
printk(KERN_INFO"copy data from user: val=%d\n",val);
*gpc0dat |= ((0x1&&3)|(0x1&&4));
*gpc0dat &= ~((0x1&&3)|(0x1&&4));
return ret?0:count;
static struct file_operations led_fops={
.owner = THIS_MODULE,
.open = led_open,
.read = led_read,
.write = led_write,
.release = led_close,
static int __init led_init(void)
printk(KERN_INFO"%s()-%d\n", __func__, __LINE__);
s5pv210_dev = kmalloc(sizeof(struct s5pv210_device),GFP_KERNEL);
if(s5pv210_dev==NULL)
printk(KERN_INFO"no memory malloc for s5pv210_dev!\n");
return -ENOMEM;
led_major = register_chrdev(0,"led",&led_fops);
if(led_major&0)
printk(KERN_INFO"register major failed!\n");
ret = -EINVAL;
goto err1;
/*创建设备文件*/
s5pv210_dev-&led_class = class_create(THIS_MODULE,"led_class");
if (IS_ERR(s5pv210_dev-&led_class)) {
printk(KERN_ERR "class_create() failed for led_class\n");
ret = -EINVAL;
goto err2;
s5pv210_dev-&led_device = device_create(s5pv210_dev-&led_class,NULL,MKDEV(led_major,0),NULL,"led");
if (IS_ERR(s5pv210_dev-&led_device)) {
printk(KERN_ERR "device_create failed for led_device\n");
ret = -ENODEV;
goto err3;
/*将物理地址映射为虚拟地址*/
gpc0con = ioremap(S5PV210_PA_GPC0CON,8);
if(gpc0con==NULL)
printk(KERN_INFO"ioremap failed!\n");
ret = -ENOMEM;
goto err4;
gpc0dat = gpc0con + 1;
device_destroy(s5pv210_dev-&led_class,MKDEV(led_major,0));
class_destroy(s5pv210_dev-&led_class);
unregister_chrdev(led_major,"led");
kfree(s5pv210_dev);
return ret;
static void __exit led_exit(void)
printk(KERN_INFO"%s()-%d\n", __func__, __LINE__);
unregister_chrdev(led_major,"led");
device_destroy(s5pv210_dev-&led_class,MKDEV(led_major,0));
class_destroy(s5pv210_dev-&led_class);
iounmap(gpc0con);
kfree(s5pv210_dev);
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
应用程序:#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&
#include &stdio.h&
#include &errno.h&
#include &stdlib.h&
#include &unistd.h&
#include &string.h&
** ./led_test on
** ./led_test off
int main(int argc, char **argv)
int val =0;
fd = open("/dev/led", O_RDWR);
perror("open failed!\n");
if(strcmp(argv[1], "on")==0)
if(write(fd, &val, 4)!=4)
perror("write failed!\n");
close(fd);
android:不知道大家清不清楚android与linux之间的关系。android是基于linux内核的,linux操作系统的5大组件:驱动,内存管理,文件系统,进程管理,网络套接字。android是基于linux kernel上的,大家平时只看到了app。app是java语言的,其实每运行一个java应用程序,实际上是fork一个linux应用程序。android四大组件,activity,service,Broadcast Receiver,Content Provider。这是android的主要框架,java应用开发是基于这开发的。android平台是基于linux 内核的。在linux运行之后才建立起java世界。直接上代码:上面的linux的驱动在android是一样的,适用于android。驱动ok之后是应用层了,也就是应用程序。我下面就是最直接的应用,不包含任何android框架性的东西,大家可以直接看到,应用app-&jni-&linux驱动这三层调用关系。下面是jni代码是c++;#define LOG_TAG "led-jni-log"
#include &utils/Log.h&
#include "jni.h"
#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&
#include &stdio.h&
#include &errno.h&
#include &unistd.h&
#include &stdlib.h&
static int fd = -1;
jint open_led(JNIEnv *env, jobject thiz)
LOGD("$$$%s\n", __FUNCTION__);
fd = open("/dev/led1", O_RDWR);
if(fd & 0)
LOGE("open : %s\n", strerror(errno));
return -1;
jint led_on(JNIEnv *env, jobject thiz)
LOGD("$$$%s\n", __FUNCTION__);
int val = 1;
jint ret = 0;
ret = write(fd, &val, 4);
if(ret != 4)
LOGE("write : %s\n", strerror(errno));
return -1;
jint led_off(JNIEnv *env, jobject thiz)
LOGD("$$$%s\n", __FUNCTION__);
int val = 0;
jint ret = 0;
ret = write(fd, &val, 4);
if(ret != 4)
LOGE("write : %s\n", strerror(errno));
return -1;
jint close_led(JNIEnv *env, jobject thiz)
LOGD("$$$%s\n", __FUNCTION__);
if(fd & 0)
close(fd);
static JNINativeMethod myMethods[] ={
{"openDev", "()I", (void *)open_led},
{"onDev", "()I", (void *)led_on},
{"offDev", "()I", (void *)led_off},
{"closeDev", "()I", (void *)close_led},
jint JNI_OnLoad(JavaVM * vm, void * reserved)
JNIEnv *env = NULL;
jint ret = -1;
ret = vm-&GetEnv((void **)&env, JNI_VERSION_1_4);
if(ret & 0)
LOGE("GetEnv error\n");
return -1;
jclass myclz = env-&FindClass("com/ledtest/LedActivity");
if(myclz == NULL)
LOGE("FindClass error\n");
return -1;
ret = env-&RegisterNatives(myclz, myMethods, sizeof(myMethods)/sizeof(myMethods[0]));
if(ret & 0)
LOGE("RegisterNatives error\n");
return -1;
return JNI_VERSION_1_4;
然后是java app:package com.ledtest;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class LedActivity extends Activity {
final String TAG = "LedActivity";
public Button btn_on = null;
public Button btn_off = null;
public void init() {
btn_on = (Button) this.findViewById(R.id.btn1);
btn_on.setOnClickListener(clickListener);
btn_off = (Button) this.findViewById(R.id.btn2);
btn_off.setOnClickListener(clickListener);
OnClickListener clickListener = new OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
Log.d(TAG, "led on in app");
case R.id.btn2:
Log.d(TAG, "led off in app");
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_led);
openDev();
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_led, menu);
return true;
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
closeDev();
System.loadLibrary("led_jni");
public native int openDev();
public native int onDev();
public native int offDev();
public native int closeDev();
框架是这样的:最上层是java ,点开app,点击一下一个button,点亮了LED,调用onDev();onDev调用c++的led_on,然后led_on是调用驱动的led_write,明白不?这样说吧:linux 驱动是最下层的,驱动嘛。然后是c++层,c++包装一下是给java调用的,然后到java层。下面是android比价经典的一张框架图。linux在最下面。lib 是动态库。然后是JNI,然后是Framework(android框架),然后是大家喜闻乐见的app。linux在最下面。lib 是动态库。然后是JNI,然后是Framework(android框架),然后是大家喜闻乐见的app。49369 条评论分享收藏感谢收起21739 条评论分享收藏感谢收起查看更多回答2 个回答被折叠()我单片机自学经历_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
我单片机自学经历
&&前些天翻出了学单片机以来买元件和书籍的单据。因为我是打算在计算机硬件方面花1万元左右,所以保留了大部分的收据,以便统计金额。到目前为止大概用了3千多元,包括买元件、书籍和上网费。没有计算交通费,也不折算投入的时间精力。
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 单片机c语言程序设计 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信