文档库 最新最全的文档下载
当前位置:文档库 › 单片机主程序

单片机主程序

单片机主程序
单片机主程序

一、程序的预处理和外部变量、函数定义

#include “at89x52.h”

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define nop _nop_() /*定义空操作指令*/

#define maxvolt 300

#define minvolt 5

#define minfre 0

#define maxfre 4000

#define UM 300

#define IM 2

#define fc 12000

#define KP 0.2

#define KI 25

#define KD 0

#define COM8155 XBYTE[0x7FF8]

#define PA XBYTE[0x7FF9]

#define PB XBYTE[0x7FFA]

#define R0 XBYTE[0Xdf00]

#define R1 XBYTE[0Xdf01]

#define R2 XBYTE[0Xdf02]

#define R3 XBYTE[0Xdf03]

#define R4 XBYTE[0Xdf04]

#define R5 XBYTE[0Xdf05]

#define R14 XBYTE[0Xdf0E]

#define R15 XBYTE[0Xdf0F]

sbit SCL=P3^4; /*24C01 SCL接脚=89C52 T0 P3.4*/

sbit SDA=P3^5; /*24C01 SDA接脚=89C52 T1 P3.5*/

sbit RST=P1^0;

bit FLAG0=0,wuxiao=0,CHF=0,CHA=0,exit;

/*设定位标号FLAG0=1键盘扫描回应*/

Char ptr=0,ptr1=0; /*PTR键盘扫描指标,ptr1显示器扫描指标*/

Char a1=0,b1=100; /*宣告变数a1为TIMER0的中断次数,ptr为TIMER1扫描数码管指标*/

char ini[6]={0x40,0x5A,0x2c,0x02,0x00,0x00};//放置初始化数据

char con[6]={0xcd,0xcc,0x06,0x80,0x80,0x80};//放置控制数据

static const char tab[16]={0x01,0x02,0x03,0x0c, /*键盘码00,01,02,03,*/

0x04,0x05,0x06,0x0d, /*键盘码04,05,06,07,*/

0x07,0x08,0x09,0x0e, /*键盘码08,09,0a,0b,*/

0x0a,0x00,0x0b,0x0f}; /*键盘码0c,0d,0e,0f*/

static const char duanxuan[17]={0x3F,0x06,0x5b,0x4F,

0x66,0x6D,0x7D,0x07,

0x7F,0x6F,0x77,0x7C,

0x39,0x5E,0x79,0x71,0x00};

char lia=0,lu=0,dot,weishu=0;

char dispel[8]; //显示值存放阵列

char bufdata[9];

char bufuart[6]; //串口接收值存放列阵

float vdataset=220;

float vdata[3]={220,220,220};

void delay (uint value) //延时子程序

{

while(value!=0)value--;//10US延时

}

void tserial(void); //串口serial发送子程序

void rserial(void); //串口serial接收子程序

void chvolt(void); //改变输出电压幅值子程序

void chfre(void); //改变输出电压频率子程序

void xch(void); //宣告按键存放/显示器阵列disple[]右键滚入子程序

二、主程序清单

main() /*主程序*/

{ char I;

TMOD=0X21; /*TIMER0工作在方式MODE1,16位定时器*/

/*TIMER1工作在MODE2,自动重新装载模式*/

/*方式寄存器TMOD */

/*|定时器1 |定时器1 |*/

/*|GATE|C/T|M1|M0|GATE|C/T|M1|M0|*/

/*|||*/ TH0=(65536-3000)/256; /*设定每隔3000us中断扫描一次数码管*/

TL0=(65536-3000)%256;

TR0=1; /*启动TEMER0*/

TH1=(65536-9200)/256; /*设TIMER1计数值*/

TL1=(65536-9200)%256;

TR1=1; //启动TEMER1

//显示初始化

disple[7]=0x73; //最左的显示器显示P,表示处于停止态

for(i=2;i<=6;i++)disple[i]=0x00; //第3-7位显示器灭

disple[1]=0x3e;//初态第二位显示器显示U,表示电压

disple[0]=0x06;//初态第一位显示器显示1,表示第一相

P2_0=1;

P1=0XF0; //P1低4位为全0,高4位写入1

COM8155=3; /*8155初始化,设定PA、PB工作在基本输出方式*/

RST=0;

//进行4828初始化;

R0=imi[0];

R1=imi[1];

R2=imi[2];

R3=imi[3];

R4=imi[4];

R5=imi[5];

R14=0; //R0-R5装入初始化寄存器

//向8248写控制数据

R0=con[0];

R1=con[1];

R2=con[2];

R3=con[3];

R4=con[4];

R5=con[5];

R15=0; //RO-R5装入控制寄存器

IP=0x0b; /*中断优先级寄存器IP */

/*|︱|PT2|PS|PT1|PX1|PT0|PX0|*/

IE=0X9f; /*︱7 6 5 4︱3 2 1 0︱*/

/*|EA||ET2|ES|ET1|EX1|ET0|EX0|*/

While(1); //等中断

三、故障中断处理程序

Void service_int0() interrupt 0 using 0 /*外部中断0,为故障中断*/ { int i;

RST=0;

for(i=0;i<=7;i++)disple[i]=0x31; //显示故障信息

四、键盘中断处理程序

Void external_int1()interrupt2 using 2

//键盘中断,进行按键命令处理

char a1=0xf7,i,m,xiantai; /*a1=0XF7行扫描初值,I行*/

bit flag1=0;

IE&=OXFB;

Delay(1000); //延时10ms

FLAG0=0; /*设按键回应旗号为0,键盘扫描计数指标为0*/

ptr=0;

if(P3_2==0) /*按键仍闭合则进行键处理*/

For(i=0;i<4;i++) /*键盘4个扫描列*/

P1=a1; /*行扫描输出,读入P1存入M,以便侦测列与侦测按键是

否按下*/

m=P1;

switch(m&0xf0) /*取P1的高4位元。侦测那一列被按*/

case 0x70:ptr=i*4; /*第一列被按否?是则扫描指标=列X4*/

FLAG0=1; /*是则设FLAG0=1表有按键输入*/

break; /*跳出此循环*/

case 0xb0:ptr=i*4+1; /*第二列被按否?是则扫描指标=列

X4+1*/

FLAG0=1; /*是则设FLAG0=1表有按键输入*/

break; /*跳出此循环*/

case 0xd0:ptr=i*4+2; /*第三列被按否?是则扫描指标=列

X4+2*/

FLAG0=1; /*是则设FLAG0=1表有按键输入*/

break; /*跳出此循环*/

case 0xe0:ptr=i*4+3; /*第四列被按否?是则扫描指标=列

X4+3*/

FLAG0=1; /*是则设FLAG0=1表有按键输入*/

Default: break; /*跳出此循环*/

if(FLAG0==1)break; /*不为1,则扫描行右移,扫描下一行*/

a1=a1>>1|0x80; /*高位补1*/

if(FLAG0==0)return;

switch(tab[ptr])/*是键盘扫描计数器指标至TAB[]取到的键盘码*/ {

case 0x0a: /*是否是第一次按“START”,是则启动SA4828的SPWM

输出,最左的显示器显示D,表示SA4828在运行*/

if(flag1==0){RST=1;flag1=1;dispel[7]=duanxuan[0x0D];}

break; /*跳出此循环*/

case 0x0b: /*是否按“STOP”是则停止SA4828的SPWM输出*/

RST=0;

flag1=0;

dispel[7]=0x73;//最左的显示器显示P,表示处于停止态

break; /*跳出此循环*/

case 0x0e: /*是否按“调压”,是则进行相应处理*/

if(CHF==0) /*调压与调频互锁,当调频时,按调压键无效*/

If(CHA==0)

{ CHA=1;

for(i=2;i<=6;i++)dispel[i]=0x00;

/*进入调压状态2位-6位显示器起初为全灭*/

xiantai=disple[7];

disple[1]=0x3e;

dispel[0]=0x00;

}

else

{ if(weishu!=0)chvolt();//进行改变电压控制数据

的处理;

If(wuxiao==1)

{for(i=2;i<=6;i++)dispel[i]=0;//调用显示“00000”

for(i=0;i<10;i++)delay(10000);/*延时1秒*/

while(m==p1);delay(1000);

}

weishu=0;dot=0;

disple[7]=xiantai;

if(lia==0)disple[1]=0x3e;

else disple[1]=duanxuan[0x0A];

disple[0]=duanxuan[lu+1];

CHA=0;

If(wuxiao==1){wuxiao=0;return;}

}

Break; /*跳出此循环*/

case 0x0f: /*是否按“调频”,是则进行相应处理*/

if(CHA==0) /*调压与调频互锁,当调压时,按调频键无效*/ { if(CHF==0)

{CHF=1;

for(i=2;i<=6;i++)disple[i]=0x00;

/*进入调频状态2位-6位显示器起初为全灭*/

xiantai=disple[7];

disple[7]=duanxuan[0x0A];

disple[1]=duanxuan[0x0F];

disple[0]=0x00;

}

else

{

if(weishu!=0)chfre(); //进行改变频率控制数据的处理;

if(wuxiao==1)

for(i=2;i<=6;i++)disple[i]=0;//调用显示“00000”;

for(i=0;i<10;i++)delay(10000);/*延时1秒*/

while(m==P1);delay(1000);

weishu=0;dot=0;

disple[7]=xiantai;

if(lia==0)disple[1]=0x3e;

else disple[1]=duanxuan[0x0A];

disple[0]=duanxuan[lu+1];

CHF=0;

If(wuxiao==1){wuxiao=0;return;}

}

break; /*跳出此循环*/

case 0x0c: /*是否按“显示切换及·键”,是则进行相应处理*/

if(CHA==1||CHF==1)

/*当进入数字输入处理时,该键为·键,进行处理*/

{ if(dot==0)dot=1;}

else //为显示切换键

lia++;

if(lia>1)lia=0;

if(lia==0)disple[1]=0x3e;

else disple[1]=duanxuan[0x0A];

break; /*跳出此循环*/

case 0x0d: /*是否按“三相切换及退出键”,是则进行相应处理*/ if(CHA==1‖CHF==1)//当进入数字输入处理时,该键为退出键{

exit=1;

for(i=2;i<=6;i++)disple[i]=0;

disple[7]=xiantai;

if(lia==0)disple[1]=0x3e;

else disple[1]=duanxuan[0x0A];

disple[0]=duanxuan[lu+1];

while(m==P1);

delay(1000); //按钮抗机械反弹跳

delay(10000); //延时100ms显示

if(CHA==1){CHA=0;}

if(CHF==1){CHF=0;}

exit=0;

return;

else //为三相切换键

{

lu++;

if(lu>3)lu=0;

disple[0]=duanxuan[lu+1];

}

break; //跳出此循环

default: //以上均不是则为数字键,当进入调压、调频/调速状态才有效 if(CHA==1‖CHF==1)xch(); //数字键输入处理

break; //跳出此循环

while(m==P1); //等键释放

delay(1000); //按钮抗机械反弹跳

P1=0Xf0; //回复P1低4位为全0,高4位写入1 }

五、数字显示向左移动子程序

Void xch(void) /*数字显示向左移动子程序*/

{ char c;

if(dot!=2)

if(weishu<5)

{ weishu ++;

for(c=6;c>3;c--)

disple[c]=disple[c-1]; /*将显示器disple[]移位交

换,disple[3]->disple[4]->disple[5]…*/ }

disple[2]=duanxuan[tab[ptr]]; /*新的按键值存入disple[2]*/

if(dot==1)dot=2;

} /*返回主程序*/

六、改变输出电压幅值子程序

Void chvolt(void)

{ char I,j,VA,APE;

int k;

vdataset=0;

for(i=0;i

{ k=1;

for(j=1;j<=I;j++)

k*=10;

vdataset+=disple[i+2]*k;

}

if(dot==2)vdataset+=disple[2]/10; /*当有输入小数点且小数点后有

输入数字,则加上只有一位的小数部分*/ if(vdataset<=maxvolt&&vdataset>minvolt)//进行输入电压数据是否有

效判别

for(i=0;i<=2;i++)vdata[i]=vdataset;

APE=vdataset/maxvolt;

VA=APE*255+0.5; //进行向SA4828写调压数据;

con[3]=VA;

R3=con[3]; //只改变输出电压幅值,其他寄存器不用变;

R4=con[3];

R5=con[3];

R15=0;

else wuxiao=1;

}

七、改变输出电压频率子程序

Void chfre(void)

{ char i,j,fdatain=0,m,k;

Uint npfs;

float fdata=0,fr;

for(i=0;i

{ k=1;

for(j=1;j<=i;j++)

k*=10;

fdatain+=disple[i+2]*k;

}

if(dot==2)fdata=fdatain+disple[2]/10;

/*当有输入小数点且小数点后有输入数字,则加上只有一位的小数部分*/ if(fdata<=maxfre&&fdata>=minfre)//进行输入频率数据是否有效判别

{

if(fdata<=50)fr=62.5;

if(fdata<=100)fr=125;

else if(fdata<=1000)fr=1000;

else if(fdata<=4000)fr=4000;

i=fr*384/fc;

j=0;k=1;

for(m=0;m<=6;m++)

{ if(i==k)j=1;

if(j==1)break;

k=k<<1;

}

if(j==0){wuxiao=1;return;}

//重写初始化数据

for(j=1;j<=5;j++)m=m<<1;

ini[0]&=0x0f;

ini[0]︱=m;

RST=0;

R0=ini[0];

R1=ini[1];

R2=ini[2];

R3=ini[3];

R4=ini[4];

R5=ini[5];

R14=0;

//重写控制数据

npfs=fdata*65536/fr;

con[0]=npfs%256;

con[1]=npfs/256;

R0=con[0];

R1=con[1];

R2=con[2];

R3=con[3];

R4=con[4];

R5=con[5];

R15=0;

RST=1;

}

else wuxiao=1;

}

八、数码管扫描定时中断程序

Void service_timer0() interrupt 1 using 1

{ static char ch=0X01;

TH0=(65536-3000)/256; /*每隔3000US扫描一次*/

TL0=(65536-3000)%256;

//写8155PA、PB口

PA=ch;

PB=disple[ptrl];

if(CHA==1‖CHF==1)

{

if(wuxiao==0&&exit==0)

{ if(dot==1){if(ptr1==2)PB︱=0x01;}

else if(dot==2){if(ptr1==3)PB︱=0x01;}

}

}

else

{

if(lia==0){if(ptr1==3)PB︱=0x01;} //显示电压数据的小数点

else if(ptr1==4)PB︱=0x01; //显示电流数据的小数点

}

ch=ch<<1;

if(ch==0)ch=1;

ptr1++;

if(ptr1>7)ptr1=0;

}

九、定时采集、计算、控制中断程序清单

#define address 0Xbff8

Char b2=5;

Float vcdata[3][3],verror[3][3],vadjust[3];

Void service_timer1() interrupt 3 using 3

/*TIMER1 中断程序-50ms计时器,进行定时数据采集、计算、控制及显示*/ {

int dispdataint;

char i,j,k,n,t,wei=0;

float APE,dispdata,xiaodata;

char VA;

TH1=(65536-9200)/256; /*重设TIMER1计数值*/

TL1=(65536-9200)%256;

b2--; /*中断次数减1*/

if(b2==0) /*中断次数完成否,是则表50ms到了*/

b2=5; /*重设中断次数*/

for(i=0,k=0;i<=1;i++) //i=0,测量电压;i=1,测量电流

for(j=0;j<=2;j++)//j表示测量那一路,是0路、1路还是2路{

vcdata[i][j]=0;

for(n=1;n<=3;n++)//对一个量进行连续三次采样,取平均值,

起滤波作用

XBYTE[address+k]=k;

delay(10);

while(P3_4==0);

vcdata[i][j]+=XBYTE[0Xbfff];

k++;

if(i==0) vcdata[i][j]=vcdata[i][j]*UM/(255*3);

else vcdata[i][j]=vcdata[i][j]*IM/(255*3);

if(i==0)//电压须计算偏移量、调整量,然后向SA4828写控制数据{

verror[j][0]=verror[j][1];

verror[j][1]=verror[j][2];

verror[j][2]=vcdata[i][j]-vdataset;

vadjust[j]=KP*(verror[j][2]-verror[j][1]+KI*0.05*verror

[j][2]/KP+KD*(verror[j][2]-2*verror[j][1]+verror[j][0])

/(KP*0.05));

vdata[j]=vdata[j]+vadjust[j];

//进行向SA4828写调压数据

APE=vdata[j]/maxvolt;

if(APE>1)APE=1;

VA=APE*255+0.5;

if(j==0)R3=VA; //只改变输出电压幅值,其它寄存器不用变; else if(j==1)R4=VA;

else R5=VA;

R15=0;

/*当满足条件时,将要显示的电量写入显示缓冲区*/

dispdata=vcdata[lia][lu];

dispdataint=(int)dispdata;

if(CHA==0&&CHF==0)

{

if(lia==0)/*为显示电压数据*/

j=dispdataint/1000;

if(j!=0){disple[6]=duanxuan[j];wei=4;}

else disple[6]=0;

dispdataint=dispdatint-j*1000;

K=dispdataint/100;

if(wei==0)

{

if(k!=0){disple[5+lia]=duanxuan[k];wei=3;}

else disple[5+lia]=0;

}

Else disple[5+lia]=duanxuan[k];

dispdataint=dispdatain-k*100;

n=dispdataint/10;

if(wei==0)

{

if(n!=0){disple[4+lia]=duanxuan[n];wei=2;}

else disple[4+lia]=0;

}

else disple[4+lia]=duanxuan[n];

dispdataint=dispdataint-n*10;

t=dispdataint;

disple[3+lia]=duanxuan[t];

if(t!=0)wei=1;

xiaodata=dispdata-(int)dispdata;

dispdataint=(int)(xiaodata*10);

disple[2+lia]=duanxuan[dispdataint];

if(lia==1)

{

dispdataint=(int)(xiaodata*100-dispdataint*10);

disple[2]=duanxuan[dispdataint];

}

}

快速入门单片机汇编语言

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(p0.0—p0.7):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(p1.0—p1.7):其每一位都能作为可编程的输入或输出线。 P2口(p2.0—p2.7):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(p3.0—p3.7):其为双功能口,作为第一功能使用时,其功能与P1口相同。当

作为第二功能使用时,每一位功能如下表所示。 P3口第二功能 Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。

PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。 addr16:16位目的地址。 direct:直接寻址的地址。

单片机制作

自己动手做单片机实验板 孔子说:“工欲善其事,必先利其器”,学习单片机所用的工具、元器件和数模电路是有一些区别的,我们在学习之前最好先备齐它们,至少让外人看出我们是搞过单片机的。有几样东东很重要,在上场之前不得不提及。 刀枪剑戟 一台电脑:这在日后写程序或是下载程序都是必需之物。现在的新款电脑越来越不适合单片机学习了或者说单片机的设备也应该更新换代了,一般常用的 9针串口和 25针并口多数被方方正正的 USB接口所取代。更新推出的操作系统对开发软件支持并不很好,建议大家使用 WIN XP或 WIN 2000系统。不用考虑 CPU速度和存储空间,同时电脑要有 9针的串口和 25针的并口(打印机接口),如果没有可以用 USB转换器扩展,不过其效果不如原配夫妻。 ISP下载线:从电脑向手机下载图片或音乐一般都有一条连接线,再配上手机专用的软件就可以让手机丰富多彩了。单片机也可以用这样的方法,虽然这不是唯一的方法,但这较适合一般的单片机学习,好而不贵。ISP下载线就是一个设计有简单电路的单片机程序下载工具,它就像塑造生命的天使,配上小巧的 ISP下载软件就可以施与单片机灵魂。虽然我们不是上帝,但在后文我们先要亲手塑造它,先做好心理准备。 实验板:这是一年半载也玩不腻的家伙,因为这是在学习中不断扩展的。它是将一块单片机焊在一片电路板中间,板上还焊有电源和单片机的最小系统电路,见图 1。如果继续往下说许多读者朋友会骂我太粗心了,所以我不得不解释一下“最小系统”是啥东东。随便抓一个数模电路的芯片,它要是想正常工作必须有一个先天条件,就是符合要求的电源。单片机也是一样,不过它太讲究了,要的东西更多。除了一个稳定的电源供电之外,它还需要一个复位电路,就是给单片机一个信号让它归回到开始工作的状态。同时晶振部分电路也是必不可少的,这相当于给单片机带了一块手表,让它有时间观念,知道自己什么时候该干什么事情。总之最小系统就是保证单片机正常工作的最基本电路部分。OK,再说回到单片机实验板。我是买元器件自己制作实验板的,我感觉没有必要多花钱去买一个成品,虽然这样说卖实验板的人可能会扁我。自己动手可以学到单片机硬件电路的知识和掌握制作的细节,这是不可多得的实践机会。你决定实验板 DIY了吗?我们一起做吧!

8051单片机的内部结构

8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。 8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明: 中央处理器(CPU)是整个单片机的核心 部件,是8位数据宽度的处理器,能处理 8位二进制数据或代码,CPU负责控制、 指挥和调度整个单元系统协调的工作,完 成运算和控制输入输出功能等操作。 ·数据存储器(RAM): 8051内部有128个8位用户数据存储 单元和128个专用寄存器单元,它们是统 一编址的,专用寄存器只能用于存放控制 指令数据,用户只能访问,而不能用于存 放用户数据,所以,用户能使用的的RAM 只有128个,可存放读写的数据,运算的 中间结果或用户定义的字型表。 ·程序存储器(ROM): 8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 ·定时/计数器(ROM): 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。 ·并行输入输出(I/O)口: 8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。 ·全双工串行口: 8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以 用作异步通信收发器,也可以当同步移位器使用。 ·中断系统: 8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可 满足不同的控制要求,并具有2级的优先级别选择。 ·时钟电路: 8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051 单片机需外置振荡电容。

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

单片机35个实例1(汇编)

1.闪烁灯 1.实验任务 如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 2.电路原理图 图4.1.1 3.系统板上硬件连线 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容 (1).延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此, 我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太 大,所以我们在执行某一指令时,插入延时程序,来达到我们 的要求,但这样的延时程序是如何设计呢?下面具体介绍其原 理: 如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒 机器周期微秒 MOV R6,#20 2个 2 D1: MOV R7,#248 2个 2 2+2×248 =498 20× DJNZ R7,$ 2个2×248 (498 DJNZ R6,D1 2个2×20=40 10002

因此,上面的延时程序时间为10.002ms。 由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7 =248时,延时10ms,以此为基本的计时单位。如本实验要求 0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如 下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2).输出控制 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据 发光二极管的单向导电性可知,这时发光二极管L1熄灭;当 P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我 们可以使用SETB P1.0指令使P1.0端口输出高电平,使用 CLR P1.0指令使P1.0端口输出低电平。 5.程序框图

单片机十八般兵制作

单片机入门制作专辑--2.十八般兵器 [ 来源:本站原创 | 作者: | 时间:2008年02月11日 | 浏览: 1417 十八般兵器 快使用单片机,哼哼哈兮! 孔子说:“工欲善其事,必先利其器”,学习单片机所用的工具、元器件和数模电路是有一些区别的,我们在学习之前最好先备齐它们,至少让外人看出我们是搞过单片机的。有几样东东很重要,在上场之前不得不提及。 刀枪剑戟 一台电脑:这在日后写程序或是下载程序都是必需之物。现在的新款电脑越来越不适合单片机学习了或者说单片机的设备也应该更新 换代了,一般常用的 9针串口和 25针并口多数被方方正正的 USB接口所取代。更新推出的操作系统对开发软件支持并不很好,建议大家使用 WIN XP或 WIN 2000系统。不用考虑CPU速度和存储空间,同时电脑要有 9针的串口和 25针的并口(打印机接口),如果没有可以用 USB转换器扩展,不过其效果不如原配夫妻。 ISP下载线:从电脑向手机下载图片或音乐一般都有一条连接线,再配上手机专用的软件就可以让手机丰富多彩了。单片机也可以用这样的方法,虽然这不是唯一的方法,但这较适合一般的单片机学习,好而不贵。ISP下载线就是一个设计有简单电路的单片机程序下

载工具,它就像塑造生命的天使,配上小巧的 ISP下载软件就可以施与单片机灵魂。虽然我们不是上帝,但在后文我们先要亲手塑造它,先做好心理准备。 实验板:这是一年半载也玩不腻的家伙,因为这是在学习中不断扩展的。它是将一块单片机焊在一片电路板中间,板上还焊有电源和单片机的最小系统电路,见图 1。如果继续往下说许多读者朋友会骂我太粗心了,所以我不得不解释一下“最小系统”是啥东东。随便抓一个数模电路的芯片,它要是想正常工作必须有一个先天条件,就是符合要求的电源。单片机也是一样,不过它太讲究了,要的东西更多。除了一个稳定的电源供电之外,它还需要一个复位电路,就是给单片机一个信号让它归回到开始工作的状态。同时晶振部分电路也是必不可少的,这相当于给单片机带了一块手表,让它有时间观念,知道自己什么时候该干什么事情。总之最小系统就是保证单片机正常工作的最基本电路部分。OK,再说回到单片机实验板。我是买元器件自己制作实验板的,我感觉没有必要多花钱去买一个成品,虽然这样说卖实验板的人可能会扁我。自己动手可以学到单片机硬件电路的知识和掌握制作的细节,这是不可多得的实践机会。你决定实验板 DIY了吗?我们一起做吧! 图 1 忘了是哪一部抗日题材的电影里有一句经典台词:“别看你今天闹的欢,小心将来拉清单”。当时我还真不知道这话的意思,但我写到这里的时候我终于明白了,闹了这么长时间单片机,今天终于到我拉清单了。附表所示这个清单列出了学习单片机所需要的兵器,这是在成家立业之前必要的条件,里面我列出了大概的市场价格以防被黑。各元器件的外形如图 2所示。其实满打满算学习单片机也要不了几个钱,一般的元器件也就几块钱。几块钱能买什么?买不了房子买不了田,买几个元器件能用好几年。必要的时候可以和卖元器件的老板砍砍价,你砍得多省得多,回去能买辆自行车。 附表实验板 DIY元器件采购清单

单片机C语言快速入门学

单片机c语言入门学 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机 (Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没 什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大 家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想 学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什 么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机, 但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片 机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候, 我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出, 或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看 我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具 体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上 书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似, 编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特 点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲 的全是C方面的,完全在浪费你的时间! 呵呵 ^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件 仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使 你每天捧着本书,把那本书翻烂,也永远学不会单片机的!刚接触单片机的朋友,看了资料,

自制单片机烧写器

像我们这样搞电子的人,要的就是动手的乐趣。下面我们来介绍近期在网络上非常流行的USBasp下载线,因为现在的笔记本包括台式机都渐渐地舍弃了并口、串口;所以之前的并口或串口下载线已经不能再使用了,应该说是做个USBasp下载线是势在必行的,下面我们来介绍其制作的全过程。 图(1) 图1为原作者设计的原理图,为了便于制作我修改过某部分电路如图2,其功能一样。

图(2) 在制作之前首先要搞清楚几点: 第一、这个USB下载线本身就是一块AVR单片机,在制作过程中也必需对其进行程序下载才能运行。 第二、先得大概了解一下这个AVR单机机ATmega8的基本资料。这样才能对电路有个了解,从而便于调试。第三COM1是PC机与USB相接的端口,我们在焊接时一定要区分GND、VCC、D+、D-,下面图(3)是对应本次制作的USB端口的引脚功能。在焊接的之前务必搞清楚,否则会造成PC机端口的USB或下载给的ATmega8烧毁。

图(3)USB端口引脚功能 第四﹑最后我们来了解一下电路的结构。对应图2,其中JP1是选择下载时的速度是快速或慢速,当JP1接地时选择低速,否则为高速。对于选择快速还是慢是相对于被下载的单片机晶振时钟而言的。一般来讲,目标单片机与USBasp的ATmega8的时钟不能相差太远。而JP2是电源的选择,当短接时被下载的单片机选择USBasp供电,则否选择独立供电。切记:两者只能任选其一。LED2为ATmega8程序运行的指示灯,当其点亮时就证明USBasp运行正常。LED1为下载程序时的工作指示灯,当接收到上位机信号

时,此灯就会闪动。 图(4)制作的全部元器件 图(5_a)与图2对应的PCB板顶层

51单片机最小系统制作 全过程

51单片机最小系统制作 第一章概述 1.1 缘起 1. 给51初学者提供一个简单的DIY的教材。 第二章跑马灯和串口 2.1 第一步:准备 准备一下器件: 1、烙铁(质量好点) 2、焊锡(细) 3、烙铁架(带一个专用海绵) 4、松香块 5、万用表(要有带响的,听听红黑表笔短接时的声音出来快不快) 6、PCB面万用板1块 7、40pin 插座1个 8、11.0592M晶振1个 9、30P瓷片电容2个 10、11个LED 11、电阻排1K 1个到VCC,做跑马灯LED的限流电阻 12、max232或者兼容的芯片 13、16pin的插座上去 14、STC89C51 15、其它杂物 以上的投资加起来,不会超出100元。

价格数量和封装如下: STC的单片机可以串口下载。 解释一下: LED:8个挂在P1口,排电阻是上拉限流的;2个作为串口收发的指示灯;1个LED作为电源指示灯; 独石电容6个:5个是使用在max232上的;一个是使用在单片机上,作为电源去耦的; 10K电阻1个,接在EA上,上拉到5V; 电解电容和电阻构成上电复位电路;(STC单片机不需要)

自己买2个DB9的母头,焊接一根串口电缆; 准备一个3PIN的插座,焊接在PCB的面包板上; 还有电源,Dc5V的电源很多,电源电压差一点问题不大;很多单片机现在电源范围都宽; STC单片机应该可以工作在4V以上,具体查资料。 准备好以上物品,可以准备焊接好了。 来一张全家福: 2.2 第二步:焊接单片机最小系统

2.3 第三步:焊接串口指示灯 2.4 第四步:在P1口上焊接跑马灯

2.5 第五步:焊接Dc5V电源指示灯 2.6 第六步:焊接max232的5个0.1u电容

单片机内部主要部件

1.2 单片机内部主要部件 单片机内部电路比较复杂,MCS-51系列的8051型号单片机的内部电路根据功能可以分为CPU、RAM、ROM/EPROM、并行口、串行口、定时/计数器、中断系统及特殊功能寄存器(SFR)等8个主要部件,如图1-2-1所示。这些部件通过片内的单一总线相连,采用CPU加外围芯片的结构模式,各个功能单元都采用特殊功能寄存器集中控制的方式。其他公司的51系列单片机与8051结构类似,只是根据用户需要增加了特殊的部件,如A/D转换器等。在设计程序过程中,寄存器的使用非常频繁。本节内容在了解单片机内部的组成机构基础上,重点介绍单片机内部常用的寄存器的作用。 图1-2-1 MCS-51架构 1.2.1中央处理器(CPU) 中央处理器是单片机的核心,主要功能是产生各种控制信号,根据程序中每一条指令的具体功能,控制寄存器和输入/输出端口的数据传送,进行数据的算术运算、逻辑运算以及位操作等处理。MCS-51系列单片机的CPU字长是8位,能处理8位二进制数或代码,也可处理一位二进制数据。单片机的CPU从功能上一般可以分为运算器和控制器两部分。 一、控制器 控制器由程序计数器PC、指令寄存器、指令译码器、定时控制与条件转移逻辑电路等组成。其功能是对来自存储器中的指令进行译码,通过定时电路,在规定的时刻发出各种操作所需的全部内部和外部的控制信号,使各部分协调工作,完成指令所规定的功能。各部分功能部件简述如下。 1.程序计数器PC(Program Counter) 程序计数器是一个16位的专用寄存器,用来存放下一条指令的地址,具有自动加1的功能。当CPU要取指令时,PC的内容送地址总线上,从存储器中去取出一个指令码后,PC 内容自动加1,指向下一个指令码,以保证程序按顺序执行。 PC是用来指示程序的执行位置,在顺序执行程序时,单片机每执行一条指令,PC就自动加1,以指示出下一条要取的指令的存储单元的16位地址。也就是说,CPU总是把PC 的内容作为地址,根据该地址从存储器中取出指令码或包含在指令中的操作数。因此,每当取完一个字节后,PC的内容自动加1,为取下一个字节做好准备。由于51系列单片机的寻址范围为64K,所以,PC中数据的编码范围为0000H~FFFFH,共64K。单片机上电或复位时,PC自动清0,即装入地址0000H,这就保证了单片机上电或复位后,程序从0000H 地址开始执行。

STM32单片机快速入门V1.0概要

STM32 单片机快速入门 王志杰 2010年 5月 15日 目录 1 集成开发环境 (IDE ...................................................................................................................3 1.1 IAR 集成开发环境 ...............................................................................................................3 1.2 KEIL集成开发环 境 (20) 1.3 TrueSTUDIO集成开发环 境 (41) 2 附 录 ...........................................................................................................................................

.....54 2.1 源代码 main.c (54) 1集成开发环境(IDE 1.1IAR 集成开发环境 1.1.1安装 IAR 可从 IAR 网站上下载软件。 https://www.wendangku.net/doc/0519197180.html, 下载安装,如下图所示:运行 IAR ,界面如下所示:

STM32

单片机快速入门 1.1.2创建一个工程 选择 File>New>Workspace STM32单片机快速入门新建一个 project ,选择

单片机最小系统制作方案(适合初学者)

教学】单片机最小系统制作方案(适合初学者) 在写本单片机教程前,先自我介绍一下,我今年刚28岁,从事单片机教学二年。教学经验不足,写的不好,还请谅解,但是,我一定会尽力的。同时也希望大家能把我当朋友,共同进退。 本人喜欢上网,不喜欢运动,所以比较胖。我很喜欢在房间里做自己想做的事,如做网站,并建有自己的网站:〖教师吧〗:https://www.wendangku.net/doc/0519197180.html,保证长期有效。QQ是569 43772,E-MAIL:99xsw@https://www.wendangku.net/doc/0519197180.html, 单片机最小系统制作 一、确定任务 开发单片机最小系统 二、任务分析: 该系统具有的功能: (1)具有2位LED数码管显示功能。 (2)具有八路发光二极管显示各种流水灯。 (3)可以完成各种奏乐,报警等发声音类实验。 (4)具有复位功能。 三、功能分析 (1)两位LED数码管显示功能,我们可以利用单片机的P0口接两个数码管来现这个功能;(2)八路发光二极管显示可以利用P1口接八个发光二极管实现这个功能; (3)各种奏乐、报警等发声功能可以采用P2.0这个引脚接一蜂鸣器来实现。 (4)利用单片机的第9脚可以设计成复位系统,我们采用按键复位;利用单片机的18、19脚可以设计成时钟电路,我们利用单片机的内部振荡方式设计的。 四、设计框图

五、硬件电路设计 根据本系统的功能,和单片机的工作条件,我们设计出下面的电路图。

六、元件清单的确定: 数码管:共阴极2只(分立) 电解电容:10UF的一只 30PF的电容2只 220欧的电阻9只 4.7K的电阻一只 1.2K的电阻一只 4.7K的排阻一只, 12MHZ的晶振一只 有源5V蜂名器一只 AT89S51单片机一片 常开按钮开关1只 紧锁座一只(方便芯取下来的,绿色的) 发光二极管(5MM红色)8只 万能板电路版15*17CM S8550三极管一只 4.5V电池盒一只,导线若干。 七、硬件电路的焊接 按照原理图把上面的元件焊接好,详细步骤省略。 八、相关程序编写 针对上面的电路原理图,设计出本系统的详细功能: (1)、第一个发光二极管点亮,同时数码管显示“1”。 (2)、第二个发光二极管点亮,同时数码管显示“2”。 (3)、依次类推到第八个发光二极管点亮,同时数码管显示“8”。以上出现的是流水灯的效果

基于protuse的单片机模拟的实例

本人对单片机的一些了解,在这里和大家分享。 (1)基于AT89C52的同步串口通信 ①单片机1程序 (程序在Kile C51上运行通过。) /******************************************************************** * 文件名:液晶1602显示.c * 描述: 该程序实现了对液晶1602的控制。 * 创建人:东流,2009年4月10日 * 版本号:2.0 ***********************************************************************/ #include #define uchar unsigned char #define uint unsigned int //这三个引脚参考资料 sbit E=P3^5; //1602使能引脚 sbit RW=P3^6; //1602读写引脚 sbit RS=P3^7; //1602数据/命令选择引脚 sbit aaa=P1^0; sbit bbb=P1^1; sbit aa=P3^0; sbit bb=P3^1; /******************************************************************** * 名称: delay() * 功能: 延时,延时时间大概为140US。 * 输入: 无 * 输出: 无

***********************************************************************/ void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++) ; } /******************************************************************** * 名称: enable(uchar del) * 功能: 1602命令函数 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ void enable(uchar del) { P2 = del; RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); } /******************************************************************** * 名称: write(uchar del) * 功能: 1602写数据函数 * 输入: 需要写入1602的数据 * 输出: 无 ***********************************************************************/ void write(uchar del) { P2 = del; RS = 1; RW = 0; E = 0; delay(); E = 1; delay();

单片机电子琴制作16按键

《单片机原理》课程设计 说明书 专业名称:电气工程及其自动化 班级:11-2 学号: 姓名: 指导教师: 日期:2013.6.21

《单片机原理课程设计》评阅书

摘要 本文设计了一种基于STC12C5A32S2单片机的电子琴电路。该方案利用单片机定时器产生固定频率的方波信号以驱动蜂鸣器发出一定的旋律,通过矩阵键盘中的相应的按键来输入使蜂鸣器发出相对音阶的单音。同时设计还有自动存储所输入的单音,之后再一起自动演奏出来的功能。 本设计通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经三极管放大信号后驱动蜂鸣器发出不同音节的声音。要实现7个音符的各自的高、中、低音,需要建立三个表,分别存储高音、中音和低音的频率值;默认为中音输出,当二个按键开关中某一个按下,通过软件选择相应的音频。按下弹奏键就可弹奏出不同的声音。 另外用软件延时来控制发音时间的长短,来控制节拍。通过把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中。由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间,这样就可以实现乐曲的演奏。 本设计为实物电路板设计开发,报告中详细的阐述了电子琴设计的方法和过程。并经过软硬件的调试,该音乐发生器不但能通过键盘弹奏出很好的音调,而且还可以通过键盘选择播放不同的音乐。 本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。 关键词:STC12C5A32S2 单片机定时器电子琴

目录 摘要 ....................................... 错误!未定义书签。第一章引言 . (2) 第二章电子琴电路硬件电路设计 .............. 错误!未定义书签。 2.1单片机的介绍与组成 (4) 2.2单片机主控电路 (4) 2.3 4×4矩阵键盘电路 (5) 2.4 蜂鸣器电路 (5) 第三章电子琴电路软件设计 .................. 错误!未定义书签。 3.1 程序设计流程图...................... 错误!未定义书签。 3.2音乐播放部分 (5) 3.3电子琴弹奏部分 (5) 3.4发音原理 (5) 第四章程序 ................................ 错误!未定义书签。心得体会 ................................... 错误!未定义书签。参考文献 (11) 附件错误!未定义书签。

STM8单片机入门快速教程

STM8单片机入门快速教程 一、前言 因个人在学习STM8时遇到许多困惑,所以编译一个 STM8快速入门教程,望能为初学者提供一些帮助。二、STM8使用的编译软件和下载软件 STM8有对应库函数,但我用的是IAR编译软件,是直 接操作寄存器,所以就不对库函数多少什么。IAR是最 近一两年才支持STM8编译的,所以软件嘚找好,注册 机嘚选对。下载软件我是用现成的“轩微科技STM8编 程下载器”淘宝要60多一个。因操作寄存器所以要具 备几个文档,具体我配带在文件里面了。编程用的头文 件是#include 或#include , 根据型号而定,有的型号不一样定义的地址会不一样 的。 三、IO的输出、输入 每个单片机我想最重要懂的应该是它怎么输出高低电平还怎么输入。STM8管脚分三级流水控制。分别有方向寄存器、控制寄存器、还有输出/输入寄存器。 方向寄存器:是控制IO口成输出还是输入状态 控制寄存器:有两个,是控制IO口以什么模式输出或输入 因为高级单片机有很多种输出模式,比如上拉 输入,推挽输出等....。

输出/输入寄存器:其分别有单独的输出寄存器和输入寄存器,输出寄存器给其高低电平就输出高低电平 (条件是配置为输出状态时)。输入寄存器无 论是在输出还是输入模式都可读取IO的高低 电平状态。 其具体设置可下面: DDR CR1 CR2 引脚设置 0 0 0 悬浮输入 0 0 1 上拉输入 0 1 0 中断悬浮输入 0 1 1 中断上拉输入 1 0 0 开漏输出 1 1 0 推挽输出 1 X 1 输出(最快速度为10MHZ)

单片机自己制作

自己动手做单片机实验板 一台电脑:这在日后写程序或是下载程序都是必需之物。现在的新款电脑越来越不适合单片机学习了或者说单片机的设备也应该更新换代了,一般常用的 9针串口和 25针并口多数被方方正正的 USB接口所取代。更新推出的操作系统对开发软件支持并不很好,建议大家使用 WIN XP或 WIN 2000系统。不用考虑 CPU速度和存储空间,同时电脑要有 9针的串口和 25针的并口(打印机接口),如果没有可以用 USB转换器扩展,不过其效果不如原配夫妻。 ISP下载线:从电脑向手机下载图片或音乐一般都有一条连接线,再配上手机专用的软件就可以让手机丰富多彩了。单片机也可以用这样的方法,虽然这不是唯一的方法,但这较适合一般的单片机学习,好而不贵。ISP下载线就是一个设计有简单电路的单片机程序下载工具,它就像塑造生命的天使,配上小巧的 ISP下载软件就可以施与单片机灵魂。虽然我们不是上帝,但在后文我们先要亲手塑造它,先做好心理准备。 实验板:这是一年半载也玩不腻的家伙,因为这是在学习中不断扩展的。它是将一块单片机焊在一片电路板中间,板上还焊有电源和单片机的最小系统电路,见图 1。如果继续往下说许多读者朋友会骂我太粗心了,所以我不得不解释一下“最小系统”是啥东东。随便抓一个数模电路的芯片,它要是想正常工作必须有一个先天条件,就是符合要求的电源。单片机也是一样,不过它太讲究了,要的东西更多。除了一个稳定的电源供电之外,它还需要一个复位电路,就是给单片机一个信号让它归回到开始工作的状态。同时晶振部分电路也是必不可少的,这相当于给单片机带了一块手表,让它有时间观念,知道自己什么时候该干什么事情。总之最小系统就是保证单片机正常工作的最基本电路部分。OK,再说回到单片机实验板。我是买元器件自己制作实验板的,我感觉没有必要多花钱去买一个成品,虽然这样说卖实验板的人可能会扁我。自己动手可以学到单片机硬件电路的知识和掌握制作的细节,这是不可多得的实践机会。你决定实验板 DIY了吗?我们一起做吧!

单片机的内部结构

单片机的主要组成 ①一个8位的微处理器CPU。 ②片内数据存储器RAM(128B/256B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等。 ③片内程序存储器ROM/EPROM(4KB/8KB),用以存放程序、一些原始数据和表格。但也有一些单片机内部不带ROM/EPBOM,如8031、8032、80C31等。 ④四个8位并行I/O(输入/输出)接口P0—P3,每个口可以用作输入,也可以用作输出。 ⑤两个或三个定时/计数器,每个定时/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。 ⑥五个中断源的中断控制系统。 ⑦一个全双工UART(通用异步接收发送器)的串行I/O口,可实现单片机与单片机或其它微机之间串行通信。 ⑧片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接,最高允许振荡频率为12MHz。 /* BYTE Registers */ 1sfr P0 = 0x80;

2sfr P1 = 0x90; 3sfr P2 = 0xA0; 4sfr P3 = 0xB0; 5sfr PSW = 0xD0;程序状态字 6sfr ACC = 0xE0;累加器 7sfr B = 0xF0;B寄存器 8sfr SP = 0x81; 堆栈指针 9sfr DPL = 0x82;DPTR数据指针 10sfr DPH = 0x83; 11sfr PCON = 0x87;电源控制寄存器 12sfr TCON = 0x88;定时/计数控制寄存器 13sfr TMOD = 0x89; 定时/计数工作方式状态寄存器 14sfr TL0 = 0x8A; 15sfr TL1 = 0x8B; 16sfr TH0 = 0x8C; 17sfr TH1 = 0x8D; 18sfr IE = 0xA8;中断允许控制寄存器 18sfr IP = 0xB8;中断优先级控制寄存器 20sfr SCON = 0x98;串行口控制寄存器 21sfr SBUF = 0x99;串行口数据缓冲器

1小时单片机c语言快速入门1

1小时c语言入门 (一) 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机(Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机,但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着

书在埋头复习的时候,我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出,或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似,编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲的全是C方面的,完全在浪费你的时间! 呵呵^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使你每天捧着本书,把那本书翻烂,也永远学不会单片机的!

单片机入门常用知识

概述: 所谓单片机就是能在一个芯片上完成计算机处理功能的设备,在芯片的内部有计算单元、数据处理单元、程序存储以及常用的外部接口管理单元。在软件程序的管理控制下可实现设计者所需要的功能。 最初的单片机受芯片设计密度的限制,功能和性能不强,随着技术的发展,目前的单片机可实现大多数的常用接口功能,软件的存储空间也越来越大,处理能力大幅增加。 单片机常用功能: 普通端口功能:单片机都带有多个逻辑端口,可作为逻辑状态的输入输出使用,可用于控制或读取外部状态。 定时功能:单片机内部包含有定时器,通过对定时时钟进行计数来产生需要的延时,延时的长短可通过设置定时器的计数值来设置。 中断功能:单片机内部设定有多个中断入口,每当产生中断条件后,程序自动跳入到中断入口,通过中断入口的跳转指令转到中断处理程序,执行完后返回到产生中断跳转程序处的下一个指令地址。在单片机接口上,有专用的中断管脚,可设置为电平中断或边沿中断,当管脚出现条件时,设置对应的中断标志,触发相应中断。除了管脚中断,串口、定时、A/D等几乎都可产生中断。同时,中断的响应还需要设置对应的寄存器到要求的状态才可。 串口功能:串口相对于并口来说,数据是通过一个管脚送出或读入,数据长度一般为8位,按顺序移位送出。串口特点具有实用管脚少,应用方式灵活的特点,通过RS232电平转换可直接和计算机的串

口进行通讯。 A/D功能:可直接输入模拟信号,软件发出转换信号后,信号的幅值可通过转换变换为数值信号送对应的寄存器上。 D/A功能:可直接输出模拟信号,信号的幅值可通过D/A端口的设置数值来设定。 以上为常用功能,有些单片机还有SPI、USB、CAN等多种接口外部常用设备: 显示和输入:单片机的处理信息一般通过液晶屏或数码管来显示处理内容,液晶屏或数码管可直接连接到单片机管脚上,按照显示需求设置软件即可,输入多用按键输入,也可直接连接到单片机管脚上,软件通过监测管脚状态可获得按键信息。 串口应用:单片机串口信号一般为TTL电平,外部常用RS232或RS485,在应用中需要加对用的转换芯片或模块。 开发环境: 单片机储存的程序为二进制格式,把程序写入到单片机需要专用的设备,早期完成这个功能采用编程器来完成,编程器通过打印机口或串口以及USB口和计算机连接,单片机则通过可锁插座装入到编程器上,通过计算机上的软件选择好单片机型号,读入要下载的二进制软件,然后运行编程,则完成下载。目前,则是通过仿真器(下载线)来完成,一般是通过USB口连接计算机,计算机上下载功能和仿真功能集合到一起。通过编译软件把软件编译成二进制文件,然后直接下载即可。下载后的软件可通过仿真运行进行调试。

相关文档