文档库 最新最全的文档下载
当前位置:文档库 › 基于51的ads1115程序

基于51的ads1115程序

基于51的ads1115程序
基于51的ads1115程序

/*------------------------------------------------------------------------------------------------------------------------------------------*/ /*--*************************功能:【ADS1115单端输入检测电压】********************--*/ /*--*************************CPU:【STC12C5A60S2】*******************************--*/ /*--*************************ADC芯片:【ADS1115(2差分输入或4单端输入)】***********--*/ /*--*************************液晶:【LCD1602】************************************--*/ /*--*************************ADC与单片机连接:【SCL:P1.0 , SDA:P1.1】*******************--*/ /*--*************************检测范围:【0.00~4.99V】*********************************--*/ /*----------------------------------------------------------------------------------------------------------------------------------------*/ #include

#include

#define uint unsigned int

#define uchar unsigned char

#define _Nop() _nop_()

/*------------------------以下为LCD1602显示模块端口定义及函数声明-----------------------*/

sbit lcd_rs_port = P1^7; /*定义LCD控制端口*/

sbit lcd_rw_port = P1^6;

sbit lcd_en_port = P2^4;

#define lcd_data_port P0

unsigned char num_char_table[] = {"0123456789ABCDEF"};

unsigned char Lcd_Dis1_table[] = {"Volt: V "}; //电压显示框架

unsigned char pos_char_table[] = {" 67.9AB V "}; //电压显示位置

void lcd_delay(uchar ms); //LCD1602 延时

void lcd_busy_wait(); //LCD1602 忙等待

void lcd_command_write(uchar command); //LCD1602 命令字写入void lcd_system_reset(); //LCD1602 初始化

void lcd_char_write(uchar x_pos,y_pos,lcd_dat); //LCD1602 字符写入

void lcd_bad_check(); //LCD1602 坏点检查

void Num_to_Disp(uint Num); //LCD1602 数据处理

void LcdDisp(uint num); //LCD1602 数据显示

void delay_1ms(uchar x); //LCD1602 延时1ms

/*------------------------以下为ADS1115模块端口定义及函数声明--------------------------*/

sbit SCL = P1^0;

sbit SDA = P1^1;

#define TRUE 1

#define FALSE 0

unsigned int Config;

unsigned char Writebuff[4],Readbuff[3];

unsigned int Result[2];

int D_ADS; //转换的数字量

#define Accuracy 32768 //定义ADC精度,ADS1115单端输入时15位

#define ADDRESS_0 0x90 //ADDR PIN ->GND

#define ADDRESS_1 0x92 //ADDR PIN ->VDD

#define ADDRESS_2 0x94 //ADDR PIN ->SDA

#define ADDRESS_3 0x96 //ADDR PIN ->SCL

/************POINTER REGISTER*****************/ #define Pointer_0 0x00 //Convertion register

#define Pointer_1 0x01 //Config register

#define Pointer_2 0x02 //Lo_thresh register

#define Pointer_3 0x03 //Hi_thresh register

/************CONFIG REGISTER*****************/ #define OS_0 0x0000

#define OS_1 0x8000

#define MUX_0 0x0000 //AINp=AIN0, AINn=AIN1

#define MUX_1 0x1000 //AINp=AIN0, AINn=AIN3

#define MUX_2 0x2000 //AINp=AIN1, AINn=AIN3

#define MUX_3 0x3000 //AINp=AIN2, AINn=AIN3

#define MUX_4 0x4000 //AINp=AIN0, AINn=GND

#define MUX_5 0x5000 //AINp=AIN1, AINn=GND

#define MUX_6 0x6000 //AINp=AIN2, AINn=GND

#define MUX_7 0x7000 //AINp=AIN3, AINn=GND

#define PGA_0 0x0000 //FS=6.144V

#define PGA_1 0x0200 //FS=4.096V

#define PGA_2 0x0400 //FS=2.048V

#define PGA_3 0x0600 //FS=1.024V

#define PGA_4 0x0800 //FS=0.512V

#define PGA_5 0x0A00 //FS=0.256V

#define PGA_6 0x0C00 //FS=0.256V

#define PGA_7 0x0E00 //FS=0.256V

#define MODE_0 0x0000

#define MODE_1 0x0100

#define DR_0 0x0000 //Data Rate = 8

#define DR_1 0x0020 //Data Rate = 16

#define DR_2 0x0040 //Data Rate = 32

#define DR_3 0x0060 //Data Rate = 64

#define DR_4 0x0080 //Data Rate = 128

#define DR_5 0x00A0 //Data Rate = 250

#define DR_6 0x00C0 //Data Rate = 475

#define DR_7 0x00E0 //Data Rate = 860

#define COMP_MODE_0 0x0000

#define COMP_MODE_1 0x0010

#define COMP_POL_0 0x0000

#define COMP_POL_1 0x0008

#define COMP_LAT_0 0x0000

#define COMP_LAT_1 0x0040

#define COMP_QUE_0 0x0000

#define COMP_QUE_1 0x0001

#define COMP_QUE_2 0x0002

#define COMP_QUE_3 0x0003

//*************ADDR Initial********************/

#define ADDRESS ADDRESS_0 //ADDR PIN ->GND

#define ADDRESS_W ADDRESS|0x00 //写地址

#define ADDRESS_R ADDRESS|0x01 //读地址

/*************Config Initial*********************/

#define OS OS_1

#define MUX_A0 MUX_4 //AINp=AIN0, AINn=GND

#define MUX_A1 MUX_5 //AINp=AIN1, AINn=GND

#define MUX_A2 MUX_6 //AINp=AIN2, AINn=GND

#define MUX_A3 MUX_7 //AINp=AIN3, AINn=GND

#define PGA PGA_1 //FS=6.144V

#define MODE MODE_1 //Continuous conversion mode

#define DR DR_7 //Data Rate = 860

#define COMP_QUE COMP_QUE_3

void Delay_us_15 (void);

void Delay_ms_1 (void); //功能:延时

void Start(void); //功能:完成IIC的起始条件操作

void Stop(void); //功能:完成IIC的终止条件操作

void ACK(void); //功能:完成IIC的主机应答操作

void NACK(void); //功能:完成IIC的主机无应答操作

unsigned char Check(void);//功能:检查从机的应答操作

void Write_1_Byte(unsigned char DataByte); //写1个字节unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n); //写N个字节unsigned char Read_1_Byte(void); //读1个字节void Read_N_Byte(unsigned int *readbuff,unsigned char n); //读N个字节void InitADS1115(bit S_MUX_0, bit S_MUX_1); //ADS1115初始化void WriteWord(void); //写

void ReadWord(void); //读

unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1); //ADS1115取值

/*--------------------------------------------------------------------------------------------------------------------------------*/ /*--*********************************【主函数】*******************************--*/ /*-------------------------------------------------------------------------------------------------------------------------------*/ void main()

{

lcd_system_reset(); //LCD1602 初始化

lcd_bad_check(); //LCD1602 坏点检查

while(1)

{

result = ADS1115(0,0); //ADS1115取值_AIN0

//result = ADS1115(0,1); //ADS1115取值_AIN1

//result = ADS1115(1,0); //ADS1115取值_AIN2

//result = ADS1115(1,1); //ADS1115取值_AIN3

LcdDisp(result); //LCD1602显示电压值

}

}

/*--------------------------------------------------------------------------------------------------------------------------------*/ /*--****************************************************************************--*/ /*-------------------------------------------------------------------------------------------------------------------------------*/

/*------------------------以下为LCD1602显示模块函数定义-----------------------*/

void lcd_delay(uchar ms) /***********LCD1602 延时***************/

{

uchar j;

while(ms--){

for(j=0;j<250;j++)

{;}

}

}

void lcd_busy_wait() /**********LCD1602 忙等待*************/

{

lcd_rs_port = 0;

lcd_rw_port = 1;

lcd_en_port = 1;

lcd_data_port = 0xff;

while (lcd_data_port&0x80);

lcd_en_port = 0;

}

void lcd_command_write(uchar command) /**********LCD1602 命令字写入*************/ {

lcd_busy_wait();

lcd_rs_port = 0;

lcd_rw_port = 0;

lcd_en_port = 0;

lcd_data_port = command;

lcd_en_port = 0;

}

void lcd_system_reset() /**********LCD1602 初始化**************/

{

lcd_delay(20);

lcd_command_write(0x38);

lcd_delay(100);

lcd_command_write(0x38);

lcd_delay(50);

lcd_command_write(0x38);

lcd_delay(10);

lcd_command_write(0x08);

lcd_command_write(0x01);

lcd_command_write(0x06);

lcd_command_write(0x0c);

}

void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /******LCD1602 字符写入**********/ {

x_pos &= 0x0f; /* X位置范围0~15 */

y_pos &= 0x01; /* Y位置范围0~ 1 */

if(y_pos==1) x_pos += 0x40;

x_pos += 0x80;

lcd_command_write(x_pos);

lcd_busy_wait();

lcd_rs_port = 1;

lcd_rw_port = 0;

lcd_en_port = 0;

lcd_data_port = lcd_dat;

lcd_en_port = 1;

lcd_en_port = 0;

}

void lcd_bad_check() /******LCD1602 坏点检查**********/

{

char i,j;

for(i=0;i<2;i++){

for(j=0;j<16;j++) {

lcd_char_write(j,i,0xff);

}

}

lcd_delay(200);

lcd_delay(200);

lcd_delay(200);

lcd_delay(100);

lcd_delay(200);

lcd_command_write(0x01); // clear lcd disp

void Num_to_Disp(uint Num) /******LCD显示数据处理*****/ //Start_1-Over_1:显示电压值,Start_2-Over_2:显示ADS1115输出数值

{

float NUM; //Start_1

int xx, yy, zz, zzz;

NUM = (Num / (float)Accuracy) * VCC; //ADS1115取值= Accuracy ×(Vin / VCC)

xx = (int)NUM;

yy = (int)((NUM - (float)(xx)) * 10);

zz = (int)((NUM - (float)(xx)) * 100)%10;

zzz = (int)((NUM - (float)(xx)) * 1000)%10;

pos_char_table[6] = num_char_table[xx / 10]; //电压值十位

pos_char_table[7]= num_char_table[xx % 10]; //电压值个位

pos_char_table[9]= num_char_table[yy]; //电压值小数点后一位

pos_char_table[10]= num_char_table[zz]; //电压值小数点后两位

pos_char_table[11]= num_char_table[zzz]; //电压值小数点后三位//Over_1

/*

pos_char_table[6] = num_char_table[Num / 10000]; //Start_2

pos_char_table[7] = num_char_table[(Num % 10000) / 1000];

pos_char_table[8]= num_char_table[((Num % 10) % 1000) / 100];

pos_char_table[9]= num_char_table[(Num / 10) % 10];

pos_char_table[A]= num_char_table[Num % 10]; //Over_2

*/

}

void LcdDisp(uint num) /************LCD显示*************/

{

uint i=0;

for (i=0;i<16;i++)

{

lcd_char_write(i,0,Lcd_Dis1_table[i]); //显示框架

}

Num_to_Disp(num);

for(i = 6; i < 12; i++)

{

lcd_char_write(i,0,pos_char_table[i]); //显示电压

}

delay_1ms(100);

}

void delay_1ms(uchar x) /*******1MS为单位的延时程序******/

{

uchar j;

while(x--){

{;}

}

}

/*------------------------以下为ADS1115模块端口函数定义--------------------------*/

void Delay_us_15 (void) /*延时程序*/

{

unsigned char i;

for(i = 0;i < 15;i++)

_nop_();

}

void Delay_ms_1 (void)

{

unsigned char i;

for(i = 150;i > 0;i--) _nop_();

}

///*******************************************

//函数名称:Start

//功能:完成IIC的起始条件操作

//参数:无

//返回值:无

//********************************************/

void Start(void)

{

SCL=1;

SDA=1;

Delay_us_15 ();

SDA=0;

Delay_us_15 ();

SCL=0;

Delay_us_15 ();

}

//

///*******************************************

//函数名称:Stop

//功能:完成IIC的终止条件操作

//参数:无

//返回值:无

//********************************************/

void Stop(void)

{

SDA=0;

Delay_us_15 ();

SCL=1;

Delay_us_15 ();

SDA=1;

}

///******************************************* //函数名称:ACK

//功能:完成IIC的主机应答操作

//参数:无

//返回值:无

//********************************************/ void ACK(void)

{

SDA=0;

_nop_(); _nop_();

SCL=1;

Delay_us_15 ();

SCL=0;

_nop_(); _nop_();

SDA=1;

Delay_us_15 ();

}

//******************************************* //函数名称:NACK

//功能:完成IIC的主机无应答操作

//参数:无

//返回值:无

//********************************************/ void NACK(void)

{

SDA=1;

_nop_(); _nop_();

SCL=1;

Delay_us_15 ();

SCL=0;

_nop_(); _nop_();

SDA=0;

Delay_us_15 ();

}

//**********检查应答信号函数******************/ ///*如果返回值为1则证明有应答信号,反之没有*/ ///******************************************* //函数名称:Check

//功能:检查从机的应答操作

//参数:无

//返回值:从机是否有应答:1--有,0--无

//********************************************/ unsigned char Check(void)

{

unsigned char slaveack;

SDA=1;

_nop_(); _nop_();

_nop_(); _nop_();

slaveack = SDA; //读入SDA数值

SCL=0;

Delay_us_15 ();

if(slaveack) return FALSE;

else return TRUE;

}

/***************Write a Byte****************/

void Write_1_Byte(unsigned char DataByte)

{

int i;

for(i=0;i<8;i++)

{

if(DataByte&0x80) //if((DataByte<

SDA=1;

else

SDA=0;

Delay_us_15 ();

SCL=1;

Delay_us_15 ();

SCL=0;

Delay_us_15 ();

DataByte <<= 1;

}

SDA=1;

_nop_();

}

/***************Write N Byte****************/

unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n) {

int i;

for(i=0;i

{

Write_1_Byte(*writebuffer);

if(Check())

{

writebuffer ++;

}

else

{

Stop();

}

Stop();

return TRUE;

}

//***************Read a Byte****************/ unsigned char Read_1_Byte(void)

{

unsigned char data_Value = 0, FLAG, i;

for(i=0;i<8;i++)

{

SDA=1;

Delay_us_15 ();

SCL=1;

Delay_us_15 ();

FLAG=SDA;

data_Value <<= 1;

if( FLAG)

data_Value |= 0x01;

SCL=0;

Delay_us_15 ();

}

return data_Value;

}

//***************Read N Byte****************/ void Read_N_Byte(unsigned int*readbuff, unsigned char n) {

unsigned char i;

for(i=0;i

{

readbuff[i]=Read_1_Byte();

if(i==n-1)

NACK(); //不连续读字节

else

ACK(); //连续读字节

}

Stop();

}

//*****************初始化******************/ void InitADS1115(bit S_MUX_0, bit S_MUX_1)

{

if (S_MUX_0 == 0 && S_MUX_1 == 0) //AIN0 Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;

if (S_MUX_0 == 0 && S_MUX_1 == 1) //AIN1 Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;

if (S_MUX_0 == 1 && S_MUX_1 == 0) //AIN2 Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;

if (S_MUX_0 == 1 && S_MUX_1 == 1) //AIN3 Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;

Writebuff[0]=ADDRESS_W;

Writebuff[1]=Pointer_1;

Writebuff[2]=Config/256;

Writebuff[3]=Config%256;

Readbuff[0]=ADDRESS_W;

Readbuff[1]=Pointer_0;

Readbuff[2]=ADDRESS_R;

}

//***************Write a Word***********************/

void WriteWord(void)

{

int t;

Start(); //写入4个字节

do

{

t=Write_N_Byte(Writebuff,4);

}while(t==0);

}

//***************Read Word***********************/

void ReadWord(void)

{

int t;

Start(); //写入2个字节

do

{

t=Write_N_Byte(Readbuff,2);

}while(t==0);

Start(); //写入2个字节

do

{

t=Write_N_Byte(&Readbuff[2],1);

}while(t==0);

Read_N_Byte(Result,2); //读出2个字节

}

//***************ADS1115********************/ unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1) {

InitADS1115(S_MUX_0, S_MUX_1);

WriteWord();

Delay_ms_1();

ReadWord();

D_ADS=Result[0]*256+Result[1]; //转换的数字量

return D_ADS;

}

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

单片机分析程序

四、分析程序并填空() 1.执行下列程序段后,(P1)=___9BH____。 MOV P1,#5DH CPL P1.1 CPL P1.2 CLR P1.6 SETB P1.7 2.执行下列程序段后,(A)=__8BH_____,(C Y)=__不影响__。 MOV A,#C5H RL A 3.下列程序段执行后,(R0)=___7FH____,(7EH)=__00H__,(7FH)=_41H______。 MOV R0,#7EH MOV 7EH,#0FFH MOV 7FH,#40H INC @R0 INC R0 INC @R0 4.已知(SP)=60H,子程序SUBTRN的首地址为0345H,现执行位于0123H的ACALL SUBTRN双字节指令后,(PC)=__0345H_,(61H)=___25H____,(62H)= __01H__。 5.阅读下列程序,说明其功能。 MOV R0,#data MOV A,@R0 RL A MOV R1,A RL A RL A ADD A,R1 MOV @R0,A RET ; (data)×10操作 6.改错 1.MUL RoRl 乘法指令应使用A、B寄存器操作 2.MOV A,@R7 间接寄存器使用R7有误,间址寄存器只能使用R0、R1 3.MOV A,#3000H 8位累加器A不能接受16位数据 4.MOVC @A+DPTR,A MOVC指令为对程序存储区操作指令,累加器的内容不可通过变址方式送入程序存储器,两操作数写反了。 5.UMP #1000H 长转移指令中的操作数为16位转移地址,不能用立即数的形式来表达。 7. 说明MCS—51单片机的下列各条指令中源操作数的寻址方式(可直接在每条指令后面书写) 1.ANL A,20H 直接寻址 2.ADDC A,#20H 立即寻址

AT89C51单片机简易计算器的设计

AT89C51单片机简易计算器的设计 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除六位数范围内的基本四则运算,并在LCD上显示相应的结果。设计电路采用AT89C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入。显示采用字符LCD静态显示。软件方面使用C语言编程,并用PROTUES仿真。 一、总体设计 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。 (2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。 (3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数

值,按等号就会在LCD上输出运算结果。 (4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。 系统模块图: 二、硬件设计 (一)、总体硬件设计 本设计选用AT89C51单片机为主控单元。显示部分:采用LCD 静态显示。按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。 总体设计效果如下图:

51单片机常用子程序汇总

目录 1、通过串口连续发送n个字节的数据 /*************************************************************** 模块功能:通过串口连续发送n个字节的数据 参数说明: s:待发送数据的首地址 n:要发送数据的字节数 ***************************************************************/ void SendD(unsigned char *s,unsigned char n) { unsigned char unX; if(n>0) { ES=0; // 关闭串口中断 for(unX=0;unX #include #define Nop() _nop_() //空指令

sbit SDA=P1^3; sbit SCL=P1^2; bit ACK; void Start_I2c() { SDA=1; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=0; Nop(); Nop(); Nop(); Nop(); Nop(); SCL=0; //钳住I2C总线,准备发送或接受数据Nop(); Nop(); } (2)结束总线函数 /*************************************************************** 模块功能:发送I2C总线结束条件 ***************************************************************/ void Stop_I2c() { SDA=0; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=1; Nop(); Nop(); Nop(); Nop();

基于51单片机的计算器设计程序代码汇编

DBUF EQU 30H TEMP EQU 40H YJ EQU 50H ;结果存放 YJ1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放 ORG 00H START: MOV R3,#0 ;初始化显示为空MOV GONG,#0 MOV 30H,#10H MOV 31H,#10H MOV 32H,#10H MOV 33H,#10H MOV 34H,#10H MLOOP: CALL DISP ;PAN调显示子程序WAIT: CALL TESTKEY ; 判断有无按键JZ WAIT CALL GETKEY ;读键 INC R3 ;按键个数 CJNE A,#0,NEXT1 ; 判断就是否数字键 LJMP E1 ; 转数字键处理NEXT1: CJNE A,#1,NEXT2 LJMP E1 NEXT2: CJNE A,#2,NEXT3 LJMP E1 NEXT3: CJNE A,#3,NEXT4 LJMP E1 NEXT4: CJNE A,#4,NEXT5 LJMP E1 NEXT5: CJNE A,#5,NEXT6 LJMP E1 NEXT6: CJNE A,#6,NEXT7 LJMP E1 NEXT7: CJNE A,#7,NEXT8 LJMP E1 NEXT8: CJNE A,#8,NEXT9 LJMP E1 NEXT9: CJNE A,#9,NEXT10 LJMP E1 NEXT10: CJNE A,#10,NEXT11 ;判断就是否功能键LJMP E2 ;转功能键处理NEXT11: CJNE A,#11,NEXT12 LJMP E2 NEXT12: CJNE A,#12, NEXT13 LJMP E2

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

51单片机简易计算器程序

#include <reg51.h>#include <intrins.h> #include <ctype.h> #include <stdlib.h> #define uchar unsigned char #define uint unsigned int uchar operand1[9], operand2[9]; uchar operator; void delay(uint); uchar keyscan(); void disp(void); void buf(uint value); uint compute(uint va1,uint va2,uchar optor); uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff}; uchar dbuf[8] = {10,10,10,10,10,10,10,10}; void delay(uint z) { uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); } uchar keyscan() { uchar skey; P1 = 0xfe; while((P1 & 0xf0) != 0xf0) { delay(3); while((P1 & 0xf0) != 0xf0) { switch(P1) { case 0xee: skey = '7'; break; case 0xde: skey = '8'; break; case 0xbe: skey = '9'; break; case 0x7e: skey = '/'; break; default: skey = '#'; }

51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》 周航慈 目前已有若干版本的子程序库公开发表,它们各有特色。笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方 面作了一些工作。本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。 (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。 (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理 程序的工作变得更简单直观。 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈 需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。程序 清单中开列了四个栏目:标号、指令、操作数、注释。为方便读者理解,注释尽力详细。 子程序库的使用方法如下: 1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是需要对子程序库进行仔细删节。 (一)MCS-51定点运算子程序库及其使用说明 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下: 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。 2.运算精度:单次定点运算精度为结果最低位的当量值。 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无 关的或非消耗性的信息,程序就具有较好的透明性。

51单片机C语言程序设计经典案例

项目三 C51程序设计语言基础 任务1 C51程序的识读 1.C51程序结构 例3-1 P_test /********************* ,标准的MCS-51单片机头文件为””,STC89系列单片机头文件为””

4.C51的常量和变量 1)常量 常量就是在程序运行过程中,其值不能改变的数据,包括整型常量、字符常量、字符串常量、实数常量、位标量等。 (1)整型常量:可以用二进制、八进制、十进制、十六进制表示。 无符号整数常量在一个数字后面加上“u”或“U”表示。长整数型常量在后面加上“l”或“L”,无符号长整数型常量在数字后面加上“ul”或“UL”,实数型常量在后面加“f”或“F”。 (2)字符常量:单引号内的字符,不可以显示的控制字符在前加“\”组成专用转义字符。(3)字符串常量:双引号内的字符,当双引号内没有字符时是空字符串。在C语言中,字

符串常量是作为字符类型数组来处理的,在存储字符串时,系统在字符串尾部加上转义字符“\o”,作为该字符串的结束符。 (4)实数常量:有十进制和指数两种表示形式。指数表示的实数为“[±]数字[.数字]e[±]数字”,[ ]中的内容为可选项 (5)位标量:位标量的值是一个二进制数。 2)变量 变量就是在程序运行过程中,其值可以被改变的数据。必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义变量的格式: [ < 存储模式 > ] < 类型定义 > [ 存储器类型 ] < 标识符 >; 类型定义和标识符是必要的。存储模式有四种,自动(auto)、外部(extern)、静态(static)和寄存器(register),默认类型为自动(auto)。 表3-3 C51存储类型与MCS-51单片机存储空间的对应关系及其大小 如果在变量定义时省略了存储类型标识符,则编译器会自动选择默认的存储类型。默认的存

AT89C51单片机C实现简易计算器

AT89C51单片机简易计算器的设计 一、总体设计 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。 (2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。 (3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。 (4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。 系统模块图:

二、硬件设计 (一)、总体硬件设计 本设计选用AT89C51单片机为主控单元。显示部分:采用LCD 静态显示。按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。 总体设计效果如下图:

(二)、键盘接口电路 计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。 矩阵键盘的工作原理: 计算器的键盘布局如图2所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。 图 2 矩阵键盘布局图 矩阵键盘内部电路图如图3所示:

51单片机基础知识及期末复习

51单片机简答题部分(经典) 1、什么叫堆栈? 答:堆栈是在片内RAM中专门开辟出来的一个区域,数据的存取是以"后进先出"的结构方式处理的。实质上,堆栈就是一个按照"后进先出"原则组织的一段内存区域。 2、进位和溢出? 答:两数运算的结果若没有超出字长的表示范围,则由此产生的进位是自然进位;若两数的运算结果超出了字长的表示范围(即结果不合理),则称为溢出。 3、在单片机中,片内ROM的配置有几种形式?各有什么特点? 答:单片机片内程序存储器的配置形式主要有以下几种形式:(1)掩膜(Msak)ROM型单片机:内部具有工厂掩膜编程的ROM,ROM中的程序只能由单片机制造厂家用掩膜工艺固 化,用户不能修改ROM中的程序。掩膜ROM单片机适合于 大批量生产的产品。用户可委托芯片生产厂家采用掩膜方法 将程序制作在芯片的ROM。 (2)EPROM型单片机:内部具有紫外线可擦除电可编程的只读存储器,用户可以自行将程序写入到芯片内部的EPROM 中,也可以将EPROM中的信息全部擦除。擦去信息的芯片 还可以再次写入新的程序,允许反复改写。 (3)无ROM型单片机:内部没有程序存储器,它必须连接程序存储器才能组成完整的应用系统。 无ROM型单片机价格低廉,用户可根据程序的大小来选择外接 程序存储器的容量。这种单片机扩展灵活,但系统结构较复 杂。 (4)E2ROM型单片机:内部具有电可擦除叫可编程的程序存储器,使用更为方便。该类型目前比较常用 (5)OTP(One Time Programmable)ROM单片机:内部具有一次可编程的程序存储器,用户可以在编程器上将程序写入片内程 序存储器中,程序写入后不能再改写。这种芯片的价格也较 低。 4、什么是单片机的机器周期、状态周期、振荡周期和指令周期?它们之间是什么关系? 答:某条指令的执行周期由若干个机器周期(简称M周期)构成,一个机器周期包含6个状态周期(又称时钟周期,简称S周期),而一个状态周期又包含两个振荡周期(P1和P2,简称P周期)。也就是说,指令执行周期有长有短,但一个机器周期恒等于6个状态周期或12个振荡周

51单片机简易计算器代码

#include"reg52.h" #define uchar unsigned char #define uint unsigned int sbit busy=P0^7; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } char i,j,temp,num; long a,b,c; //a,第一个数b,第二个数c,得数 uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0}; uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0 x2b-0x30}; //按键显示编码表 sbit lcden=P2^2; sbit lcdwrite=P2^1; sbit lcdrs=P2^0; //lcd的写指令 void write_com(uchar com) { lcdrs=0; lcden=0; P0=com; delay(1); lcden=1; delay(1); lcden=0; } //lcd的写数据 void write_date(uchar da) { lcdrs=1; lcden=0; P0=da; delay(1); lcden=1; delay(1); lcden=0; } //初始化

void init() //初始化 { uchar num; num=-1; lcdwrite=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); delay(500);//延时0.5s write_com(0x01); i=0; j=0; a=0; //第一个参与运算的数 b=0; //第二个参与运算的数 c=0; flag=0; //flag表示是否有符号键按下, fuhao=0; // fuhao表征按下的是哪个符号 } void keyscan() // 键盘扫描程序 { P3=0xfe; if(P3!=0xfe) { delay(10); //延迟20ms if(P3!=0xfe) { temp=P3&0xf0; switch(temp) { case 0xe0:num=0; break; case 0xd0:num=1; break; case 0xb0:num=2; break; case 0x70:num=3; break; } } while(P3!=0xfe); if(num==0||num==1||num==2)//如果按下的是'7','8'或'9 { if(j==1)//确认一次计算完毕,清屏 { write_com(0x01);

51单片机实用汇编程序库

51 单片机实用程序库 4、1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮得效果。实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP、ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A;灭所有得灯 MOV A,#11111110B MAIN1: MOV P1,A;开最左边得灯 ACALL DELAY ;延时 RL A ;将开得灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ30H,D1 RET END 4、2 方波输出 程序介绍:P1、0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN、ASM): ORG 0000H MAIN: ;直接利用P1、0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1、0 ACALL DELAY 10 CLR P1、0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5、1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1、o得输出状态改变1 次,以达到定时报警得目得。实际应用例如:定时报警器。 程序实例(DIN1、ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU34H ;时间秒标志,判就是否到50个 0、2 秒,即50*0、2=1 秒 MOVTMOD,#00000001B;定时器0 工作于方式 1 MOVTL0,#0AFH MOV TH0,#3CH ;设定时时间为0、05 秒,定时 20 次则一秒 11 SETB EA;开总中断 SETB ET0;开定时器0 中断允许 SETBTR0 ;开定时0 运行 SETB P1、0 LOOP: AJMP LOOP DIN0: ;就是否到一秒//////////////////////////////////////// INCC:INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPLP1、0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0、05秒,定时 20 次则一秒 RETI END 5、2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期就是1微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 得频率为 例: 200=1/t:推出t=0、005秒,即5000微秒,即一个高电

51单片机常用数码管显示程序

51单片机常用数码管显示程序---之汇编篇 2010-07-21 03:35:46| 分类:单片机| 标签:51单片机数码管汇编程序|字号大中小订阅一)显示数据缓存寄存器70H,71H,72H,73H,74H,75H,76H,77H。 START: MOV 70H,#1 MOV 71H,#2 MOV 72H,#3 MOV 73H,#4 MOV 74H,#5 MOV 75H,#6 MOV 76H,#7 MOV 77H,#8 ACALL DISP AJMP START DISP: MOV R1,#70H MOV R5,#0FEH PLAY: MOV P0,#0FFH MOV A,R5 ANL P2,A

MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A LCALL DL1MS INC R1 MOV A,P2 JNB ACC.7,ENDOUT RL A MOV R5,A MOV P2,#0FFH AJMP PLAY ENDOUT: MOV P2,#0FFH MOV P0,#0FFH RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳数码管 ; 1MS延时子程序,LED显示用 DL1MS: MOV R6,#14H ; DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET END 二)

START:;ORG 00H MOV 70H,#0C0H;0 MOV 71H,#0F9H;1 MOV 72H,#0A4H;2 MOV 73H,#0B0H;3 MOV 74H,#99H ;4 MOV 75H,#92H ;5 MOV 76H,#82H ;6 MOV 77H,#0F8H;7 ACALL DISP AJMP START DISP: MOV P0,70H CLR P2.7 ACALL DL1MS SETB P2.7 MOV P0,71H CLR P2.6 ACALL DL1MS SETB P2.6 MOV P0,72H CLR P2.5 ACALL DL1MS SETB P2.5 MOV P0,73H CLR P2.4 ACALL DL1MS SETB P2.4 MOV P0,74H CLR P2.3 ACALL DL1MS SETB P2.3 MOV P0,75H CLR P2.2 ACALL DL1MS SETB P2.2 MOV P0,76H CLR P2.1 ACALL DL1MS SETB P2.1 MOV P0,77H CLR P2.0 ACALL DL1MS SETB P2.0 RET

51单片机 实现计算器功能

51单片机多为计算器汇编程序 此程序并不仅仅局限于255以内操作 FIR0 EQU 30H FIR1 EQU 31H FIR2 EQU 32H FIR3 EQU 33H ;第一个操作数 SEC0 EQU 34H SEC1 EQU 35H SEC2 EQU 36H SEC3 EQU 37H ; 第二个操作数 LIN0 EQU 38H LIN1 EQU 39H LIN2 EQU 40H LIN3 EQU 41H ; 数据暂存 RES0 EQU 42H RES1 EQU 43H RES2 EQU 44H RES3 EQU 45H ;结果暂存区 XLINE EQU 46H YLINE EQU 47H ;记录按键按键位置 SYMBLE EQU 48H ;操作符存储 DDE0 EQU 49H DDE1 EQU 50H DDE2 EQU 51H ;用于延时 FLEL4 EQU 52H FLEL5 EQU 53H FLEL6 EQU 54H BEFOR EQU 55H HH BIT 01H ;比较大 EE BIT 02H ;比较相等 FIL BIT 03H ;溢出标记 FLAG BIT 04H ;有无按键标记 ERR BIT 05H ;错误标记 YESY BIT 06H ; 有无操作符按键标记

NUM BIT 07H ;按键个数标记 YESN BIT 08H ;有无数字按键标记 ORG 0000H LJMP MAIN ORG 0003H LJMP INTERUPT MAIN: MOV IE,#01H ;初始化 MOV SP,#6FH LCALL CLRI SETB IT0 SETB EA DISPLAY: ;数码管显示函数 CJNE R3,#00H,TT1 MOV R3,#0AH TT1: CJNE R3,#0AH,STARTD CJNE R2,#00H,TT2 MOV R2,#0AH TT2: CJNE R2,#0AH,STARTD CJNE R1,#00H,STARTD MOV R1,#0AH STARTD: MOV A,R0 LCALL TRANS ;将所要显示的值转化为数码管对应的数据 MOV P2,A MOV P1,#10H LCALL DELAY10ms MOV A,R1 LCALL TRANS MOV P2,A MOV P1,#20H LCALL DELAY10ms MOV A,R2 LCALL TRANS MOV P2,A MOV P1,#40H LCALL DELAY10ms

针对常用51单片机下载程序问题做下详解

针对常用51单片机下载程序问题做下详解 目前为止,接触单片机已有不少,从选择元器件、原理图、PCB、电路硬件调试、软件开发也算小有心得。 单片机软件开发里面第一步当属下载程序了,如果这一步都有问题,那么后面的一切便无从谈起,记得当初刚接触单片机时,对于下载电路方法及原理也是一头雾水。好在随着经验的积累以及自己的努力探求,现在对此问题算是有了点点自己的经验理解。故今天在此针对常用51单片机下载程序问题做下详解,以求新手们少走弯路。 原理 单片机的TXD、RXD是TTL电平,所以你得万变不离其宗的将其它信号转成TTL电平,只有这样给单片机下载程序才有可能成功!其中CH340、PL2303等芯片是直接将USB信号转换为TTL电平,而MAX232等芯片是将TTL转换为RS232信号或者将RS232信号转换为TTL.下面请看利用这种原理的两种常用方法: 方法一: 请看图一,这是我们最常见的单片机下载电路了,其中从②到⑥属于大家常用的USB转串口线,用这种方案的好处是,如果自己的PC带有串口(可能很老的机器没有USB接口),那么就可以直接给单片机开发板下载程序,因为采用这种方法的开发板必定带有串口接口嘛。当然,如果PC仅有USB接口而不带串口,那么只能找根USB转串口线了(其电路原理就是图中②到⑥),这里我推荐大家使用采用CH340芯片的USB转串口线,而不要采用PL2303的USB转串口线,因为PL2303价钱便宜所以山寨的水货较多,这会导致下载电路不稳定,甚至无法正常下载。同时此方案的坏处是电路板上必定要做一个9针串口接口(太巨大了),这必将增加了电路PCB的面积,当然也就增加了成本啦!(顺便发表下个人见解:那个9针接口实在太丑,又大又重,无形中便降低了自己的设计档次,哈哈。所以不推荐这种方法!) 请看图二,这是我经常采用的单片机下载电路。实践证明效果非常好,几乎没出过任何问

小只推荐:51单片机知识大汇总看你了解有多少

小只推荐:51单片机知识大汇总看你了解有多少 基于51单片机的函数信号发生器利用单片机AT89C52 采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A 转换器DAC0832 将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz 的波形。下面就对51单片机进行详细论述。 ? ?1.取指译码执行模型:首先我们来看看单片机是如何工作的,我们拿电脑的主板来作为对比,我们买电脑时,总是追求处理器的主频。处理器的工作原理是从存储器上取出一条指令,然后对指令译码,译码完后执行。然后取下一条指令,译码,执行。它为什幺能这幺有序的工作?是因为它有一个工作时钟,在这个工作时钟的统一管理下,处理器有序的工作,这里的主频就是工作时钟的速度,当然,现在你可能也知道主频越高,取指译码速度越快,性能越好。那幺你可能会问,这跟51单片机有什幺关系,OK,切入正题,单片机的工作也是这个原理,从存储器上取指,译码,执行。但是单片机的存储器在哪?在单片机的内部,对于电脑来说,是把处理器,内存集中在一块主板上。而现在你应该很明确,对于单片机它就相当于一块电脑主板,把处理器,存储器集中到一块芯片内部。从这个宏观的角度看,所有的单片机是不是都是一个原理,服从于取指,译码,执行的基本模型。OK,继续…… 2. 51单片机的外设:我们在学习单片机时,所做的第一个实验都是一样的,点灯。也许你已经学会了用单片机做出好看的花样灯,或者用单片机驱动数码管显示出数字或字母。或者可以检测按键了。不错,我们仔细想想这些是什幺,无非,你就是控制那一排排引脚输出高低电平,我们称这些引脚叫I/O口,输入输出,按键是输入,点灯是输出。其实你以为你学了三样东

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

相关文档
相关文档 最新文档