0;z--)for(a=110;a>0;a--);}voidmain(void){while(1){led1=0;delay_ms(500);" />
搜档网
当前位置:搜档网 › 51单片机入门程序

51单片机入门程序

51单片机入门程序
51单片机入门程序

1点亮LED灯

#include "reg52.h"

sbit led1=P1^0;

void main(void)

{

while(1)

{

led1=0;

}

}

2延时函数

#include "reg52.h"

sbit led1=P1^0;

void delay_ms(int z)

{

int a;

for( ;z>0;z--)

for(a=110;a>0;a--); }

void main(void)

{

while(1)

{

led1=0;

delay_ms(500);

led1=1;

delay_ms(500);

}

}

3按键控制LED灯

#include "reg52.h"

sbit led1=P1^0;

void delay_ms(int z)

{

int a;

for( ;z>0;z--)

for(a=110;a>0;a--);

}

void main(void)

{

while(1)

{

led1=0;

delay_ms(500);

led1=1;

delay_ms(500);

}

}

4PWM控制LED灯

#include"reg52.h"

sbit led1=P1^0;

sbit led2=P1^7;

void delay_us(int a)

{

for( ;a>0;a--);

}

void main()

{ int p=0,l=300;

led2=0;

while(1)

{

led1=0;

delay_us(p);

led1=1;

delay_us(l);

p++;

if(p==300)

{

p=300;

}

l--;

if(l<0)

{

l=0;

}

// delay_us(300);

}

}

5库函数流水灯

#include "reg52.h"

#include "intrins.h"

void delay_ms(int z)

{

int a;

for( ;z>0;z--)

for(a=110;a>0;a--);

}

void main(void)

{

unsigned char a,s;

while(1)

{

a=0x7f;

for(s=0;s<8;s++) //循环8次

{ P1=a;

delay_ms(100); //延时一下每个灯亮300ms

a=_cror_(a,1);

}

a=0xfe;

for(s=0;s<8;s++) //循环8次

{ P1=a;

delay_ms(100); //延时一下每个灯亮300ms

a=_crol_(a,1);

}

}

}

6流水灯左右移动

#include "reg52.h"

void delay_ms(int d) //延时函数原理就是让单片机不停地作加减法运算{

int v;

for( ;d>0;d--)

for(v=110;v>0;v--);

}

void main()

{

int a;

while(1)

{

for(a=0;a<8;a++) //循环8次

{

P1=~(0x01<

delay_ms(300); //延时一下每个灯亮300ms }

for(a=0;a<8;a++) //循环8次

{

P1=~(0x80>>a); //依次点亮led

delay_ms(300); //延时一下每个灯亮300ms }

}

}

7外部中断

#include"reg52.h"

sbit led1=P1^0;

void delay_ms(int z)

{

int a;

for( ;z>0;z--)

for(a=110;a>0;a--);

}

void main(void)

{ EA = 1; // 打开总中断

EX0 = 1; // 打开中断0

IT0 = 0; // 触发方式=1高电平触发=0低电平触发

EX1 = 1; // 打开中断1

IT1 = 0; //

while(1)

{

led1=0;

delay_ms(200);

led1=1;

delay_ms(200);

}

}

void int0() interrupt 0

{

led1=0;

}

void int1() interrupt 2

{

led1=0;

delay_ms(500);

led1=1;

delay_ms(500);

}

8单个数码管

#include "reg52.h"

sbit w1=P2^4;

sbit w2=P2^5;

sbit w3=P2^6;

sbit w4=P2^7;

unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数组void delay_ms(int z) //延时函数

{

int a;

for( ;z>0;z--)

for(a=110;a>0;a--);

}

/*

主函数

*/

void main(void)

{

w1=0; //打开第一位数码管控制正极的三极管

while(1)

{

P0=smg[]; //显示下标为k的数

scankey(); //扫描按键状态

}

}

9两位数码管

#include "reg52.h"

sbit w1=P2^4;

sbit w2=P2^5;

unsigned char smg[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

}; //0-9数组291625334

void delay_ms(int z) //延时函数

{

int a;

for( ;z>0;z--)

for(a=110;a>0;a--);

}

/*

主函数

*/

void main(void)

{ int s=39;

while(1)

{

w1=0; //打开第一位数码管的正极

P0=smg[s/10]; //送入要显示的数据到数码管

delay_ms(2);//延时一会

P0=0xff; //

w1=1; //第一位数码管的正极也就失去了正极

w2=0; //打开第二位数码管的正极

P0=smg[s%10];//送入要显示的数据到数码管

delay_ms(2); //延时一会

P0=0xff;

w2=1;

}

}

10按键控制四位数码管

#include "reg52.h"

sbit w1=P2^4;

sbit w2=P2^5;

sbit w3=P2^6;

sbit w4=P2^7;

sbit k1=P3^2;

sbit k2=P3^3;

unsigned char smg[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

}; //0-9数组291625334

int k=0;

void delay_ms(int z) //延时函数

{

int a;

for( ;z>0;z--)

for(a=110;a>0;a--);

}

void display(unsigned int s)

{

w1=0; //打开第一位数码管的正极

P0=smg[s/1000]; //送入要显示的数据到数码管

delay_ms(2);//延时一会

P0=0xff; //

w1=1; //第一位数码管的正极也就失去了正极

w2=0; //打开第二位数码管的正极

P0=smg[s%1000/100];//送入要显示的数据到数码管

delay_ms(2); //延时一会

P0=0xff;

w2=1;

w3=0; //打开第一位数码管的正极

P0=smg[s%1000%100/10]; //送入要显示的数据到数码管

delay_ms(2);//延时一会

P0=0xff; //

w3=1; //第一位数码管的正极也就失去了正极

w4=0; //打开第二位数码管的正极

P0=smg[s%1000%100%10];//送入要显示的数据到数码管

delay_ms(2); //延时一会

P0=0xff;

w4=1;

}

/*

主函数

*/

void main(void)

{

while(1)

{ if(k1==0)

{

delay_ms(5);

if(k1==0)

{

k=k+50;

if(k>2000) k=0;

while(k1==0) display(k);

}

}

if(k2==0)

{

delay_ms(5);

if(k2==0)

{

k=k-50;

if(k<0)k=2000;

while(k2==0) display(k);

}

}

display(k);

}

}

11定时器

#include "reg52.h"

sbit w1=P2^4;

sbit w2=P2^5;

sbit w3=P2^6;

sbit w4=P2^7;

unsigned char smg[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

}; //0-9数组291625334

int m,c,f;

void delay_ms(int z) //延时函数

{

int a;

for( ;z>0;z--)

for(a=110;a>0;a--);

}

void display(unsigned int s,l)

{

w1=0; //打开第一位数码管的正极

P0=smg[s/10]; //送入要显示的数据到数码管

delay_ms(2);//延时一会

P0=0xff; //

w1=1; //第一位数码管的正极也就失去了正极

w2=0; //打开第二位数码管的正极

P0=smg[s%10];//送入要显示的数据到数码管

delay_ms(2); //延时一会

P0=0xff;

w2=1;

w3=0; //打开第一位数码管的正极

P0=smg[l/10]; //送入要显示的数据到数码管

delay_ms(2);//延时一会

P0=0xff; //

w3=1; //第一位数码管的正极也就失去了正极

w4=0; //打开第二位数码管的正极

P0=smg[l%10];//送入要显示的数据到数码管

delay_ms(2); //延时一会

P0=0xff;

w4=1;

}

/*

主函数

*/

void main(void)

{

TMOD=0x01; //设置定时器模式

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

while(1)

{

display(f,m);

}

}

void miaodata() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

c++;

if(c==20)

{

c=0;

m++;

if(m==60)

{

m=0;

f++;

if(f==60)

{

f=0;

}

}

}

}

12串口通信

#include

#define uchar unsigned char

#define baud9600 9600UL

#define baud19200 19200UL

#define fosc 11059200UL//其中,UL代表unsigned long #define baud_9600 1

sbit dj=P1^0;

sbit m0=P1^1;

sbit m1=P1^2;

int fx; //初始化舵机在中间

void delay(int a)

{

for(a=110;a>0;a--);

}

void stop()

{

m0=0;

m1=0;

}

void up()

{

m0=0;

m1=1;

}

void dn()

{

m0=1;

m1=0;

}

void serial_init(void)

{

TMOD=0x21;//T1工作在方式2

SCON=0x50;//SM1=1串口通信在模式1,REN=1并启动串口。

#if baud_9600

PCON=0;//波特率不加倍

TH1=256-(fosc*1)/(baud9600*12*32);

TL1=256-(fosc*1)/(baud9600*12*32);

#else

PCON=0x80;//波特率加倍

TH1=256-(fosc*2)/(baud19200*12*32);

TL1=256-(fosc*2)/(baud19200*12*32);

#endif

//如果PCON=0x80 则fosc*2即波特率加倍

TR1=1;//定时器1开始计时

ES=1;//串口开启

EA=1;//总总断开启

TH0=(65536-100)/256; //高8位装值

TL0=(65536-100)%256;//低8位装值

EA=1; //总中断开启

ET0=1; //定时器0开启

TR0=1; //定时器0开始计数

}

void Delay1000ms() //@12.000MHz

{

unsigned char i, j, k;

i = 46;

j = 153;

k = 245;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

int i=2;

uchar Buffer[5];

{

serial_init();

stop();

while(1)

{

// if(p32==0)

// delay(5);

// if(p32==0)

//{

// fx++;

// if(fx==3)fx=0;

// while(p32==0);

//}

// fx=1;

// delay(10);

// fx=0;

// delay(20);

// dj=1;

// delay(20);

// dj=0;

Delay1000ms();

}

}

// SBUF=Buffer[4];

// while(!TI) ; // TI=0;

void USART() interrupt 4 {

if(RI)

{

Buffer[i]=SBUF;

P1=SBUF;

SBUF=P1;

while(!TI);

TI=0;

RI=0;

}

if(i<0)

{

i=2;

//Buffer[2] Buffer[1] Buffer[1]

if(Buffer[0]==0xf1) up(); //前//数据自行定义上位机发送0xffffff 范围内的数据对应0xff ff ff

if(Buffer[0]==0xf2) stop(); //前停止

if(Buffer[0]==0xf3) dn(); //后

if(Buffer[0]==0xf4) stop(); //后停止

if(Buffer[0]==0xf5) fx=1;

if(Buffer[0]==0xf6) fx=0;

if(Buffer[0]==0xf7)fx=2;

if(Buffer[0]==0xf6)fx=0;

//

// if(Buffer[1]==0xf1) P1&=0xEF;

// if(Buffer[1]==0xf2) P1|=0x10;

// if(Buffer[1]==0xf3) P1&=0xdF;

// if(Buffer[1]==0xf4) P1|=0x20;

// if(Buffer[1]==0xf5) P1&=0xbF;

// if(Buffer[1]==0xf6) P1|=0x40;

}

}

int cont;

void time0() interrupt 1

{

TH0=(65536-100)/256; //高8位装值

TL0=(65536-100)%256;//低8位装值50000

cont++;

if(fx==0)

if(cont<= 185 )dj=0;else dj=1; //0

//

if(fx==1)

if(cont<=190)dj=0;else dj=1; // 右45

//

if(fx==2)

if(cont<=180)dj=0;else dj=1; //右45

if(cont==200)cont=0;

}

13直流电机正反转

#include "reg52.h"

sbit dianjizuo=P3^0;

sbit dianjiyou=P3^1;

sbit zhengzhuan=P3^2;

sbit fanzhuan=P3^3;

sbit tingzhi=P3^4;

void main()

{

while(1)

{

if(zhengzhuan==0)

{

dianjizuo=1;

dianjiyou=0;

}

if(fanzhuan==0)

{

dianjizuo=0;

dianjiyou=1;

}

if(tingzhi==0)

{

dianjizuo=1;

dianjiyou=1;

}

}

}

14交通灯

#include

#include

#define uchar unsigned char

uchar SMG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar a,b,num,numt=60;

sbit nblv=P1^0;

sbit nbhuang=P1^1;

sbit nbhong=P1^2; //南北

sbit dxhong=P1^3;

sbit dxlv=P1^4;

sbit dxhuang=P1^5; //东西void delay(int z)

{

int a;

for(;z>0;z--)

for(a=110;a>0;a--);

}

void display(int s)

{

P2=0x01;//打开位选

P0=~SMG[s/10];

delay(5);

P0=0xff;

P2=0x02;//打开位选

P0=~SMG[s%10];

delay(5);

P0=0xff;

}

void init()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void main()

{

init();

while(1)

{

display(numt);

}

}

void time0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

a++;

b++;

if(b==20)

{

b=0;

numt--; //数码管倒计时

if(numt==0)numt=60;

}

if(a==10)

{

a=0;

num++; //周期判断

if(num==120)num=0;

}

if(num<=60)nbhong=0;else nbhong=1; //南北红

if(num<=50)dxlv=0;

else

if(num==52)dxlv=0;

else if(num==54)dxlv=0;

else if(num==56)dxlv=0;

else dxlv=1; //东西绿

if(num>=56&&num<=60)dxhuang=0;

else dxhuang=1; //东西黄

if(num>=60&&num<=120)dxhong=0;

else dxhong=1; //东西红

if(num>=60&&num<=110)nblv=0;

else if(num==112)nblv=0;

else if(num==114)nblv=0;

else if(num==116)nblv=0;

else nblv=1; // 南北绿

if(num>=116&&num<=120)nbhuang=0; // 南北黄else nbhuang=1;

}

15光电计数器

#include "reg52.h"

sbit w1=P2^4;

sbit w2=P2^5;

sbit w3=P2^6;

sbit w4=P2^7;

sbit k1=P3^7; //接NPN接近开关的输出脚

sbit k2=P3^3;

sbit fmq=P2^3;

unsigned char smg[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

}; //0-9数组291625334

int k=0;

void delay_ms(int z) //延时函数

{

int a;

for( ;z>0;z--)

for(a=40;a>0;a--);

}

void display(unsigned char t)

{

w1=0; //打开第一位数码管的正极

P0=smg[t/1000]; //送入要显示的数据到数码管

delay_ms(2);//延时一会

P0=0xff; //

w1=1; //第一位数码管的正极也就失去了正极

w2=0; //打开第二位数码管的正极

P0=smg[t%1000/100];//送入要显示的数据到数码管

delay_ms(2); //延时一会

P0=0xff;

w2=1;

w3=0; //打开第一位数码管的正极

P0=smg[t%1000%100/10]; //送入要显示的数据到数码管

delay_ms(2);//延时一会

P0=0xff; //

w3=1; //第一位数码管的正极也就失去了正极

w4=0; //打开第二位数码管的正极

P0=smg[t%1000%100%10];//送入要显示的数据到数码管

delay_ms(2); //延时一会

P0=0xff;

w4=1;

/*

功能对k0-9 9-0的加减

*/

void scankey(void) //按键扫描

{

if(k1==0)

{

delay_ms(5);

if(k1==0)

{

k++;

while(k1==0) display(k);

}

}

}

/*

主函数

*/

void main(void)

{

while(1)

{scankey();

display(k);

if(k>=20)fmq=~fmq;

}

}

16脉冲控制步进

/*微信liyi1230a*/

#include "reg52.h"//定义头文件

sbit dir=P3^0; //定义方向引脚

sbit pul=P3^1; //定义方向引脚

sbit key1=P3^2; //定义按键引脚

sbit key2=P3^4; //定义按键引脚

void Delay10us() //@11.0592MHz

{

unsigned char i;

i = 2;

while (--i);

}

void Delayus(ii)//用来消抖的延时

for(;ii>0;ii--)

Delay10us();

}

void main() //主函数

{int kl=20;

while(1)//死循环

{

if(key1==0) //读取按键状态

{

Delayus(100);//延时消抖

if(key1==0) //再次读取按键状态

{

dir=~dir;//led0状态取反

while(key1==0);//按键松手检测

}

}

if(key2==0) //读取按键状态

{

Delayus(100);//延时消抖

if(key2==0) //再次读取按键状态

{

kl=kl+20;//led0状态取反

if(kl>80)kl=20;

while(key2==0);//按键松手检测

}

}

pul=~pul;

Delayus(kl);

}

}

17简易密码锁一

#include "reg52.h" //微信liyi1230a

sbit jidianqi=P2^2; //

sbit zhishideng=P1^0; //

sbit anjian1=P3^2;//

sbit anjian2=P3^3;//

sbit anjian3=P3^4;//

sbit anjian4=P3^5;//

void main() //主函数

{

int a1=0,a2=0,a3=0,a4=0;

while(1)

{

if(anjian1==0) //按键1按下

{

a1=1; //a标志位记录状态

}

if(anjian2==0) //按键1按下

{

a2=1; //a标志位记录状态

}

if(anjian3==0) //按键1按下

{

a3=1; //a标志位记录状态

}

if(anjian4==0) //按键1按下

{

a4=1; //a标志位记录状态

}

if(a1==0 && a2==1 && a3==1 && a4==0) //判断a是不是为1

{

jidianqi=0; //继电器吸合

}

}

}

18简易密码锁二

#include "reg52.h" //微信liyi1230a

sbit jidianqi=P2^2; //

sbit zhishideng=P1^0;//

sbit anjian1=P3^2;//

sbit anjian2=P3^3;//

sbit anjian3=P3^4;//

sbit anjian4=P3^5;//

void Delay10ms() //@11.0592MHz

{

unsigned char i, j;

i = 18;

j = 235;

do

{

while (--j);

} while (--i);

}

void main() //主函数

{

int a1=0,a2=0,a3=0;

51单片机实例程100讲全集

目录 目录 (1) 函数的使用和熟悉 (4) 实例3:用单片机控制第一个灯亮 (4) 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (4) 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (5) 实例6:使用P3口流水点亮8位LED (5) 实例7:通过对P3口地址的操作流水点亮8位LED (6) 实例8:用不同数据类型控制灯闪烁时间 (7) 实例9:用P0口、P1 口分别显示加法和减法运算结果 (8) 实例10:用P0、P1口显示乘法运算结果 (9) 实例11:用P1、P0口显示除法运算结果 (9) 实例12:用自增运算控制P0口8位LED流水花样 (10) 实例13:用P0口显示逻辑"与"运算结果 (10) 实例14:用P0口显示条件运算结果 (11) 实例15:用P0口显示按位"异或"运算结果 (11) 实例16:用P0显示左移运算结果 (11) 实例17:"万能逻辑电路"实验 (11) 实例18:用右移运算流水点亮P1口8位LED (12) 实例19:用if语句控制P0口8位LED的流水方向 (13) 实例20:用swtich语句的控制P0口8位LED的点亮状态 (13) 实例21:用for语句控制蜂鸣器鸣笛次数 (14) 实例22:用while语句控制LED (15) 实例23:用do-while语句控制P0口8位LED流水点亮 (16) 实例24:用字符型数组控制P0口8位LED流水点亮 (17) 实例25:用P0口显示字符串常量 (18) 实例26:用P0 口显示指针运算结果 (19) 实例27:用指针数组控制P0口8位LED流水点亮 (19) 实例28:用数组的指针控制P0 口8 位LED流水点亮 (20) 实例29:用P0 、P1口显示整型函数返回值 (21) 实例30:用有参函数控制P0口8位LED流水速度 (22) 实例31:用数组作函数参数控制流水花样 (22) 实例32:用指针作函数参数控制P0口8位LED流水点亮 (23) 实例33:用函数型指针控制P1口灯花样 (25) 实例34:用指针数组作为函数的参数显示多个字符串 (26) 实例35:字符函数ctype.h应用举例 (27) 实例36:内部函数intrins.h应用举例 (27) 实例37:标准函数stdlib.h应用举例 (28) 实例38:字符串函数string.h应用举例 (29) 实例39:宏定义应用举例2 (29) 实例40:宏定义应用举例2 (29) 实例41:宏定义应用举例3 (30)

51单片机新手入门实例详解

51单片机新手入门实例详解 1.硬件和软件准备 ●实验系统:EL89C单片机学习开发系统一套 ●电脑:具有标准串口的台式机或笔记本电脑,如果没有串口也可购 买一条USB转串口线代替 ●工具软件:Keil uVision2(用于编写和编译源程序、仿真调试); 光盘上非安装烧写软件,路径 \单片机EL89C\EL89C光盘\STC52单片机下载程序\stc-isp-v4.79-not-setup\STC_ISP_V483.exe (EL89C的编程控制烧写软件) 2.源程序编写和编译 EL89C的8个发光二极管负极通过限流电阻接入单片机的P1.0~P1.7端口,下面的范例程序可以使这8个发光二极管轮流点亮,形成流水灯效果。 我们使用的开发工具是Keil C51,是目前世界上最优秀、最强大的51单片机应用平台之一,它集编辑、编译、仿真调试于一体,支持汇编、C语言以及混合编程。同时具备功能强大的软件仿真和硬件仿真功能。 下面以一个简单的流水灯程序为例子来介绍Keil C51的使用方法: 2.1首先在硬盘上建立一个文件夹,命名为ledtest(当然可以是其他名字), 为方便程序的编写和调试,我们将调试过程中产生的文件都将放在这个目录中。 2.2启动Keil软件,点击菜单project,选择new project,然后选择你要保 存的路径,输入工程文件的名字,我们现在保存到刚才建立的ledtest目录中,工程文件命名为ledtest,然后点击保存。 2.3这时会弹出下面的对话框Select Device for Target,要求你为刚才的项 目选择一个CPU。我们选择Atmel的AT89C52,如图所示,选择AT89C52之后,右边一栏是对这个单片机的基本的说明,然后点击确定。

51单片机C语言编程基础与实例

基础知识:51单片机编程基础 单片机的外部结构: 1. DIP40双列直插; 2. P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3. 电源VCC(PIN40)和地线GND(PIN20); 4. 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) 5. 内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍) 6. 程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序) 7. P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务) 1. 四个8位通用I/O端口,对应引脚P0、P1、P2和P3; 2. 两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3. 一个串行通信接口;(SCON,SBUF) 4. 一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。 C语言编程基础: 1. 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2. 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。 3. ++var表示对变量var先增一;var—表示对变量后减一。 4. x |= 0x0f;表示为 x = x | 0x0f; 5. TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。 6. While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;} 在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚) 代码

最全最好的课程设计-51单片机电子日历时钟( 含源程序)

LED日历时钟课程设计 院系: 班级: 姓名: 学号: 指导教师: 2012 年06 月16 日

目录

摘要 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习、应用,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达学习、设计、开发软、硬件的能力。 第一章前言 数字电子钟具有走时准确,一钟多用等特点,在生活中已经得到广泛的应用。虽然现在市场上已有现成的电子钟集成电路芯片,价格便宜、使用也方便,但是人们对电子产品的应用要求越来越高,数字钟不但可以显示当前的时间,而且可以显示期、农历、以及星期等,给人们的生活带来了方便。另外数字钟还具备秒表和闹钟的功能,且闹钟铃声可自选,使一款电子钟具备了多媒体的色彩。单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。 时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。 AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k B ytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

单片机C语言编程实例

单片机C语言编程实例 前言 INTEL公司的MCS-51单片机是目前在我国应用得最广泛的单片机之一.随着 单片机应用技术的不断发展,许多公司纷纷以51单片机为内核,开发出与其兼容的 多种芯片,从而扩充和扩展了其品种和应用领域。 C语言已成为当前举世公认的高效简洁而又贴近硬件的编程语言之—。将C语言向单片机上的移植,始于20世纪80年代的中后期。经过十几年的努力,C语言终于成为专业化单片机上的实用高级语言。用C语言编写的8051单片机的软件,可以大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完善的系统。因此,不管是对于新进入这一领域的开发者来说,还是对于有多年单片机开发经验的人来说,学习单片机的C语言编程技术都是十分必要的。. C语言是具有结构化.模块化编译的通用计算机语言,是国际上应用最广.最多的计算语言之一。C51是在通用C语言的基础上开发出的专门用于51系列单片机编程的C语言.与汇编语言相比,C51在功能上.结构上以及可读性.可移植性.可维护性等方面都有非常明显的优势。目前 最先进、功能最强大、国内用户最多的C51编译器是Keil Soft ware公司推出的KeilC51。第 一章单片机C语言入门 1.1建立您的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码, 这样单片机才能执行编写好的程序。KEIL uVISION2是众多单片机应用开发软 件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑, 编译,仿真等于一体,同时还支持PLM、汇编和C语言的程序设计,它的界面 和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真 方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周 立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个

单片机编程全集(含源代码)

前言 (2) 基础知识:单片机编程基础 (2) 第一节:单数码管按键显示 (4) 第二节:双数码管可调秒表 (6) 第三节:十字路口交通灯 (7) 第四节:数码管驱动 (9) 第五节:键盘驱动 (10) 第六节:低频频率计 (15) 第七节:电子表 (18) 第八节:串行口应用 (19)

前言 本文是本人上课的一个补充,完全自写,难免有错,请读者给予指正,可发邮件到ZYZ@https://www.sodocs.net/doc/0016851421.html,,或郑郁正@中国;以便相互学习。结合课堂的内容,课堂上的部分口述内容,没有写下来;有些具体内容与课堂不相同,但方法是相通的。https://www.sodocs.net/doc/0016851421.html, 针对当前的学生情况,尽可能考虑到学生水平的两端,希望通过本文都学会单片机应用。如果有不懂的内容,不管是不是本课的内容,都可以提出来,这些知识往往代表一大部分同学的情况,但本人通常认为大家对这些知识已精通,而在本文中没有给予描述,由此影响大家的学习。对于这些提出问题的读者,本人在此深表谢意。 想深入详细学习单片机的同学,可以参考其它有关单片机的书籍和资料,尤其是外文资料。如果有什么问题,我们可以相互探讨和研究,共同学习。 本文根据教学的情况,随时进行修改和完善,所以欢迎同学随时注意本文档在课件中的更新情况。 基础知识:单片机编程基础 单片机的外部结构: 1、DIP40双列直插; 2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3、电源VCC(PIN40)和地线GND(PIN20); 4、高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) 5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍) 6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序) 7、P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务) 1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3; 2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3、一个串行通信接口;(SCON,SBUF) 4、一个中断控制器;(IE,IP) https://www.sodocs.net/doc/0016851421.html, 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。 C语言编程基础: 1、十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2、如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。 3、++var表示对变量var先增一;var—表示对变量后减一。 4、x |= 0x0f;表示为 x = x | 0x0f; 5、TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。 6、While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;} 在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)

51单片机课程设计

课程设计说明书
课程设计名称






学生姓名
指导教师
单片机原理及应用课程设计 电子信息工程 140405 20141329 李延琦 胡黄水
2016 年 12 月 26 日

课程设计任务书
课程设计 题目
酒精测试仪
起止日期
2016 年 12 月 26 日— 2017 年 1 月 6 日
设计地点
计算机科学与工程学 院单片机实验室 3409
设计任务及日程安排: 设计任务:分两部分: (一)、设计实现类:进行软、硬件设计,并上机编程、联线、调试、 实现; 1.电子钟的设计 2.交通灯的设计 3.温度计的设计 4.点阵显示 5.电机调速 6.电子音乐发声(自己选曲) 7.键盘液晶显示系统 (二)、应用系统设计类:不须上机,查资料完成软、硬件设计画图。 查资料选定题目。 说明:第 1--7 题任选其二即可。(二)里题目自拟。 日程安排: 本次设计共二周时间,日程安排如下: 第 1 天:查阅资料,确定题目。 第 2--4 天:进实验室做实验,连接硬件并编写程序作相关的模块实验。 第 5--7 天:编写程序,并调试通过。观察及总结硬件实验现象和结果。 第 8--9 天:整理资料,撰写课程设计报告,准备答辩。 第 10 天:上交课程设计报告,答辩。 设计报告要求:
1. 设计报告里有两个内容,自选题目内容+附录(实验内容),每 位同学独立完成。 2. 自选题目不须上机实现,要求能正确完成硬件电路和软件程序 设计。内容包括: 1) 设计题目、任务与要求 2)硬件框图与电路图 3) 软件及流程图 (a)主要模块流程图 (b)源程序清单与注释 4) 总结 5) 参考资料 6)附录 实验上机调试内容
注:此任务书由指导教师在课程设计前填写,发给学生做为本门课程设计 的依据。

51单片机经典教程

单片机经典教程 目录
第一课 第二课 第三课 第四课 第五课 第六课 第七课 第八课 第九课 第十课 第十一课 第十二课 第十三课 第十四课 第十五课 第十六课 第十七课 第十八课 第十九课 第二十课 第二十一课 第二十二课 第二十三课 第二十四课 单片机的概述 单片机的硬件结构与开发过程 单片机的内部结构 一 半导体存储器 单片机的内部结构 二 工作寄存器 单片机的内部结构 三 时序与时钟 单片机的内部结构 四 并行口 单片机的内部结构 五 数据与地址 单片机的内部结构 六 特殊功能存储器 单片机的工作方式 单片机的寻址 单片机的指令 一 数据传递类指令 单片机的指令 二 数据传递类指令 单片机的指令 三 算术逻辑运算类指令 单片机的指令 四 控制转移类指令 单片机的指令 五 位及位操作指令 单片机的程序设计方法 单片机的定时 计数器 单片机的中断系统 单片机的定时/中断实验 一 单片机的定时/中断实验 二 键盘接口及编程方法 一 独立式按键 键盘接口及编程方法 二 矩阵式按键 单片机显示器接口及编程方法 数码管的静态扫描与编程方法 6 9 11 15 18 20 24 27 29 32 35 38 42 47 51 55 64 68 73 78 81 87 90 94
4

第一课 单片机的概述
因为我们的主要课程是单片机的应用 本来不想讲解单片机的历史与发展 这话说现状更确切 些 但为了兼顾大多数朋友 我还是简单的介绍一下这方面的相关知识 一 单片机的由来 单片机 专业名称—Micro Controller Unit(微控制器件) 它是由大名鼎鼎的 INTEL 公司发明的 最早的系列是 MCS-48 后来有了 MCS-51 我们经常说的 51 系列单片机就是 MCS-51 micro controller system 它是一种 8 位的单片机 8 位是什么意思 我们以后再讲 后来 INTEL 公司把它的核心技术转让给了世界上很多的小公司 不过 再小也有几个亿的销售/ 年哦 所以世界上就有许多公司生产 51 系列兼容单片机 比如飞利浦的 87LPC 系列 华邦的 W78 系列 达拉斯的 DS87 系列 现代的 GSM97 系列等等 目前在我国比较流行的就是美国 ATMEL 公司的 89C51 它是一种带 Flash ROM 的单片机 至于什么是 Flash ROM 我在这儿先不作介绍 等以后大家学到相 关的知识时自然就会明白 我们的讲座就是以该型号的单片机来作实验的 讲到这里 也许有的人会 问 我平时在各种书上看到全是讲解 8031 8051 等型号的单片机 它们又有什么不同呢 其实它们同 属于一个系列 只是 89C51 的单片机更新型一点(事实上,89C51 目前正在用 89S51 代替 我们的实验系 统采用就是 89S52 的 兼容 89C52) 这里随便说一下 目前国内的单片机教材都是以 8051 为蓝本的 尽管其内核也是 51 系列的 但毕竟 8051 的单片机已经属于淘汰产品 在市场上也很少见到了 所以由 此感叹 国内的高等教育是如此的跟不上时代的发展需要 这话可能会引起很多人的不满,所以大家别 说是我讲的哦 二 主要单片机的分类 接着上面的话题 再给大家介绍一下我们经常在各种刊物上看到的 AVR 系列和 PIC 系列单片机是 怎么回事 以便让大家对单片机的发展有一个较全面的认识 在没有学习单片机之前 这是一个令很多 初学者非常困惑的问题 这么多的单片机我该先学哪一种呢 AVR 系列单片机也是 ATMEL 公司生产的一种 8 位单片机 它采用的是一种叫 RISC 精简指令集单 片机 的结构 所以它的技术和 51 系列有所不同 开发设备也和 51 系列是不通用的 它的一条指令的 运行速度可以达到纳秒级 即每秒 1000000000 次 是 8 位单片机中的高端产品 由于它的出色性能 目前应用范围越来越广 大有取代 51 系列的趋势 所以学完了 51 系列的 看来必须学会 AVR 的才行 可叹知识爆炸 人生苦短 说完了 AVR 的 再来说说另一种--PIC 系列单片机 它是美国 MICROCHIP 公 司 唉 又是老美 叫微芯公司的生产的另一种 8 位单片机 它采用的也是 RISC 的指令集 它的指令 系统和开发工具与 51 系列更是不同 但由于它的低价格和出色性能 目前国内使用的人越来越多 国 内也有很多的公司在推广它 不过它的影响力远没有 51 系列的大 所以作为初学者 51 系列当然是首 选 以上几种只是比较多见的系列 其实世界上还有许多的公司生产各种各样的单片机 比如 MOTOROLA 的 MC68H 系列 老牌的单片机 TI 的 MSP430C 系列 极低功耗的单片机 德国的西门子 SIEMENS 等等 它们都有各自的结构体系 并不与 51 系列兼容 为了不搞大家的脑筋 这里就不介绍了 等大 家入了门以后自己去研究它吧 我们还是回来了解一下 51 系列单片机到底是个什么东西 它有那些部 分组成 请接着往下看 三 单片机的结构及组成 单片机到底是一种什么 DD 它究竟能做什么呢 其实它就是一种能进行数学和逻辑运算 根据不 同使用对象完成不同控制任务的面向控制而设计的集成电路 此话好象有点绕口 没关系 大家都应该 知道我们经常使用的电脑吧 在电脑上 我们可以用不同的软件在相同的硬件上实现不同的工作 比如 我们用 WORD 可以打字 用 PROTEL 可以设计图纸等等 单片机其实也是如此 同样的芯片可以根据我们 不同的要求做出截然不同的产品 只不过电脑是面向应用的 而单片机是面向控制的 比如控制一个指
6

c51单片机实例下载大全

单片机资料教程下载,省去找资料的麻烦,只供学习参考用,下载24内删掉,祝大家学习进步 单片机点阵学习资料 https://www.sodocs.net/doc/0016851421.html,/thread-1703-1-1.html 手把手教你学单片机--教程视频 https://www.sodocs.net/doc/0016851421.html,/thread-1688-1-1.html 力天把手教你学单片机视频教程 https://www.sodocs.net/doc/0016851421.html,/thread-1689-1-1.html 谱中单片机开发板例程 https://www.sodocs.net/doc/0016851421.html,/thread-1683-1-2.html 初学单片机的30,硬件简单对初学者有帮助 https://www.sodocs.net/doc/0016851421.html,/thread-1962-1-1.html 用单片机制作的MP3 https://www.sodocs.net/doc/0016851421.html,/thread-1701-1-2.html 51单片机应用开发大全所含100个范例代码及电路图 https://www.sodocs.net/doc/0016851421.html,/thread-1820-1-1.html 【含28个单片机实例流程图】 https://www.sodocs.net/doc/0016851421.html,/thread-1959-1-2.html 谱中单片机程序烧录工具STC https://www.sodocs.net/doc/0016851421.html,/thread-1682-1-2.html 《单片机技术》32讲

https://www.sodocs.net/doc/0016851421.html,/thread-1693-1-1.html 51单片机c语言100例教程 https://www.sodocs.net/doc/0016851421.html,/thread-1700-1-1.html 单片机超级精华包 https://www.sodocs.net/doc/0016851421.html,/thread-1687-1-1.html 新手学的多功能电子钟 https://www.sodocs.net/doc/0016851421.html,/thread-1679-1-1.html 十天学会单片机和c语言视频教程 https://www.sodocs.net/doc/0016851421.html,/thread-1692-1-1.html C语言函数库速查手册 https://www.sodocs.net/doc/0016851421.html,/thread-1696-1-1.html 历史上最全的KEIL中文学习资料 https://www.sodocs.net/doc/0016851421.html,/thread-1729-1-2.html 单片机c语言程序设计实训100例--基于AVR+PROTUES https://www.sodocs.net/doc/0016851421.html,/thread-1695-1-2.html (有电路图和程序) https://www.sodocs.net/doc/0016851421.html,/thread-1965-1-1.html 关于单片机抗干扰的资料 https://www.sodocs.net/doc/0016851421.html,/thread-1961-1-1.html 单片机矩阵扫描键盘程序 https://www.sodocs.net/doc/0016851421.html,/thread-1723-1-1.html 共享通过串口在线调试51单片机的专业版培训资料

51单片机控制LED灯程序设计

51单片机:LED灯亮灯灭程序设计 1.功能说明:控制单片机P1端口输出,使P1.0位所接的LED点亮,其他7只灯熄灭。 程序: 01: MOV A , #11111110B ; 存入欲显示灯的位置数据 02: MOV P1,A ; 点亮第一只灯 03: JMP $ ; 保持当前的输出状态 04: END ; 程序结束 2.功能说明:单片机P1端口接8只LED,点亮第1、3、4、6、7、8只灯。 程序:

01:START: MOV A , #00010010B ; 存入欲显示灯的位置数据 02:MOV P1,A ; 点亮灯 03:JMP START ; 重新设定显示值 04:END ; 程序结束 3.功能说明:单片机P1端口接8只LED,每次点亮一只,向左移动点亮,重复循环。 程序: 01:START: MOV R0, #8 ;设左移8次 02:MOV A, #11111110B ;存入开始点亮灯位置

03:LOOP: MOV P1, A ;传送到P1并输出 04:RL A ;左移一位 05:DJNZ R0, LOOP ;判断移动次数 06:JMP START ;重新设定显示值 07:END ;程序结束 4.功能说明:单片机P1端口接8只LED,每次点亮一只,向右移动点亮,重复循环。 程序: 01:START: MOV R0, #8 ;设右移8次

02:MOV A, #01111111B ;存入开始点亮灯位置03: LOOP: MOV P1, A ;传送到P1并输出 04: ACALL DELAY ;调延时子程序05: RR A ;右移一位 06: DJNZ R0, LOOP ;判断移动次数07: JMP START ;重新设定显示值08: DELAY: MOV R5,#50 ; 09:DLY1: MOV R6,#100 ; 10: DLY2: MOV R7,#100 ;

51单片机教程

原作:平凡的单片机

1、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。 天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。为什么会这样呢?功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。既然如此,单片机的功能肯定不强,干吗要学它呢?话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。所以8051出来十多年,依然没有被淘汰,还在不断的发展中。 2、MCS51单片机和8051、8031、89C51等的关系我们平常老是讲8051,又有什么8031,现在又有89C51,它们之间究竟是什么关系? MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。INTEL 公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL 公司开发生产的。以后我们将用89C51来完成一系列的实验。 一、单片机的外部结构 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。3、复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA引脚:EA引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个引脚相连,否则单片机就没法控制它了,那么和哪个引脚相连呢?单片机上除了刚才用掉的5个引脚,还有35个,我们将这个LED和1脚相连。(见图1,其中R1是限流电阻) 按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。因此要1脚我们要能够控制,也就是说,我们要能够让1引脚按要求变为高或低电平。即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?叫它什么名字呢?设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不可以由我们来更改。

基于51单片机FAT32文件系统程序

基于51单片机FAT32文件系统程序 #ifndef __ZNFAT_H__ #define __ZNFAT_H__ #include "mytype.h" //类型重定义 /*******************************************************/ //znFAT的裁减宏--------------------------------------------------------- //#define ZNFAT_ENTER_DIR //有此宏,函数 znFAT_Enter_Dir() 参与编译 #define ZNFAT_OPEN_FILE //有此宏,函数 znFAT_Open_File() 参与编译 //#define ZNFAT_SEEK_FILE //有此宏,函数 znFAT_Seek_File() 参与编译 //#define ZNFAT_READ_FILE //有此宏,函数 znFAT_Read_File() 参与编译 //#define ZNFAT_READ_FILEX //有此宏,函数 znFAT_Read_FileX() 参与编译 //#define ZNFAT_ADD_DAT //有此宏,函数 znFAT_Add_Dat() 参与编译 //#define ZNFAT_CREATE_DIR //有此宏,函数 znFAT_Create_Dir() 参与编译 //#define ZNFAT_CREATE_FILE //有此宏,函数 znFAT_Create_File() 参与编译 //#define ZNFAT_DEL_FILE //有此宏,函数 znFAT_Del_File() 参与编译 //#define ZNFAT_XCOPY_FILE //有此宏,函数 znFAT_XCopy_File() 参与编译 //#define ZNFAT_RENAME_FILE //有此宏,函数 znFAT_Rename_File() 参与编译 //#define ZNFAT_GET_TOTAL_SIZE //有此宏,函数 znFAT_Get_Total_Size() 参与编译 //#define znFAT_GET_REMAIN_CAP //有此宏,函数 znFAT_Get_Remain_Cap() 参与编译 #include "cj.h" #include "cj.h" //---------------------------------------------------------------------- #define SOC(c) (((c-pArg->FirstDirClust)*(pArg->SectorsPerClust))+pArg->FirstDirSector) // 用于计算簇的开始扇区#define CONST const //设备表 #define SDCARD 0 //SD卡 #define UDISK 1 //U盘 #define CFCARD 2 //CF卡 #define OTHER 3 //其它 //这里的存储设备表,可以灵活扩充,以实现对更多存储设备的支持 //------------------------------------------- #define MAKE_FILE_TIME(h,m,s) ((((unsigned int)h)<<11)+(((unsigned int)m)<<5)+(((unsigned int)s)>>1)) /* 生成指定时分秒的文件时间数据 */ #define MAKE_FILE_DATE(y,m,d) (((((unsigned int)y)+20)<<9)+(((unsigned int)m)<<5)+((unsigned int)d)) /* 生成指定年月日的文件日期数据 */ //DPT:分区记录结构如下 struct PartRecord { UINT8 Active; //0x80表示此分区有效 UINT8 StartHead; //分区的开始磁头 UINT8 StartCylSect[2];//开始柱面与扇区 UINT8 PartType; //分区类型 UINT8 EndHead; //分区的结束头 UINT8 EndCylSect[2]; //结束柱面与扇区 UINT8 StartLBA[4]; //分区的第一个扇区 UINT8 Size[4]; //分区的大小

(完整版)51单片机汇编指令(全)

指令中常用符号说明 Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7) Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1) Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址 #data表示8位常数(立即数) #data16表示16位常数 Add16表示16位地址 Addr11表示11位地址 Rel8位代符号的地址偏移量 Bit表示位地址 @间接寻址寄存器或基址寄存器的前缀 ( )表示括号中单元的内容 (( ))表示间接寻址的内容 指令系统 数据传送指令(8个助记符) 助记符中英文注释 MOV Move 移动 MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器A MOV A , Direct;(direct)→A,直接地址的内容送A MOV A ,@ Ri;(Ri)→A,RI间址的内容送A MOV A , #data;data→A,立即数送A MOV Rn , A;A→Rn,累加器A的内容送寄存器Rn MOV Rn ,direct;(direct)→Rn,直接地址中的内容送Rn MOV Rn , #data;data→Rn,立即数送Rn MOV direct , A;A→(direct),累加器A中的内容送直接地址中 MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址 MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址 MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址 MOV direct , #data;8位立即数送到直接地址中 MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中 MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中 MOV @Ri , #data; data→@Ri ,8位立即数送到间址中 MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令) (MOV类指令共16条)

51单片机C语言入门实例2

13.动态数码显示技术 1.实验任务 如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。 2.电路原理图 图4.13.1 3.系统板上硬件连线 (1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上;

(2.把“单片机系统”区域中的P2.0/A8-P2.7/A15用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3.把“单片机系统”区域中的P1.7端口用导线连接到“独立式键盘”区域中的SP1端口上; 4.程序设计内容 (1.动态扫描方法 动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。 (2.在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。 (3.对于显示的字形码数据我们采用查表方法来完成。 5.程序框图 图4.13.2

6.汇编源程序 ORG 00H START: JB P1.7,DIR1 MOV DPTR,#TABLE1 SJMP DIR DIR1: MOV DPTR,#TABLE2 DIR: MOV R0,#00H MOV R1,#01H NEXT: MOV A,R0 MOVC A,@A+DPTR MOV P0,A MOV A,R1 MOV P2,A LCALL DAY INC R0 RL A MOV R1,A CJNE R1,#0DFH,NEXT SJMP START DAY: MOV R6,#4 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE1: DB 06H,5BH,4FH,66H,6DH TABLE2: DB 78H,79H,38H,38H,3FH END 7. C语言源程序 #include unsigned char code table1[]={0x06,0x5b,0x4f,0x66,0x6d}; unsigned char code table2[]={0x78,0x79,0x38,0x38,0x3f}; unsigned char i; unsigned char a,b; unsigned char temp; void main(void) { while(1) { temp=0xfe; for(i=0;i<5;i++) { if(P1_7==1)

51单片机及C语言入门教程

51单片机 及C语言入门教程 注:排成16开版式,是为了方便自已打印阅读。请不要用于非法用途。 2007.12.20

51单片机及C语言入门教程 第一课 建立您的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。(安装的方法和普通软件相当这里就不做介绍了) 安装好后,你是不是迫不及待的想建立自己的第一个C程序项目呢?下面就让我们一起来建立一个小程序项目吧。或许你手中还没有一块实验板,甚至没有一块单片机,不过没有关系我们可以通过KEIL软件仿真看到程序运行的结果。 首先当然是运行KEIL51软件。怎么打开?噢,天!那你要从头学电脑了。呵呵,开个玩笑,这个问题我想读者们也不会提的了:P。运行几秒后,出现如图1-1的屏幕。 图1-1启动时的屏幕

接着按下面的步骤建立您的第一个项目: (1)点击Project菜单,选择弹出的下拉式菜单中的New Project,如图1-2。接着弹出一个标准Windows文件对话窗口,如图1-3,这个东东想必大家是见了N次的了,用法技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。在"文件名"中输入您的第一个C程序项目名称,这里我们用"test",这是笔者惯用的名称,大家不必照搬就是了,只要符合Windows文件规则的文件名都行。"保存"后的文件扩展名为uv2,这是KEIL uVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。 图1-2New Project菜单 图1-3文件窗口 (2)选择所要的单片机,这里我们选择常用的Ateml公司的AT89C51。此时屏幕如图1-4

单片机C语言模块化编程初步资料全

下面让我们揭开模块化神秘面纱,一窥其真面目。 C语言源文件*.c 提到C语言源文件,大家都不会陌生。因为我们平常写的程序代码几乎都在这个XX.C文件里面。编译器也是以此文件来进行编译并生成相应的目标文件。作为模块化编程的组成基础,我们所要实现的所有功能的源代码均在这个文件里。理想的模块化应该可以看成是一个黑盒子。即我们只关心模块提供的功能,而不管模块内部的实现细节。好比我们买了一部手机,我们只需要会用手机提供的功能即可,不需要知晓它是如何把短信发出去的,如何响应我们按键的输入,这些过程对我们用户而言,就是是一个黑盒子。 在大规模程序开发中,一个程序由很多个模块组成,很可能,这些模块的编写任务被分配到不同的人。而你在编写这个模块的时候很可能就需要利用到别人写好的模块的借口,这个时候我们关心的是,它的模块实现了什么样的接口,我该如何去调用,至于模块内部是如何组织的,对于我而言,无需过多关注。而追求接口的单一性,把不需要的细节尽可能对外部屏蔽起来,正是我们所需要注意的地方。 C语言头文件*.h 谈及到模块化编程,必然会涉及到多文件编译,也就是工程编译。在这样的一个系统中,往往会有多个C文件,而且每个C文件的作用不尽相同。在我们的C文件中,由于需要对外提供接口,因此必须有一些函数或者是变量提供给外部其它文件进行调用。 假设我们有一个LCD.C文件,其提供最基本的LCD的驱动函数 LcdPutChar(char cNewValue) ; //在当前位置输出一个字符 而在我们的另外一个文件中需要调用此函数,那么我们该如何做呢? 头文件的作用正是在此。可以称其为一份接口描述文件。其文件内部不应该包含任何实质性的函数代码。我们可以把这个头文件理解成为一份说明书,说明的内容就是我们的模块对外提供的接口函数或者是接口变量。同时该文件也包含了一些很重要的宏定义以及一些结构体的信息,离开了这些信息,很可能就无法正常使用接口函数或者是接口变量。但是总的原则是:不该让外界知道的信息就不应该出现在头文件里,而外界调用模块内接口函数或者是接口变量所必须的信息就一定要出现在头文件里,否则,外界就无法正确的调用我们提供的接口功能。因而为了让外部函数或者文件调用我们提供的接口功能,就必须包含我们提供的这个接口描述文件----即头文件。同时,我们自身模块也需要包含这份模块头文件(因为其包含了模块源文件中所需要的宏定义或者是结构体),好比我们平常所用的文件都是一式三份一样,模块本身也需要包含这个头文件。 下面我们来定义这个头文件,一般来说,头文件的名字应该与源文件的名字保持一致,这样我们便可以清晰的知道哪个头文件是哪个源文件的描述。

相关主题