求51单片机c语言教程 pdf
单片机学习方法:
网上单片机资料很多:
http://www.mcufan.com/scom.htm
http://www.51c51.com/cyuyan.htm
http://www.laogu.com/downtop.aspx
上面去搜搜看单片机的学习资料,都有入门级的
另外书店里面入门级的书也很多,可以买一本(北航出版的比较好)
1.入门时先了解单片机的构造啊原理啊
2.如果没有实验板自己搭建单片机的最小平台是比较难的
网上有个叫proteus的软件,可以用于单片机的仿真,就是说你编的程序可以在这个软件里运行,效果挺逼真的,可免费下载.
3.单片机的编程软件有keil或者wave,推荐前者,可以用c语言编写也可以汇编语言,c语言比较好学,推荐入门学习c语言,(可以买c和汇编语言都有介绍的单片机的书)
4.然后用keil编写程序在proteus上跑起来,如果你能点亮经典的单片机流水灯实验,那你就已经入门了
另:单片机的开发板或者最小系统可以买,电路水平高的话也可以自己搭建起来,51单片机大概6块左右一片自己搭建最小系统很便宜滴,学单片机一定要多做实验,不过推荐还是从仿真入门,仿真成功了后面的就有方向了.
单片机c语言模块化编程,如何定义全局变量。
1.使用关键字extern修饰申明。
例如:
主文件中定义 int g_ival = 0;
别的文件里面用 extern int g_ival;申明一下就可以用了。
2.模块化编程是指将一个庞大的程序划分为若干个功能独立的模块,对各个模块进行独立开发,然后再将这些模块统一合并为一个完整的程序。这是C语言面向过程的编程方法,可以缩短开发周期,提高程序的可读性和可维护性。
3.在单片机程序里,程序比较小或者功能比较简单的时候,我们不需要采用模块化编程,但是,当程序功能复杂、涉及的资源较多的时候,模块化编程就能体现它的优越性了。如前面我们写过的HT1380驱动程序、独立按键扫描程序和12864程序,每一个程序都是只用一个源文件编写就能完成,但是,当您制作一个12864液晶日历的时候,需要用到HT1380驱动程序、独立按键扫描程序和12864显示程序,如果把这三个程序全部集中在一个源文件里,将导致主体程序臃肿且杂乱,这样做并非不可取,只是降低了程序可读性、可维护性和代码的重用率。如果把这三个程序当做三个独立的模块放到你的主体工程进行模块化编程,效果就不一样了。实际上,模块化编程就是模块合并的过程,就是建立每个模块的头文件和源文件并将其加入到主体程序的过程。主体程序调用模块的函数是通过包含模块的头文件来实现,模块的头文件和源文件是模块密不可分的两个部分,缺一不可。所以,模块化编程必须提供每个模块的头文件和源文件。
单片机C语言编程
KEY4 EQU 30HKEY2 EQU 31HORG 0000HLJMP MAINORG 0030HMAIN: CLR EA MOV SP,#5FH MOV KEY2,#0 MOV KEY4,#0LOOP: JB P1.0,LOOP MOV R7,#10 LCALL DELAY JB P1.0,LOOP JNB P1.0,$ MOV P3,#0C0HLOOP0: LCALL KEYDEAL MOV A,KEY4 JNZ LOOP41 MOV A,P3 ANL A,#0F0H ORL A,#0EH MOV P3,A SJMP LOOP21LOOP41: DEC A JNZ LOOP42 MOV A,P3 ANL A,#0F0H ORL A,#0DH MOV P3,A SJMP LOOP21LOOP42: DEC A JNZ LOOP43 MOV A,P3 ANL A,#0F0H ORL A,#0BH MOV P3,A SJMP LOOP21LOOP43: DEC A JNZ LOOP21 MOV A,P3 ANL A,#0F0H ORL A,#07H MOV P3,ALOOP21: MOV A,KEY2 JNZ LOOP22 MOV A,P3 ANL A,#0FH ORL A,#20H MOV P3,A SJMP LOOP3LOOP22: DEC A JNZ LOOP3 MOV A,P3 ANL A,#0FH ORL A,#10H MOV P3,ALOOP3: LJMP LOOP0;----------------------------DELAY: MOV R2,#2DLY1: MOV R3,#250 DJNZ R3,$ DJNZ R2,DLY1 DJNZ R7,DELAY RET;-----------------------------KEYDEAL: JB P1.1,KEYEN1 MOV R7,#10 LCALL DELAY JB P1.1,KEYEN1 JNB P1.1,$ INC KEY4 MOV A,KEY4 ANL A,#03H MOV KEY4,AKEYEN1: JB P1.2,KEYEN2 MOV R7,#10 LCALL DELAY JB P1.2,KEYEN2 JNB P1.2,$ INC KEY2 MOV A,KEY2 ANL A,#01H MOV KEY2,AKEYEN2: RET;----------------------------- END
单片机C51 C语言编程问题!!!!
void display(uchar shi,uchar ge){uint ledout[1],i; //这里应该是ledout[2]我在proteus上进行了仿真,但是不知道什么原因,只对共阳极LED数码管好使。我就把程序稍微做了改动,仿真结果可以正确计时。我把程序贴在下面供参考#include#define uchar unsigned char#define uint unsigned intuchar num=0,count=0,num2=0,shi=0,ge=0;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳//段选数据表//uchar code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};uchar code wei[2] = {0xfe,0xfd}; //位选数据表void display(uchar,uchar);void delay(uint);void main(){ TMOD=0x10; //设定定时器1工作在方式1 TH1=(65536-50000)/256; //装载初值 TL1=(65536-50000)%256; //开总中断 //开定时器1中断 ET1=1; //启动定时器1 TR1=1; //程序在此不停对于数码管动态扫描 等待中断 EA=1; while(1) { display(shi,ge); //显示函数 } }void display(uchar shi,uchar ge){uint ledout[2],i; ledout[0]= table[shi]; //段选数据 十位 ledout[1]= table[ge]; // 段选数据 各个 for (i=0;i<2;i++) { //用P0输出位选数据 P0=wei[i]; //这里用查表的方式来赋值 P2=ledout[i]; //用P2输出段选数据 delay(1); //扫描间隔 } } //1S中断函数void T1_time() interrupt 3{ TH0=(65536-50000)/256; //重新装载初值 TL0=(65536-50000)%256; count++; if(count==20) //如果到了20次,说明1秒到 { //把COUNT清零 重新计数20次 count=0; num2++; // 用NUM2向来数码管显示 到60后归零 if(num2==60) num2=0; shi=num2/10; //把NUM2分成2个数 十位和个位 ge=num2%10; }}void delay(uint xms){ uint i,j; for(i=xms; i > 0; i--) //延时程序 for(j = 110 ;j > 0; j--);}