ADXL345直接输出角度值C51程序

ADXL345直接输出角度值C51程序
ADXL345直接输出角度值C51程序

好的开始时成功的一半

——ADXL345测角度

一、硬件准备

杜邦线 5.1K电阻

最小单片机系统(P1带上拉电阻)89C51

GY-29-ADXL345加速度计1602液晶显示器

二、程序

在最后!

三、电气连接

这个连接时对ADXL345不熟的非常有用

四、测试

效果图

后记:

发现网上有许多的关于测角度的资料都不是很全,在这里总结一下。

人人为我,我为人人!

程序:

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

* 文件名:GY-29 ADXL345 测角度,角度值显示

* 创建人:飞翔的猫

* 描述: 该文件实现了用GY-29 ADXL345角度的采集,并在数码管上显示出来。

使用单片机STC89C51

*晶振:11.0592M

*显示:LCD1602

*编译环境:Keil uVision4

*时间:2013年8月13日

*QQ :361301011

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

#include

#include //Keil library

#include //Keil library

#include

#define uchar unsigned char

#define uint unsigned int

#define DataPort P0 //LCD1602数据端口

sbit SCL=P1^0; //IIC时钟引脚定义

sbit SDA=P1^1; //IIC数据引脚定义

sbit LCM_RS=P2^0; //LCD1602命令端口

sbit LCM_RW=P2^1; //LCD1602命令端口

sbit LCM_EN=P2^2; //LCD1602命令端口

#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改

//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A

typedef unsigned char BYTE;

typedef unsigned short WORD;

BYTE BUF[8]; //接收数据缓存区

uchar ge,shi,bai,qian,wan; //显示变量

int dis_data; //变量

int data_xyz[3];

void delay(unsigned int k);

void InitLcd(); //初始化lcd1602

void Init_ADXL345(void); //初始化ADXL345

void WriteDataLCM(uchar dataW);

void WriteCommandLCM(uchar CMD,uchar Attribc);

void DisplayOneChar(uchar X,uchar Y,uchar DData);

void conversion(uint temp_data);

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据

void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据

//------------------------------------

void Delay5us();

void Delay5ms();

void ADXL345_Start();

void ADXL345_Stop();

void ADXL345_SendACK(bit ack);

bit ADXL345_RecvACK();

void ADXL345_SendByte(BYTE dat);

BYTE ADXL345_RecvByte();

void ADXL345_ReadPage();

void ADXL345_WritePage();

//-----------------------------------

//********************************************************* void conversion(uint temp_data)

{

wan=temp_data/10000+0x30 ;

temp_data=temp_data%10000; //取余运算

qian=temp_data/1000+0x30 ;

temp_data=temp_data%1000; //取余运算

bai=temp_data/100+0x30 ;

temp_data=temp_data%100; //取余运算

shi=temp_data/10+0x30 ;

temp_data=temp_data%10; //取余运算

ge=temp_data+0x30;

}

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

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i

{

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

{;}}

}

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

void WaitForEnable(void)

{

DataPort=0xff;

LCM_RS=0;LCM_RW=1;_nop_();

LCM_EN=1;_nop_();_nop_();

while(DataPort&0x80);

LCM_EN=0;

}

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

void WriteCommandLCM(uchar CMD,uchar Attribc)

{

if(Attribc)WaitForEnable();

LCM_RS=0;LCM_RW=0;_nop_();

DataPort=CMD;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

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

void WriteDataLCM(uchar dataW)

{

WaitForEnable();

LCM_RS=1;LCM_RW=0;_nop_();

DataPort=dataW;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

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

void InitLcd() //液晶显示器的设置

{

WriteCommandLCM(0x38,1);

WriteCommandLCM(0x08,1);

WriteCommandLCM(0x01,1);

WriteCommandLCM(0x06,1);

WriteCommandLCM(0x0c,1);

}

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

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

Y&=1;

X&=15;

if(Y)X|=0x40;

X|=0x80;

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

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

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数

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

void Delay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

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

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

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

void Delay5ms()

{

WORD n = 560;

while (n--);

}

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

起始信号

**************************************/ void ADXL345_Start()

{

SDA = 1; //拉高数据线SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 0; //产生下降沿Delay5us(); //延时

SCL = 0; //拉低时钟线}

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

停止信号

**************************************/ void ADXL345_Stop()

{

SDA = 0; //拉低数据线SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 1; //产生上升沿Delay5us(); //延时

}

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

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/ void ADXL345_SendACK(bit ack)

{

SDA = ack; //写应答信号SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

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

接收应答信号

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

bit ADXL345_RecvACK()

{

SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = SDA; //读应答信号

SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

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

向IIC总线发送一个字节数据

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

void ADXL345_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i<8; i++) //8位计数器

{

dat <<= 1; //移出数据的最高位

SDA = CY; //送数据口

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

ADXL345_RecvACK();

}

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

从IIC总线接收一个字节数据

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

BYTE ADXL345_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器

{

dat <<= 1;

SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}

//******单字节写入*******************************************

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)

{

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页

ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页

ADXL345_Stop(); //发送停止信号

}

//********单字节读取*****************************************

uchar Single_Read_ADXL345(uchar REG_Address)

{ uchar REG_data;

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号

REG_data=ADXL345_RecvByte(); //读出寄存器数据

ADXL345_SendACK(1);

ADXL345_Stop(); //停止信号

return REG_data;

}

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

//

//连续读出ADXL345内部加速度数据,地址范围0x32~0x37

//

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

void Multiple_read_ADXL345(void)

{ uchar i;

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号

for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF

{

BUF[i] = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据

if (i == 5)

{

ADXL345_SendACK(1); //最后一个数据需要回NOACK }

else

{

ADXL345_SendACK(0); //回应ACK

}

}

ADXL345_Stop(); //停止信号

Delay5ms();

}

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

//初始化ADXL345,根据需要请参考pdf进行修改************************

void Init_ADXL345()

{

Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式

Single_Write_ADXL345(0x2C,0x08); //速率设定为12.5 参考pdf13页

Single_Write_ADXL345(0x2D,0x08); //选择电源模式参考pdf24页

Single_Write_ADXL345(0x2E,0x80); //使能DATA_READY 中断

Single_Write_ADXL345(0x1E,0x00); //X 偏移量根据测试传感器的状态写入

pdf29页

Single_Write_ADXL345(0x1F,0x00); //Y 偏移量根据测试传感器的状态写入

pdf29页

Single_Write_ADXL345(0x20,0x05); //Z 偏移量根据测试传感器的状态写入

pdf29页

}

//*********************************************************************** //显示x轴

void display_x()

{ float temp;

dis_data=(BUF[1]<<8)+BUF[0]; //合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(2,0,'-'); //显示正负符号位

}

temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据

DisplayOneChar(0,0,'X'); //第0行,第0列显示X

DisplayOneChar(1,0,':');

DisplayOneChar(3,0,qian);

DisplayOneChar(4,0,'.');

DisplayOneChar(5,0,bai);

DisplayOneChar(6,0,shi);

DisplayOneChar(7,0,'g');

}

//*********************************************************************** //显示y轴

void display_y()

{ float temp;

dis_data=(BUF[3]<<8)+BUF[2]; //合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(2,1,'-'); //显示正负符号位

}

else DisplayOneChar(2,1,' '); //显示空格

temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据

DisplayOneChar(0,1,'Y'); //第1行,第0列显示y

DisplayOneChar(1,1,':');

DisplayOneChar(3,1,qian);

DisplayOneChar(4,1,'.');

DisplayOneChar(5,1,bai);

DisplayOneChar(6,1,shi);

DisplayOneChar(7,1,'g');

}

//*********************************************************************** //显示z轴

void display_z()

{ float temp;

dis_data=(BUF[5]<<8)+BUF[4]; //合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(10,1,'-'); //显示负符号位

}

temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据

/*

DisplayOneChar(10,0,'Z'); //第0行,第10列显示Z

DisplayOneChar(11,0,':');

DisplayOneChar(11,1,qian);

DisplayOneChar(12,1,'.');

DisplayOneChar(13,1,bai);

DisplayOneChar(14,1,shi);

DisplayOneChar(15,1,'g');

*/

}

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

//******主程序********

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

void main()

{

uchar devid;

float Roll,Pitch,Q,T,K;

delay(500); //上电延时

InitLcd(); //液晶初始化ADXL345

Init_ADXL345(); //初始化ADXL345

devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确

while(1) //循环

{

Init_ADXL345(); //初始化ADXL345

Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中

data_xyz[0]=(BUF[1]<<8)+BUF[0]; //合成数据

data_xyz[1]=(BUF[3]<<8)+BUF[2]; //合成数据

data_xyz[2]=(BUF[5]<<8)+BUF[4]; //合成数据

//分别是加速度X,Y,Z的原始数据,10位的

Q=(float)data_xyz[0]*3.9;

T=(float)data_xyz[1]*3.9;

K=(float)data_xyz[2]*3.9;

Q=-Q;

Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180); //X轴角度值

Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180); //Y轴角度值

conversion(Roll); //转换出显示需要的数据X轴,或者Y轴DisplayOneChar(9,1,'A');

DisplayOneChar(10,1,':');

DisplayOneChar(11,1,bai);

DisplayOneChar(12,1,shi);

DisplayOneChar(13,1,ge);

delay(200); //延时

}

}

51单片机流水灯C语言源代码

#include #include #define uint unsigned int #define uchar unsigned char uchar z=50,e=0x00,f=0xff; uchar code table1[]={ 0x80,0xc0,0xe0,0xf0, 0xf8,0xfc,0xfe,0xff}; uchar code table2[]={ 0x7f,0x3f,0x1f,0x0f, 0x07,0x03,0x01,0x00}; uchar code table3[]={ 0x01,0x03,0x07,0x0f, 0x1f,0x3f,0x7f,0xff}; uchar code table4[]={ 0xe7,0xdb,0xbd,0x7e, 0xbd,0xdb,0xe7,0xff}; uchar code table5[]={ 0xe7,0xc3,0x81,0x00, 0x81,0xc3,0xe7,0xff}; uchar code table6[]={ 0x7e,0x3c,0x18,0x00, 0x18,0x3c,0x7e,0xff}; void delay(uchar); void lsd1(); void lsd2(); void lsd3(); void lsd4(); void lsd5(); void lsd6(); void lsd7(); void lsd8(); void lsd9(); void lsd10(); void lsd11(); void lsd12(); main() { while(1) { lsd1(); lsd2(); lsd3(); lsd4();

单片机c语言编程控制流水灯

说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。那个单片机究竟有什么 功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^) 我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机 上接上最少的外围电路元件让单片机工作。一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。 #include //头文件定义。或用#include其具体的区别在于:后者定义了更多的地址空间。 //在Keil安装文件夹中,找到相应的文件,比较一下便知! sbit P1_0 = P1 ^ 0; //定义管脚 void main (void) { while(1) { P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效 } } 就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。因为我们把LED的正通过电阻接至VCC。 P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。那么这样就能达到了我们预先的要求了。 while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。如果我们要试着点亮其他的LED,也类似上述语句。这里就不再讲了。 点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其 实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。假设我们有8个LED分别接在P1口的8个引脚上。硬件连接,在 P1_1--P1_7上再接7个LED即可。例程如下: #include sbit P1_0 = P1 ^ 0; sbit P1_1 = P1 ^ 1; sbit P1_2 = P1 ^ 2; sbit P1_3 = P1 ^ 3; sbit P1_4 = P1 ^ 4; sbit P1_5 = P1 ^ 5; sbit P1_6 = P1 ^ 6; sbit P1_7 = P1 ^ 7; void Delay(unsigned char a) { unsigned char i; while( --a != 0) {

最经典的51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计 开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 程序A: ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 程序B: ;用移位方式实现流水灯

ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main: mov a,#0feh ;给A赋值成11111110 loop: mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay: mov r3,#20 ;最外层循环二十次 d1: mov r4,#80 ;次外层循环八十次 d2: mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S djnz r4,d2 djnz r3,d1 ret end 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。 ORG 0 ;程序从0地址开始 START: MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容 RR A ;让ACC的内容左移 CALL DELAY ;调用延时子程序 LJMP LOOP ;跳到LOOP处执行 ;0.1秒延时子程序(12MHz晶振)=================== DELAY: MOV R7,#200 ;R7寄存器加载200次数 D1: MOV R6,#250 ;R6寄存器加载250次数 DJNZ R6,$ ;本行执行R6次 DJNZ R7,D1 ;D1循环执行R7次 RET ;返回主程序

用单片机控制的LED流水灯设计(电路、程序全部给出)

1.引言 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C51单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。 2.硬件组成 按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATM EL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz 工作频率,使用AT89C51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。其具体硬件组成如图1所示。 图1 流水灯硬件原理图 从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要

最新五种编程方式实现流水灯的单片机c程序讲课教案

五种编程方式实现流水灯的单片机C程序 //功能:采用顺序结构实现的流水灯控制程序 /*此方式中采用的是字操作(也称为总线操作)*/ #include void delay(unsigned char i); //延时函数声明 void main() //主函数 { while(1) { P1 = 0xfe; //点亮第1个发光二极管,0.000389s delay(200); //延时 P1 = 0xfd; //点亮第2个发光二极管,0.155403s,0.1558 delay(200); //延时 P1 = 0xfb; //点亮第3个发光二极管 delay(200); //延时 P1 = 0xf7; //点亮第4个发光二极管 delay(200); //延时 P1 = 0xef; //点亮第5个发光二极管 delay(200); //延时 P1 = 0xdf; //点亮第6个发光二极管 delay(200); //延时 P1 = 0xbf; //点亮第7个发光二极管 delay(200); //延时 P1 = 0x7f; //点亮第8个发光二极管 delay(200); //延时 } } //函数名:delay //函数功能:实现软件延时 //形式参数:unsigned char i; // i控制空循环的外循环次数,共循环i*255次 //返回值:无 void delay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{ unsigned char j, k; //定义无符号字符型变量j和k for(k = 0; k < i; k++) //双重for循环语句实现软件延时 for(j = 0; j < 255; j++); } //功能:采用循环结构实现的流水灯控制程序 //此方式中采用的移位,按位取反等操作是位操作 #include //包含头文件REG51.H void delay(unsigned char i); //延时函数声明 void main() //主函数

单片机流水灯C语言源程序

单片机流水灯C语言源程序 标题:51单片机流水灯C语言源程序2008-12-06 08:43:05 ************************************************************** 文件名称:flash_led.c 文件说明:流水灯C程序 编写日期:2006年10月5日 程序说明:MCU采用AT89S51,外接12M晶振,P1口输出 *************************************************************/ #include //51系列单片机定义文件 #define uchar unsigned char //定义无符号字符 #define uint unsigned int //定义无符号整数 void delay(uint); //声明延时函数 void main(void) { uint i; uchar temp; while(1) { temp=0x01; for(i=0;i<8;i++) //8个流水灯逐个闪动 { P1=~temp; delay(100); //调用延时函数 temp<<=1; } temp=0x80; for(i=0;i<8;i++) //8个流水灯反向逐个闪动 { P1=~temp; delay(100); //调用延时函数 temp>>=1; } temp=0xFE; for(i=0;i<8;i++) //8个流水灯依次全部点亮 { P1=temp; delay(100); //调用延时函数 temp<<=1; }

基于51单片机的流水灯设计说明

基于51单片机的流水灯设计 一.基本功能 利用AT89c51作为主控器组成一个LED流水灯系统,实现8个LED 灯的左、右循环显示。 二.硬件设计 图1.总设计图

1.单片机最小系统 1.1选用AT89C51的引脚功能 图2. AT89C51 XTAL1:单芯片系统时钟的反向放大器输入端。 XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。 RESET:重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得部特殊功能寄存器容均被设成已知状态。 P3:端口3是具有部提升电路的双向I/O端口,通过控制各个端口的高低电平了实现LED流水灯的控制。

1.2复位电路 如图所示,当按下按键时,就能完成整个系统的复位,使得程序从新运行。 图3.复位电路 1.3时钟电路 时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。 在AT89C51芯片部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。此电路采用12MHz的石英晶体。

图4.时钟电路 2.流水灯部分 图5.流水灯电路 三.软件设计 3.1编程语言及编程软件的选择 本设计选择C语言作为编程语言。C语言虽然执行效率没有汇编语言

51单片机 流水灯 ~ 花样灯 程序

单片机为89c52 晶振为11.0592, /***此程序为流水灯*** / #include #include #define uchar unsigned char //宏定义 #define uint unsigned int uchar led; void delay(uint z) //延时子函数体 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { led=0xfe; //赋初值 while(1) { P1=led; //点亮第一个小灯 delay(100); //延时100毫秒 led=_crol_(led,1); 将led的变量左移给下一位} }

/*8个发光管间隔200ms由上至下,返回再由上至下,一个个往下亮,后全亮由下至上,返回再由下至上,一个个往下亮,后全亮 再重复2次, 然后全部熄灭再以500ms间隔 全部闪烁3次。重复此过程*/ #include #include #define uchar unsigned char #define uint unsigned int uchar led; uint i,j; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { while(1) { for(j=0;j<2;j++) { led=0xfe; //赋初值 for(i=0;i<8;i++) { P1=led; //点亮第一个小灯 delay(200); //延时200毫秒 led=_crol_(led,1); //将led变量循环左移给下一位 } led=0xfe; //赋初值 for(i=0;i<8;i++) { P1=led; //点亮第一个小灯 delay(200); //延时200毫秒 led<<=1; //左移给下一位 } led=0x7f; //赋初值

51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计 流水灯汇编程序 8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250ms PUSH PSW ;现场保护指令(有时可以不加) MOV R4,#2 L3: MOV R2 ,#00H L1: MOV R3 ,#00H L2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END

51单片机汇编程序集(二) 2008年12月12日星期五 10:27 辛普生积分程序 内部RAM数据排序程序(升序) 外部RAM数据排序程序(升序) 外部RAM浮点数排序程序(升序) BCD小数转换为二进制小数(2位) BCD小数转换为二进制小数(N位) BCD整数转换为二进制整数(1位) BCD整数转换为二进制整数(2位) BCD整数转换为二进制整数(3位) BCD整数转换为二进制整数(N位) 二进制小数(2位)转换为十进制小数(分离BCD码) 二进制小数(M位)转换为十进制小数(分离BCD码) 二进制整数(2位)转换为十进制整数(分离BCD码) 二进制整数(2位)转换为十进制整数(组合BCD码) 二进制整数(3位)转换为十进制整数(分离BCD码) 二进制整数(3位)转换为十进制整数(组合BCD码) 二进制整数(M位)转换为十进制整数(组合BCD码) 三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;二进制整数(2位)转换为十进制整数(分离BCD码) ;入口: R3,R4 ;占用资源: ACC,R2,NDIV31 ;堆栈需求: 5字节 ;出口: R0,NCNT IBTD21 : MOV NCNT,#00H MOV R2,#00H IBD211 : MOV R7,#0AH LCALL NDIV31 MOV A,R7 MOV @R0,A INC R0 INC NCNT MOV A,R3 ORL A,R4 JNZ IBD211 MOV A,R0 CLR C SUBB A,NCNT MOV R0,A RET ;二进制整数(2位)转换为十进制整数(组合BCD码) ;入口: R3,R4 ;占用资源: ACC,B,R7 ;堆栈需求: 3字节 ;出口: R0

51单片机流水灯 程序

1.第一个发光管以间隔200ms闪烁。 2. 8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms。 3. 8个发光管来回流动,第个管亮100ms。 4. 用8个发光管演示出8位二进制数累加过程。 5. 8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。重复此过程。 6. 间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。 7. 间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。 1 #include #define uint unsigned int sbit led1=P1^0; void delay(); void main() { while(1) { led1=0; delay(); led1=1; delay(); } } void delay() { uint x,y; for(x=200;x>0;x--) for(y=100;y>0;y--); } 2

#include #include #define uint unsigned int #define uchar unsigned char sbit p1=P1^0; uchar a; void delay(); void main() { a=0xfe; P1=a; while(1) { a=_crol_(a,1); delay(); P1=a; delay(); } } void delay() { uint b; for(b=55000;b>0;b--); } 3 #include #include #define uint unsigned int #define uchar unsigned char void delay() { uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--); } void main() { uchar a,i; while(1)

基于51单片机心形流水灯C语言源程序

#include unsigned int x,y; void delayms(unsigned int z) //延时 { unsigned int i,j; for(i=z;i>0;i--) for(j=150;j>0;j--); } void On_all() //开启所有灯 { P0=0x00; P1=0x00; P2=0x00; P3=0x00; } void Off_all()//关闭所有灯 { P0=0xff; P1=0xff; P2=0xff; P3=0xff; } void ls()//正向流水灯 {

P2=0x00; delayms(400); P3=0x00; delayms(400); P1=0x00; delayms(400); P0=0x01; delayms(50); P0=0x02; delayms(50); P0=0x04; delayms(50); P0=0x08; delayms(50); P0=0x10; delayms(50); P0=0x20; delayms(50); P0=0x40; delayms(50); P0=0x80; delayms(50); P0=0x00; P2=0x01; delayms(50); P2=0x02; delayms(50); P2=0x04; delayms(50); P2=0x08; delayms(50); P2=0x10; delayms(50);

P2=0x40; delayms(50); P2=0x80; delayms(50); P2=0x00; P3=0x80; delayms(50); P3=0x40; delayms(50); P3=0x20; delayms(50); P3=0x10; delayms(50); P3=0x08; delayms(50); P3=0x04; delayms(50); P3=0x02; delayms(50); P3=0x01; delayms(50); P3=0x00; P1=0x80; delayms(50); P1=0x40; delayms(50); P1=0x20; delayms(50); P1=0x10; delayms(50); P1=0x08; delayms(50);

基于单片机c语言控制的流水灯程序设计及proteus仿真图

基于单片机(c语言控制的)流水灯程序设计及proteus仿真图

————————————————————————————————作者:————————————————————————————————日期:

89c51与8个发光二极管相连流水控制一、不同花样的控制源程序代码: /*#include #define uchar unsigned char; uchar ledtab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(int n) {while(n--);} main() { int i; while(1) { for(i=0;i<8;i++) { P1=ledtab[i]; delay(20000); } //1~8号灯依次闪烁 for(i=0;i<8;i++) { P1=ledtab[7-i]; delay(2000); } // 8~1号灯依次闪烁 } } */ /*#include #include #define uint unsigned int #define uchar unsigned char void delay(uint z); void main() { uint i; uchar a; P1=0xfe; while(1) { a=P1; for(i=1;i<=10;i++) {delay(300); P1=0xff; delay(300);

P1=a; } P1=_crol_(P1,1); } } void delay(uint z) {uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } */ //依次闪烁10次后,循环点亮 /* #include #include #define uint unsigned int void delay(uint z); void main() { while(1){ P1=0xf0; delay(1000); P1=0x0f; delay(1000); } } void delay(uint z) {uint x,y; for(x=z;x>0;x--) for(y=125;y>0;y--); } */ //4个一组,每隔0.5秒交替闪烁点亮二、总体的连线图(proteus)

STC89C52单片机花样流水灯C语言程序

花样流水灯程序 #include #define uint unsigned int #define uchar unsigned char uchar num; uchar code table[]={ 0xaa,~0xaa,0x7e,0xbd,0xdb, 0xe7,0xf3,0xf9,0xfc,0xfa, 0xf6,0xee,0xde,0xbe,0x7e, 0xbe,0xde,0xee,0xf6,0xfa, 0xfc,0xf0,0xc0,0x0,0x5f,0xaf,0xd7,0xeb,0xf5,0xfa,0xff}; void delayms(uint); void main() { while(1) { for(num=0;num<31;num++) { P2=table[num]; delayms(200); } P2=0x7f; delayms(40); P2=0x3f; delayms(80); P2=0x1f; delayms(130); P2=0x0f; delayms(190); P2=0x07; delayms(260); P2=0x03; delayms(240); P2=0x01; delayms(330); P2=0x00;

delayms(430); for(num=0;num<31;num++) { P2=table[num]; delayms(100); } P2=0x7f; delayms(40); P2=0x3f; delayms(50); P2=0x1f; delayms(70); P2=0x0f; delayms(100); P2=0x07; delayms(140); P2=0x03; delayms(190); P2=0x01; delayms(250); P2=0x00; delayms(320); } } void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } 我是新手,大神勿喷(∩_∩)

基于51单片机的各种花样的流水灯c51程序

基于51单片机的各种花样的流水灯c51程序 /*-----------------------------------------------功能:流水灯对称移动闪烁(双闪 烁) ------------------------------------------------*/ #includeREG52.H#define uint unsigned intvoid delay(uint);main(){ uint comp1=0xfe; uint comp2=0x80; P1=0x7e; delay(30000); while(1) { P1=0xff; comp1=1; comp1|=0x01; comp2=1; P1=comp1; P1–comp2; delay(30000); if(P1==0xe7) { comp1=1; comp1|=0x01; comp2=1; } if(comp1==0x7f) { comp1=0xfe; comp2=0x80; } } }void delay(uint cnt){ while(cnt--); } /*----------------------------------------------------------------- 只循环一次,而没有一直循环下去,出错地方在: 通过添加一条测试语句: if(comp1==0x7f) { comp1=0xfe; comp2=0x80; P1=0x00; delay(30000); } 发现if 语句没有被执行,自然继续左右移动: 1111 11111111 1111 0000==11111 1111 所以看起来是执行了一次while 中的代码。 具体为什么不行,还不清楚 更正下列代码后,能够实现功能。 if(P1==0x7e) { comp1=0xfe; comp2=0x80; } 或者: if(comp2==0x01) { comp1=0xfe; comp2=0x80; }

基于89C51单片机流水灯汇编程序

基于89C51单片机流水灯实验程序 实验功能说明 本实验中主要应用单片机的端口操作及延时(通过定时器0的查询方式来延时)循环程序。首先需要知道如何让一个发光二极管工作,其它说明及原理图请参考实验1, 二、实验源程序 /*******************************************************/ #include #include void delay(unsigned int); //声明延时函数 /********************** main******************************/ main() { unsigned char k,temp,temp1;//设置变量 P1= 0xff; TMOD = 0x01;//设置定时器方式为定时器方式1 while (1) { temp = 0x01; //L1到L8二极管顺序点亮 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp<<1; } temp = 0x80; //L8到L1二极管顺序点亮 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp>>1; } temp = 0xfe;//L8L1到L7L2到L6L3到L5L4顺序点亮 temp1 = 0x7f; for(k=0;k<8;k++) { P1 =(_cror_(temp,k))&(_crol_(temp1,k)); delay(50); } P1 = 0xFF; delay(200); temp = 0xFE; //L8到L1二极管顺序点亮 for(k=0;k<8;k++) { P1 = temp; delay(50); temp = temp<<1; } temp = 0x7F; //L1到L8二极管顺序熄灭 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp>>1; } } } /*********************************************************************************************/ /* 函数名: delay*****************************************************************************/ /* 功能描述: 延时*****************************************************************************/ /* 调用函数: 无******************************************************************************/ /* 入口参数: t*********************************************************************************/ /* 出口参数:无******************************************************************************/

stc89c51单片机流水灯程序

51单片机流水灯程序 程序一(用C语言编的最基础的程序) #include #include sbit D0=P1^0;//位定义,把P1口的第一个管脚定义为D0 sbit D1=P1^1;// 位定义,把P1口的第二个管脚定义为D1 sbit D2=P1^2;// 位定义,把P1口的第3个管脚定义为D2 sbit D3=P1^3;// 位定义,把P1口的第4个管脚定义为D3 sbit D4=P1^4;// 位定义,把P1口的第5个管脚定义为D4 sbit D5=P1^5;// 位定义,把P1口的第6个管脚定义为D5 sbit D6=P1^6;// 位定义,把P1口的第7个管脚定义为D6 sbit D7=P1^7;// 位定义,把P1口的第8个管脚定义为D7 void main() { while(1)//建立大的死循环。 { unsigned int i,j; D0=0,D7=1;//亮灯1,关灯8 for(i=50;i>0;i--) for(j=200;j>0;j--);//两个FOR组成的延时 D0=1,D1=0;// 亮灯2,关灯1 for(i=50;i>0;i--) for(j=200;j>0;j--); D1=1,D2=0; for(i=50;i>0;i--) for(j=200;j>0;j--); D2=1,D3=0; for(i=50;i>0;i--) for(j=200;j>0;j--); D3=1,D4=0; for(i=50;i>0;i--) for(j=200;j>0;j--); D4=1,D5=0; for(i=50;i>0;i--) for(j=200;j>0;j--); D5=1,D6=0; for(i=50;i>0;i--) for(j=200;j>0;j--); D6=1,D7=0; for(i=50;i>0;i--) for(j=200;j>0;j--); }

单片机32个IO口流水灯C程序

单片机32个IO口流水灯C程序(转)2008-11-23 11:37/**************************************** ******************** *89C51、S51单片机32个IO口流水灯测试程序 *Flash0、1、2、3分别对应单片机的P0、1、2、3四个口 *a程序对应流水灯从全灭到一个一个亮 *b程序对应流水灯从全亮到一个一个灭 *Author:大灵通 *2006-7-26 10:57,OK! ********************************************** ***************/ #include #include #include #define uchar unsigned char #define uint unsigned int #define TimeDelay 60000 void delay(uint n); void Flash0a(void); void Flash0b(void); void Flash1a(void);

void Flash1b(void); void Flash2a(void); void Flash2b(void); void Flash3a(void); void Flash3b(void); /********************************************* *************** *Function: 主函数 *parameter: *Return: *Modify: ********************************************** ***************/ void main(void) { while(1) { Flash1b(); Flash1a(); delay(TimeDelay); delay(TimeDelay); Flash0b();

相关文档
最新文档