基于STC12C5A60S2的ADXL345程序

基于STC12C5A60S2的ADXL345程序
基于STC12C5A60S2的ADXL345程序

基于STC12C5A60S2的ADXL345Z程序(12T单片机未测试)

头文件I2C.h

#ifndef __I2C_H_

#define __I2C_H_

#include

//---重定义关键词---//

#ifndef uchar

#define uchar unsigned char

#endif

#ifndef uint

#define uint unsigned int

#endif

//--定义使用的IO口--//

sbit I2C_SCL = P0^2;

sbit I2C_SDA = P0^1;

//--声明全局变量--//

void I2C_Delay10us();

void I2C_Start();

void I2C_Stop();

uchar I2C_SendByte(uchar dat, uchar ack);

// uchar I2C_ReadByte();

uchar I2C_ReadByte(uchar ack);

void I2C_Ack(void);

void I2C_NAck(void);

#endif

源文件I2C.c

#include "i2c.h"

void I2C_Delay10us() //@12.000MHz

{

unsigned char i;

i = 12;

while (--i);

}

void I2C_Start()

{

I2C_SDA = 1;

I2C_Delay10us();

I2C_SCL = 1;

I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us

I2C_SDA = 0;

I2C_Delay10us();//保持时间是>4us

I2C_SCL = 0;

I2C_Delay10us();

}

void I2C_Stop()

{

I2C_SDA = 0;

I2C_Delay10us();

I2C_SCL = 1;

I2C_Delay10us();//建立时间大于4.7us

I2C_SDA = 1;

I2C_Delay10us();

}

uchar I2C_SendByte(uchar dat, uchar ack)

{

uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。

for(a=0; a<8; a++)//要发送8位,从最高位开始

{

I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA 信号

dat = dat << 1;

I2C_Delay10us();

I2C_SCL = 1;

I2C_Delay10us();//建立时间>4.7us

I2C_SCL = 0;

I2C_Delay10us();//时间大于4us

}

I2C_SDA = 1;

I2C_Delay10us();

I2C_SCL = 1;

while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低

{

b++;

if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束

{

I2C_SCL = 0;

I2C_Delay10us();

return 0;

}

}

I2C_SCL = 0;

I2C_Delay10us();

return 1;

}

uchar I2C_ReadByte(unsigned char ack)

{

uchar a = 0,dat = 0;

I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0 I2C_Delay10us();

for(a=0; a<8; a++)//接收8个字节

{

I2C_SCL = 1;

I2C_Delay10us();

dat <<= 1;

dat |= I2C_SDA;

I2C_Delay10us();

I2C_SCL = 0;

I2C_Delay10us();

}

if(!ack)

I2C_NAck();

else

I2C_Ack();

return dat;

}

void I2C_Ack(void)

{

I2C_SCL=0;

I2C_SDA=0;

I2C_Delay10us();

I2C_SCL=1;

I2C_Delay10us();

I2C_SCL=0;

}

//不产生ACK应答

void I2C_NAck(void)

{

I2C_SCL=0;

I2C_SDA=1;

I2C_Delay10us();

I2C_SCL=1;

I2C_Delay10us();

I2C_SCL=0;

}

头文件ADXL345Z.h

#ifndef _ADXL345Z_H

#define _ADXL345Z_H

#include

#include "i2c.h"

#ifndef u8

#define u8 unsigned char

#endif

#ifndef u16

#define u16 unsigned int

#endif

#define DEVICE_ID 0X00 //器件ID,0XE5 #define THRESH_TAP 0X1D //敲击阀值

#define OFSX 0X1E

#define OFSY 0X1F

#define OFSZ 0X20

#define DUR 0X21

#define Latent 0X22

#define Window 0X23

#define THRESH_ACK 0X24

#define THRESH_INACT 0X25

#define TIME_INACT 0X26

#define ACT_INACT_CTL 0X27

#define THRESH_FF 0X28

#define TIME_FF 0X29

#define TAP_AXES 0X2A

#define ACT_TAP_STA TUS 0X2B

#define BW_RATE 0X2C

#define POWER_CTL 0X2D

#define INT_ENABLE 0X2E

#define INT_MAP 0X2F

#define INT_SOURCE 0X30

#define DATA_FORMA T 0X31

#define DATA_X0 0X32

#define DATA_X1 0X33

#define DATA_Y0 0X34

#define DATA_Y1 0X35

#define DATA_Z0 0X36

#define DATA_Z1 0X37

#define FIFO_CTL 0X38

#define FIFO_STATUS 0X39

//用户配置,跟硬件电路有关,VDD-IO接高电平则为此地址,接地请查看数据手册

#define ADXL_READ 0X3B

#define ADXL_WRITE 0X3A

u8 ADXL345_Init(void); //初始化ADXL345

void ADXL345_WR_Reg(u8 addr,u8 val); //写ADXL345寄存器

u8 ADXL345_RD_Reg(u8 addr); //读ADXL345寄存器

void ADXL345_RD_XYZ(short *x,short *y,short *z); //读取一次值

void ADXL345_RD_Avval(short *x,short *y,short *z); //读取平均值

void ADXL345_AUTO_Adjust(char *xval,char *yval,char *zval);//自动校准

void ADXL345_Read_Average(short *x,short *y,short *z,u8 times);//连续读取times次,取平均short ADXL345_Get_Angle(float x,float y,float z,u8 dir);

void Adxl_Show_Num(u16 x,u16 y,short num,u8 mode);

#endif

源文件ADXL345Z.c

#include "ADXL345Z.h"

#include "OLED.h"

#include

u8 ADXL345_Init(void)

{

u8 temp=ADXL345_RD_Reg(DEVICE_ID);

if(temp==0xe5) //读取器件ID

{

ADXL345_WR_Reg(DATA_FORMA T,0X2B); //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程

ADXL345_WR_Reg(BW_RATE,0x0A); //数据输出速度为100Hz

ADXL345_WR_Reg(POWER_CTL,0x28); //链接使能,测量模式

ADXL345_WR_Reg(INT_ENABLE,0x00); //不使用中断

ADXL345_WR_Reg(OFSX,0x00);

ADXL345_WR_Reg(OFSY,0x00);

ADXL345_WR_Reg(OFSZ,0x00);

return 0;

}

else

return 1;

}

void ADXL345_WR_Reg(u8 addr,u8 val)

{

I2C_Start();

I2C_SendByte(ADXL_WRITE,1);//发送写器件指令,等待应答

I2C_SendByte(addr,1);//发送寄存器地址

I2C_SendByte(val,1);//发送要写入的值

I2C_Stop();

}

u8 ADXL345_RD_Reg(u8 addr)

{

u8 temp;

I2C_Start();

I2C_SendByte(ADXL_WRITE,1);//发送写器件指令,等待应答

I2C_SendByte(addr,1);//发送寄存器地址

I2C_Start();//重新开始起始信号,无需发送结束信号

I2C_SendByte(ADXL_READ,1);//发送写器件指令,等待应答

temp=I2C_ReadByte(0);//读取寄存器内容

I2C_Stop();

return temp;

}

//读取3个轴的数据

//x,y,z:读取到的数据

void ADXL345_RD_XYZ(short *x,short *y,short *z)

{

u8 buf[6];

u8 i;

I2C_Start();

I2C_SendByte(ADXL_WRITE,1); //发送写器件指令

I2C_SendByte(DATA_X0,1);

I2C_Start(); //重新启动

I2C_SendByte(ADXL_READ,1); //发送读器件指令

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

if(i==5)

buf[i]=I2C_ReadByte(0);//读取一个字节,不继续再读,发送NACK else

buf[i]=I2C_ReadByte(1);

}

I2C_Stop(); //产生一个停止条件

*x=(short)(((u16)buf[1]<<8)+buf[0]);

*y=(short)(((u16)buf[3]<<8)+buf[2]);

*z=(short)(((u16)buf[5]<<8)+buf[4]);

}

void ADXL345_Read_Average(short *x,short *y,short *z,u8 times)

{

u8 i;

short tx,ty,tz;

*x=0;

*y=0;

*z=0;

if(times)//读取次数不为0

{

for(i=0;i

{

ADXL345_RD_XYZ(&tx,&ty,&tz);

*x+=tx;

*y+=ty;

*z+=tz;

delay_ms(1);

}

*x/=times;

*y/=times;

*z/=times;

}

}

//得到角度

//x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)

//dir:要获得的角度.0,与Z轴的角度;1,与X轴的角度;2,与Y轴的角度. //返回值:角度值.单位0.1°.

short ADXL345_Get_Angle(float x,float y,float z,u8 dir)

{

float temp;

float res=0;

switch(dir)

{

case 0://与自然Z轴的角度

temp=sqrt((x*x+y*y))/z;

res=atan(temp);

break;

case 1://与自然X轴的角度

temp=x/sqrt((y*y+z*z));

res=atan(temp);

break;

case 2://与自然Y轴的角度

temp=y/sqrt((x*x+z*z));

res=atan(temp);

break;

}

return res*1800/3.14;

}

//读取ADXL的平均值

//x,y,z:读取10次后取平均值

void ADXL345_RD_Avval(short *x,short *y,short *z)

{

short tx=0,ty=0,tz=0;

u8 i;

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

{

ADXL345_RD_XYZ(x,y,z);

delay_ms(10);

tx+=(short)*x;

ty+=(short)*y;

tz+=(short)*z;

}

*x=tx/10;

*y=ty/10;

*z=tz/10;

}

//自动校准

//xval,yval,zval:x,y,z轴的校准值

void ADXL345_AUTO_Adjust(char *xval,char *yval,char *zval)

{

short tx,ty,tz;

u8 i;

short offx=0,offy=0,offz=0;

ADXL345_WR_Reg(POWER_CTL,0x00); //先进入休眠模式.

delay_ms(100);

ADXL345_WR_Reg(DA TA_FORMA T,0X2B); //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程

ADXL345_WR_Reg(BW_RATE,0x0A); //数据输出速度为100Hz

ADXL345_WR_Reg(POWER_CTL,0x28); //链接使能,测量模式

ADXL345_WR_Reg(INT_ENABLE,0x00); //不使用中断

ADXL345_WR_Reg(OFSX,0x00);

ADXL345_WR_Reg(OFSY,0x00);

ADXL345_WR_Reg(OFSZ,0x00);

delay_ms(12);

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

{

ADXL345_RD_Avval(&tx,&ty,&tz);

offx+=tx;

offy+=ty;

offz+=tz;

}

offx/=10;

offy/=10;

offz/=10;

*xval=-offx/4;

*yval=-offy/4;

*zval=-(offz-256)/4;

ADXL345_WR_Reg(OFSX,*xval);

ADXL345_WR_Reg(OFSY,*yval);

ADXL345_WR_Reg(OFSZ,*zval);

}

//mode:0,显示加速度;1,显示角度

void Adxl_Show_Num(u16 x,u16 y,short num,u8 mode)

{

if(mode==0) //显示加速度值

{

if(num<0)

{

OLED_ShowChar(x,y,'-'); //显示负号

num=-num; //转为正数}else OLED_ShowChar(x,y,' '); //去掉负号

OLED_ShowNum(x+8,y,num,4,16); //显示值}else //显示角度值

{

if(num<0)

{

OLED_ShowChar(x,y,'-'); //显示负号

num=-num; //转为正数}else OLED_ShowChar(x,y,' '); //去掉负号

OLED_ShowNum(x+8,y,num/10,2,16); //显示整数部分

OLED_ShowChar(x+24,y,'.'); //显示小数点

OLED_ShowNum(x+32,y,num%10,1,16); //显示小数部分}

}

头文件OLED.h

#ifndef __OLED_H

#define __OLED_H

#include

#define u8 unsigned char

#define u32 unsigned int

#define OLED_CMD 0 //写命令

#define OLED_DA TA 1 //写数据

#define OLED_MODE 0 //0:4线串行模式1:并行8080模式

//-----------------OLED端口定义----------------

sbit OLED_CS=P0^0; //片选

sbit OLED_RST =P1^5;//复位

sbit OLED_DC =P2^2;//数据/命令控制

sbit OLED_SCL=P2^0;//时钟D0(SCLK)

sbit OLED_SDIN=P2^1;//D1(MOSI)数据

//信号控制函数

#define OLED_CS_Clr() OLED_CS=0

#define OLED_CS_Set() OLED_CS=1

#define OLED_RST_Clr() OLED_RST=0

#define OLED_RST_Set() OLED_RST=1

#define OLED_DC_Clr() OLED_DC=0

#define OLED_DC_Set() OLED_DC=1

#define OLED_SCLK_Clr() OLED_SCL=0

#define OLED_SCLK_Set() OLED_SCL=1

#define OLED_SDIN_Clr() OLED_SDIN=0

#define OLED_SDIN_Set() OLED_SDIN=1;

//

#define SIZE 16

#define XLevelL 0x02

#define XLevelH 0x10

#define Max_Column 128

#define Max_Row 64

#define Brightness 0xFF

#define X_WIDTH 128

#define Y_WIDTH 64

void delay_ms(unsigned int ms);

//OLED控制用函数

void OLED_WR_Byte(u8 dat,u8 cmd);

void OLED_Display_On(void);

void OLED_Display_Off(void);

void OLED_Init(void);

void OLED_Clear(void);

void OLED_DrawPoint(u8 x,u8 y,u8 t);

void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);

void OLED_ShowChar(u8 x,u8 y,u8 chr);

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2);

void OLED_ShowString(u8 x,u8 y, u8 *p);

void OLED_Set_Pos(unsigned char x, unsigned char y);

void OLED_ShowCHinese(u8 x,u8 y,u8 no);

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);

#endif

源文件OLED.c

#include "oled.h"

#include "oledfont.h"

void delay_ms(unsigned int ms)

{

unsigned int a;

while(ms)

{

a=1800;

while(a--);

ms--;

}

return;

}

#if OLED_MODE==1

//向SSD1106写入一个字节。

//dat:要写入的数据/命令

//cmd:数据/命令标志0,表示命令;1,表示数据; void OLED_WR_Byte(u8 dat,u8 cmd)

{

DA TAOUT(dat);

if(cmd)

OLED_DC_Set();

else

OLED_DC_Clr();

OLED_CS_Clr();

OLED_WR_Clr();

OLED_WR_Set();

OLED_CS_Set();

OLED_DC_Set();

}

#else

//向SSD1306写入一个字节。

//dat:要写入的数据/命令

//cmd:数据/命令标志0,表示命令;1,表示数据; void OLED_WR_Byte(u8 dat,u8 cmd)

{

u8 i;

if(cmd)

OLED_DC_Set();

else

OLED_DC_Clr();

OLED_CS_Clr();

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

{

OLED_SCLK_Clr();

if(dat&0x80)

{

OLED_SDIN_Set();

}

else

OLED_SDIN_Clr();

OLED_SCLK_Set();

dat<<=1;

}

OLED_CS_Set();

OLED_DC_Set();

}

#endif

void OLED_Set_Pos(unsigned char x, unsigned char y)

{

OLED_WR_Byte(0xb0+y,OLED_CMD);

OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);

OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);

}

//开启OLED显示

void OLED_Display_On(void)

{

OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令

OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON

OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON

}

//关闭OLED显示

void OLED_Display_Off(void)

{

OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令

OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF

OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF

}

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!

void OLED_Clear(void)

{

u8 i,n;

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

{

OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)

OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址

OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址

for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);

} //更新显示

}

//在指定位置显示一个字符,包括部分字符

//x:0~127

//y:0~63

//mode:0,反白显示;1,正常显示

//size:选择字体16/12

void OLED_ShowChar(u8 x,u8 y,u8 chr)

{

unsigned char c=0,i=0;

c=chr-' ';//得到偏移后的值

if(x>Max_Column-1){x=0;y=y+2;}

if(SIZE ==16)

{

OLED_Set_Pos(x,y);

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

OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);

OLED_Set_Pos(x,y+1);

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

OLED_WR_Byte(F8X16[c*16+i+8],OLED_DA TA);

}

else {

OLED_Set_Pos(x,y+1);

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

OLED_WR_Byte(F6x8[c][i],OLED_DA TA);

}

}

//m^n函数

u32 oled_pow(u8 m,u8 n)

{

u32 result=1;

while(n--)result*=m;

return result;

}

//显示2个数字

//x,y :起点坐标

//len :数字的位数

//size:字体大小

//mode:模式0,填充模式;1,叠加模式

//num:数值(0~4294967295);

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)

{

u8 t,temp;

u8 enshow=0;

for(t=0;t

{

temp=(num/oled_pow(10,len-t-1))%10;

if(enshow==0&&t<(len-1))

{

if(temp==0)

{

OLED_ShowChar(x+(size2/2)*t,y,' ');

continue;

}else enshow=1;

}

OLED_ShowChar(x+(size2/2)*t,y,temp+'0');

}

}

//显示一个字符号串

void OLED_ShowString(u8 x,u8 y,u8 *chr)

{

unsigned char j=0;

while (chr[j]!='\0')

{ OLED_ShowChar(x,y,chr[j]);

x+=8;

if(x>120){x=0;y+=2;}

j++;

}

}

//显示汉字

void OLED_ShowCHinese(u8 x,u8 y,u8 no)

{

u8 t,adder=0;

OLED_Set_Pos(x,y);

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

{

OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);

adder+=1;

}

OLED_Set_Pos(x,y+1);

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

{

OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);

adder+=1;

}

}

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y 为页的范围0~7*****************/

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])

{

unsigned int j=0;

unsigned char x,y;

if(y1%8==0) y=y1/8;

else y=y1/8+1;

for(y=y0;y

{

OLED_Set_Pos(x0,y);

for(x=x0;x

{

OLED_WR_Byte(BMP[j++],OLED_DA TA);

}

}

}

//初始化SSD1306

void OLED_Init(void)

{

OLED_RST_Set();

delay_ms(100);

OLED_RST_Clr();

delay_ms(100);

OLED_RST_Set();

OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel

OLED_WR_Byte(0x00,OLED_CMD);//---set low column address

OLED_WR_Byte(0x10,OLED_CMD);//---set high column address

OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)

OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register

OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness

OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置0xa1正常

OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置

0xc8正常

OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display

OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)

OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty

OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)

OLED_WR_Byte(0x00,OLED_CMD);//-not offset

OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec

OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period

OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration

OLED_WR_Byte(0x12,OLED_CMD);

OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh

OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level

OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)

OLED_WR_Byte(0x02,OLED_CMD);//

OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable

OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable

OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)

OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)

OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel

OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/

OLED_Clear();

OLED_Set_Pos(0,0);

}

源文件main.c

#include

#include "OLED.h"

#include "ADXL345Z.h"

//宏定义

#define u8 unsigned char

#define u16 unsigned int

void main()

{

u8 buf[4];

u8 t=0;

short x,y,z;//加速度

short angx,angy,angz;//角度

OLED_Init();

while(ADXL345_Init()) //3D加速度传感器初始化

{

OLED_ShowString(0,0,"ADXL345 Error");

OLED_ShowString(0,2,buf);

delay_ms(200);

OLED_Clear();

}

ADXL345_AUTO_Adjust((char*)&x,(char*)&y,(char*)&z);//自动校准

while(1)

{

if(t%10==0)

{

ADXL345_Read_Average(&x,&y,&z,10); //读取X,Y,Z三个方向的加速度值

Adxl_Show_Num(0,1,x,0);

Adxl_Show_Num(0,3,y,0);

Adxl_Show_Num(0,5,z,0);//显示加速度

angx=ADXL345_Get_Angle(x,y,z,1);

angy=ADXL345_Get_Angle(x,y,z,2);

angz=ADXL345_Get_Angle(x,y,z,0);

//显示角度

Adxl_Show_Num(64,1,angx,1);

Adxl_Show_Num(64,3,angy,1);

Adxl_Show_Num(64,5,angz,1);

}

t++;

delay_ms(10);

}

}

单片机STC12C5A60S2简介

STC12C5A60S2简介 STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。 1、增强型8051CPU,1T(1024G),单时钟/机器周期 2、工作电压 5.5-3.5V 3、1280字节RAM 4、通用I/O口,复位后为:准双向口/弱上拉 可设置成四种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏 每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA 5、有EEPROM功能 6、看门狗 7、内部集成MAX810专用复位电路 8、外部掉电检测电路 9、时钟源:外部高精度晶体/时钟,内部R/C振荡器 常温下内部R/C振荡器频率为:5.0V单片机为:11~17MHz 3.3V 单片机为:8~12MHz 10、4个16位定时器 两个与传统8051兼容的定时器/计数器,16位定时器T0和T1 11、3个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在 P3.5/T1输出时钟,独立波特率发生器可以在P1.0口输出时钟 12、外部中断I/O口7路,传统的下降沿中断或电平触发中断,并新增支持上升 沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3,CCP0/P1.3 13、PWM2路 14、A/D转换,10位精度ADC,共8路,转换速度可达250K/S 15、通用全双工异步串行口(UART) 16、双串口,RxD2/P1.2,TxD2/P1.3 17、工作范围:-40~85 18、封装:LQFP-48,LQFP-44,PDIP-40,PLCC 管脚说明 P0.0~P0.7 P0:P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。当P0口作为输入/输出口时,P0是一个8位准双向口,内部有弱上拉电阻,无需外接上拉电阻。当P0作为地址/数据复用总线使用时,是低8位地址线A0~A7,数据线D0~D7 P1.0/ADC0/CLKOUT2 标准IO口、ADC输入通道0、独立波特率发生器的时钟输出 P1.1/ADC1

单片机STC12C5A60S2

精心整理 单片机STC12C5A60S2 在众多的51系列单片机中,要算国内STC 公司的1T 增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片内的具有大容量程序存储器且是FLASH 工艺的,如STC12C5A60S2单片机内部就自带高达60KFLASHROM,这种工艺的存储器用户可以用电的方式瞬间擦除、改写。而且STC 系列单片机支持串口程序烧写。显而易见,这种单片机对开发设备的要求很低,开发时间也大大缩短。写入单片机内的程序还可以进行加密,这又很好地保护了你的劳动成果。重要的一点STC12C5A60S2目前的售价与传统51差不多,市场供应也很充足。是一款高性价比的单片机 /低功耗/集成 1.2.电压:3.4.5.6.,可设可达到(8.9.10.; 11.外部掉电检测电路:在P4.6口有一个低压门槛比较器,5V 单片机为 1.32V ,误差为+/-5%,3.3V 单片机为1.30V ,误差为+/-3%; 12.时钟源:外部高精度晶体/时钟,内部R/C 振荡器(温漂为+/-5%到+/-10%以内)1用户在下载用户程序时,可选择是使用内部R/C 振荡器还是外部晶体/时钟,常温下内部R/C 振荡器频率为:5.0V 单片机为:11MHz ~15.5MHz ,3.3V 单片机为:8MHz ~12MHz ,精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准; 13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定

时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器; 14.2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟; 15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA 模块,PowerDown模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2),CCP1/P1.4(也可通过寄存器设置到P4.3); 置到 20.装: (均可 VCC GND P0 写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部电位必须被拉高; P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入“1”后,电位被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收; P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的

STC12C5A60S2单片机的AD转换

A/D转换测试程序(ADC查询方式) #include “stc12c5a.h”//头文件在STC公司主页上下载 #include ”intrins.h” //与STC12C5A60S2单片机ADC相关的寄存器说明// Sfr ADC_CONTR = 0xBC;//AD转换控制寄存器 Sfr ADC_RES = 0xBD;//AD转换结果寄存器高 Sfr ADC_RESL = 0xBE;//AD转换结果寄存器低 Sfr P1ASF = 0x9D;//P1口模拟转换功能控制寄存器 Sfr AURX1 = 0xA2;//AD转换结果存储方式控制位 #define ADC_POWER 0x80 //ADC电源开 #define ADC_FLAG 0x10 //ADC结束标志位 #define ADC_START 0x08 //ADC启动控制位设为开 #define ADC_SPEEDLL 0x00 //设为540个时钟周期ADC一次 #define ADC_SPEEDL 0x20 //设为360个时钟周期ADC一次 #define ADC_SPEEDH 0x40 //设为180个时钟周期ADC一次 #define ADC_SPEEDHH 0x60 //设为90个时钟周期ADC一次 void AD_init(void); void delay(unsigned int a); unsigned int AD_get(unsigned char n); float AD_work(unsigned char n); void main() { unsigned char i; AD_init(); while(1) { for(i=0;i<8;i++) { AD_work(i); delay(20); } } } unsigned int AD_get(unsigned char n) //第n通道ADC采样函数 { unsigned int adc_data; ADC_RES = 0; //清零 ADC_CONTR=ADC_POWER|ADC_SPEEDLL|n|ADC_START;//打开AD转换电源、

STC12C5A60S2单片机课程设计报告

一、课程设计基本情况介绍 1.1课程设计的基本目的与任务 本课程设计旨在驾驭本专业学生理论指导实践能力以及电子产品工程设计与开发能力。本实践课所要达到的主要目的是: 1、通过本次课程设计,是对学生综合能力的检,提高学生综合运用专业知识,强化单片机 应用系统设计与防震能力。 2、本次课程设计是在生产实习所完成的“单片机核心板+电子钟模块+MP3模块+RFID模块+无线传输模块+GPS模块+脉搏传感模块”的基础上设计该硬件系统的工作程序。 1.2课程设计的基本内容 1、在生产实习设计单片机硬件系统的基础上,设计相应的应用软件系统。 2、在LCD1602上显示学号程序设计。 3、基于DS1302的实时时钟软件设计。 4、基于DS18B20的温度测量软件设计。 5、基于TL1838A的红外遥控解码软件设计。 6、设计应用软件系统框图和流程图,完成所设计软件的调试。 1.3课程设计的教学要求 1、通过资料查阅及学习了解单片机应用系统的软件设计方法及单片机编程、软硬件联机调 试技巧。 2、独立设计并编写下列应用程序: (1)LCD1602学号显示程序; (2)DS1302实时时钟程序; (3)DS18B20温度测量程序; (4)TL1838A红外遥控解码程序; 3、独立完成所设计程序与硬件系统的联机仿真。 二、整机系统框图(硬件、软件) 该设计方案是以STC12C5A60S2单片机为核心,采用LCD液晶屏幕显示模块、实时时钟模块、温度测量模块、红外遥控解码等模块所构建的系统,能在LCD1602液晶屏上显示当前的日期(年、月、日)、时间(时、分、秒)数据、当前环境温度值和红外遥控解码值。用户可通过遥控器或单片机核心板上的按键来进行日期和时间的设置。本系统设计大部分功能由软件来实现,电路简单明了,系统稳定性也得到大大提高。 1、总体硬件设计框架图: 2、总体软件设计框架图 /////// 三、整机硬件电路原理图(见99SE图) 1、核心板电路原理图 2、蜂鸣器驱动电路 3、按键电路 4、单片机复位电路 5、LCD1602液晶显示电路 6、电子钟模块接口电路 四、软件系统设计思想 //////////// 五、系统软件资源分配表(调试程序、工作程序) ////////////// 六、显示学号的调试程序流程图、程序源代码

STC12C5A60S2单片机双串口通信

STC12C5A60S2单片机双串口通信 STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作 与传统51单片机串行口相同;特殊的是STC12C5A60S2 单片机内部有一个独立波特率发生器,串口1可以使用 定时器1作为波特率发生器,也可以使用独立波特率发 生器作为波特率发生器;而串口2只能使用独立波特率 发生器作为波特率发生器。 下面是一段双串口通信的程序: /************************************************ *********************** 时间:2012.11.24 芯片:STC12C5A60S2 晶振:22.1184MHz 波特率:9600bps 引脚定义:串行口1:发送 ————TxD/P3.1;接收 ————RxD/P3.0 串行口2:发送 ————TxD2/P1.3;接收 ————RxD2/P1.2 功能描述:STC12双串口通信(中断方式)

当串行口1接收数据后,将此数据由串行口2发送出去 当串行口2接收数据后,将此数据由串行口1发送出去 ************************************************* **********************/ #include; #define S2RI 0x01//串口2接收中断请求标志位 #define S2TI 0x02//串口2发送中断请求标志位unsigned char flag1,flag2,temp1,temp2; /****************串行口初始化函数 ****************/ void InitUART(void) { TMOD = 0x20; //定时器1工作在方式2 8位自动重装 SCON = 0x50; //串口1工作在方式1 10位异步收发 REN=1允许接收 TH1 = 0xFA; //定时器1初值 TL1 = TH1; TR1 = 1; //定时器1开始计数 EA =1;//开总中断

根据STC12C5A60S2单片机数字电压表的设计

数字电压表的设计

第1章引言 在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。

传统的指针式刻度电压表功能单一,精度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字电压表是诸多数字化仪表的核心与基础。以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。 目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。 本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。 第2章系统总体方案设计选择与说明 2.1 设计要求 1、增强型MCS-51系列单片机STC12C5A60S2为核心器件,组成一个简单的直流数字电压表。 2、采用1路模拟量输入,能够测量0-10V之间的直流电压值。 3、电压显示采用LCD1602显示。 4、尽量使用较少的元器件。

STC12C5A60S2单片机简介

STC12C5A60S2单片机简介: STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。 工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机) STC12C5A60S2是哪一类单片机? 是8051系列单片机,与普通51单片机相比有以下特点: 1、同样晶振的情况下,速度是普通51的8~12倍 2、有8路10位AD 3、多了两个定时器,带PWM功能 4、有SPI(串行外设接口)接口 5、有EEPROM 6、有1K内部扩展RAM 7、有WATCH_DOG 8、多一个串口 9、IO口可以定义,有四种状态 10、中断优先级有四种状态可定义 单片2.4G无线射频收发芯片nRF24L01: 可接受5V电平的输入,工作电压1.9~3.6V,单片无线收发器芯片, GFSK 数字调制方法,如: ASK——幅移键控调制,把二进制符号0和1分别用不同的幅度来表示。 FSK——频移键控调制,即用不同的频率来表示不同的符号。如2KHz表示0,3KHz表示1。GFSK——高斯频移键控,在调制之前通过一个高斯低通滤波器来限制信号的频谱宽度。

单片机的PCA模块: PCA(可编程计数器阵列Programmable Counter Array)可编程计数器阵列(PCA)提供增强的定时器功能,与标准8051计数器/定时器相比,它需要较少的CPU干预。由高字节(PCAH)和低字节(PCAL)组成。 25页报告出现的传感器: RPR220:反射型光电探测器

STC12C5A60S2中文资料选型表

STC12C5A60S2系列1T单片机简介 STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。 1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051 2.工作电压:STC12C5A60S2系列工作电压:5.5V- 3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V- 2.2V(3V单片机) 3.工作频率范围:0 - 35MHz,相当于普通8051的0~420MHz 4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节...... 5.片上集成1280字节RAM 6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口) 可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA 7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片 8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM) 9. 看门狗

10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地) 11.外部掉电检测电路:在P4.6口有一个低压门槛比较器5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3% 12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz 3.3V单片机为:8MHz~12MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准 13.共4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器再加上2路PCA模块可再实现2个16位定时器 14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟 15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2, INT1/P3.3, T0/P3.4, T1/P3.5, RxD/P3.0, CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3) 16. PWM(2路)/PCA(可编程计数器阵列,2路) ---也可用来当2路D/A使用---也可用来再实现2个定时器---也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持) 17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次) 18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口 19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3) 20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。

STC12C5A60S2单片机各个模块程序代码

12C5A12C5A12C5A12C5A12C5A12C5A12M6M3M1.5M12C5A12C5A闲模式,低速模式 12C5A0f12C5A2 A12C5A12C5A12C5A0c12C5A12C5A12C5A0L0L7f0a0L0L0L0L0L0L0L0L0L12C5A12C5A12C5A12C5 A12C5A速.同步的通信总线,有两种操作模式:主模式和从模式。 12C5A12C5A12C5A速.同步的通信总线,有两种操作模式:主模式和从模式。 // // 涉及寄存器:SPCTL(SPI控制寄存器)、SPSTAT(SPI状态寄存器)、SPDAT(数据寄存器) // AUXR1(辅助寄存器) // // // 程序说明:本程序为SPI的从机程序,从机通过SPI接收主机发送过来的数据,并通过串口 // 显示到PC端, // //**************************************************************************** // #include <12C5A> #include <> #define uchar unsigned char #define uint unsigned int /************对SPCTL寄存器的设置位宏定义*************/ #define SSIG 0x80 //SS引脚忽略 #define SPEN 0x40 //SPI使能位 #define DORD 0x20 //SPI数据发送LSB最先发送 #define MSTR 0x10 //主从模式选择 #define CPOL 0x08 //SPICLK空闲时为高电平 #define CPHA 0x04 //数据在SPICLK的前时钟沿驱动,并在后时钟沿采样 #define SP_CLK0 0x00 //SPI时钟频率为CPU_CLK/4 #define SP_CLK1 0x01 //SPI时钟频率为CPU_CLK/16 #define SP_CLK2 0x02 //SPI时钟频率为CPU_CLK/64 #define SP_CLK3 0x03 //SPI时钟频率为CPU_CLK/128 /************对SPSTAT寄存器的设置位宏定义************/ #define SPIF 0x80 //传输完成标志 #define WCOL 0x40 //SPI写冲突标志 /************SPI口切换宏定义***************/ #define SPI_P4 0x20 //SPI从P1口切换到P4口 /************波特率选择********************/ #define BTL 9600 //若要更改波特率直接更改此处,当波特率大于9600时需修改相应的接收程序, //可选波特率有以下: 否则有可能出现乱码 //波特率为2400 //波特率为28800 //波特率为4800 //波特率为38400 //波特率为9600 //波特率为57600

STC12C5A60S2单片机各个模块程序代码

//**************************************************************************** // // STC12C5A60S2可编程时钟模块 // // // 说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUT0/T0/P3.4 // CLKOUT1/T1/P3.5、CLKOUT2/P1.0 // // 涉及寄存器:AUXR(辅助寄存器)、WAKE_CLKO(时钟与系统掉电唤醒控制寄存器) // BRT(独立波特率发生器定时器寄存器) // // 程序说明: // 本程序可选实现P3.4输出CLKOUT0时钟、P3.5输出CLKOUT1时钟// P1.0输出CLKOUT2时钟 // ////************************************************************************** **// #include #include //#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句 //若想测试CLKOUT1和CLKOUT0请注释此句 #ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*/ //*********************************// // CLKOUT2时钟初始化 // //*********************************// void CLKOUT_init(void) { WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许P1.0配置为独立波特率发生器的时钟输出 //BRT工作在1T模式下时的输出频率 = Sysclk/(256-BRT)/2 //BRT工作在12T模式下时输出频率 = Sysclk/12/(256-BRT)/2 AUXR = 0x14; //Bit4-BRTR 允许独立波特率发生器运行 //Bit2-BRTx12 BRT工作在1T模式下 BRT = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频 } #else /*条件编译CLKOUT0时钟输出*/ //*********************************// // CLKOUT0时钟和CLKOUT1初始化 // //*********************************// void CLKOUT_init(void) { WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0

单片机STC12C5A60S2

单片机STC12C5A60S2 在众多的51系列单片机中,要算国内STC 公司的1T增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片内的具有大容量程序存储器且是FLASH工艺的,如STC12C5A60S2单片机内部就自带高达60K FLASH ROM,这种工艺的存储器用户可以用电的方式瞬间擦除、改写。而且STC系列单片机支持串口程序烧写。显而易见,这种单片机对开发设备的要求很低,开发时间也大大缩短。写入单片机内的程序还可以进行加密,这又很好地保护了你的劳动成果。重要的一点STC12C5A60S2目前的售价与传统51差不多,市场供应也很充足。是一款高性价比的单片机 STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。 1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051; 2.工作电压:STC12C5A60S2系列工作电压:5.5V- 3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机); 3.工作频率范围:0 - 35MHz,相当于普通8051的 0~420MHz; 4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K 字节; 5.片上集成1280字节RAM; 6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55Ma; 7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片; 8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM); 9. 看门狗; 10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接

单片机STC12C5A60S2模块简介

单片机STC12C5A60S2模块简介 1、综述 系统采用STC12C5A16S2单片机为核心,配合USB转串口芯片CH340T、RS232芯片Max232、四位共阳数码管、LED、按键和蜂鸣器组成最小系统。单片机内部集成双串口、8路10bitADC和两路八位PWM。系统由MINI USB供电和提供程序下载接口,使得电路大大简化,通用性增强。 2、模块分析 2、1电源模块 全系统工作在+5V且功耗较低,所以采用USB电源供电即可满足。 电源前级接入500mA自恢复保险丝,提供短路保护,芯片前级对地分别连接100uF 和0.1uF进行电源滤波。电源部分引入三脚单联扭子开关将USB转串口芯片CH340T 的电源与芯片电源进行隔离,以方便下载程序。 图2.1 电源模块 2.2、USB转串口 STC12C5A16S2单片机可以通过串口烧写程序,系统采用CH340T将USB转换为串口信号,以供单片机下载程序,电路如图2.2: 图2.2USB转串口模块

图中UD+与UD-为计算机USB信号,RxD与TxD信号为CH340T转换后接到单片 机的串口信号。 2.3、单片机模块 单片机模块由复位电路,晶振电路和蜂鸣器电路组成,然后将多余I/O口外接以供扩展。 图2.3 单片机模块 2.4、RS232模块 使用Max232将单片机的第二串口引出,通过DB9接口实现与外界串口通信。 图2.4 RS232模块

2.5、四位共阳数码管和LED模块 单片机P2.0端口用于8个LED选通,P2.1-P2.4端口用于数码管位选;P0.0-P0.7用于数码管段选和8个LED选择。 图2.5四位共阳数码管 图2.6 8位LED模块 2.6、按键模块 单片机P3.2-P3.5端口用于扫描按键状态,组成1X4键盘。 图2.7 按键模块

STC12C5A60S2单片机实现AD采样并液晶显示(数字燃油表)

数字燃油表模拟电路设计可实现以下功能: 1、推动滑动变阻器,能使LCD从0显示到100 2、档显示数字低于10时,灯亮,LCD显示“oil low” 以下为C程序: #include #include #define uchar unsigned char #define uint unsigned int #define Delay4us(){_nop_();_nop_();_nop_();_nop_();} sbit LED=P1^0; sbit LCD_RS=P2^6; sbit LCD_RW=P2^5;

sbit LCD_EN=P2^7; sbit SCL=P2^0; //I2C时钟引脚 sbit SDA=P2^1; //I2C数据输入输出引脚uchar Recv_Buffer[4]; //数据接收缓冲 uint Voltage[]={'0','0','0','0'}; //数据分解为电压x.xx bit bdata IIC_ERROR; //I2C错误标志位 uchar LCD_Line_1[]={" "}; //延时 void delay(int ms) { uchar i; while(ms--) for(i=0;i<250;i++) Delay4us(); } //LCD忙检测 bit LCD_Busy_Check() { bit Result; LCD_RS=0;LCD_RW=1; LCD_EN=1;Delay4us();Result=(bit)(P0&0x80); LCD_EN=0; return Result; } //写指令 void LCD_Write_Command(uchar cmd) { while(LCD_Busy_Check()); LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_(); P0=cmd;Delay4us(); LCD_EN=1;Delay4us();LCD_EN=0; } // 写数据 void LCD_Write_Data(uchar dat) { while(LCD_Busy_Check()); LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;Delay4us(); LCD_EN=1;Delay4us();LCD_EN=0; } //初始化 void LCD_Initialise() { LCD_Write_Command(0x38);delay(5); LCD_Write_Command(0x0c);delay(5); LCD_Write_Command(0x06);delay(5); LCD_Write_Command(0x01);delay(5);

stc12c5a60s2单片机头文件

文件下载完成后,文件格式改为.h后保存到头文件库中,如keil软件,找到keil安装文件:keil —>c51—>INC 头文件如下 //-------------------------------------------------------------------------------- //新一代1T 8051系列单片机内核特殊功能寄存器C51 Core SFRs // 7 6 5 4 3 2 1 0 Reset Value sfr ACC = 0xE0; //Accumulator 0000,0000 sfr B = 0xF0; //B Register 0000,0000 sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000 //----------------------------------- sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; //----------------------------------- sfr SP = 0x81; //Stack Pointer 0000,0111 sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000 sfr DPH = 0x83; //Data Pointer High Byte 0000,0000 //-------------------------------------------------------------------------------- //新一代1T 8051系列单片机系统管理特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value sfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000 // 7 6 5 4 3 2 1 0 Reset Value sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000 //----------------------------------- sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000 /* PCA_P4: 0, 缺省PCA 在P1 口 1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口, PCA0/PWM0 从P1.3 切换到P4.2 口 PCA1/PWM1 从P1.4 切换到P4.3 口 SPI_P4: 0, 缺省SPI 在P1 口 1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口 MISO 从P1.6 切换到P4.2 口 MOSI 从P1.5 切换到P4.1 口

STC12C5A60S2单片机

STC12C5A60S2单片机寄存器头文件 STC12C5A.H内容 **************** 8051内核特殊功能寄存器 ******************/ sfr ACC = 0xE0; //累加器 sfr B = 0xF0; //B寄存器 sfr PSW = 0xD0; //程序状态字寄存器 sbit CY = PSW^7; //进位标志位 sbit AC = PSW^6; //辅助进位标志位 sbit F0 = PSW^5; //用户标志位0 sbit RS1 = PSW^4; //工作寄存器组选择控制位 sbit RS0 = PSW^3; //工作寄存器组选择控制位 sbit OV = PSW^2; //溢出标志位 sbit F1 = PSW^1; //用户标志位1 sbit P = PSW^0; //奇偶标志位 sfr SP = 0x81; //堆栈指针寄存器 sfr DPL = 0x82; //数据指针0低字节 sfr DPH = 0x83; //数据指针0高字节 /**************** 系统管理特殊功能寄存器 ******************/ sfr PCON = 0x87; //电源控制寄存器 sfr AUXR = 0x8E; //辅助寄存器 sfr AUXR1 = 0xA2; //辅助寄存器1 sfr WAKE_CLKO = 0x8F; //时钟输出和唤醒控制寄存器 sfr CLK_DIV = 0x97; //时钟分频控制寄存器 sfr BUS_SPEED = 0xA1; //总线速度控制寄存器 /**************** 中断控制特殊功能寄存器 ******************/ sfr IE = 0xA8; //中断允许寄存器 sbit EA = IE^7; //总中断允许位 sbit ELVD = IE^6; //低电压检测中断控制位 sbit EADC = IE^5; //ADC中断允许控制位 sbit ES = IE^4; //串口1中断允许位 sbit ET1 = IE^3; //定时器1溢出中断允许位 sbit EX1 = IE^2; //外部中断1允许位 sbit ET0 = IE^1; //定时器0溢出中断允许位 sbit EX0 = IE^0; //外部中断0允许位 sfr IE2 = 0xAF; //中断允许寄存器2 sfr IP = 0xB8; //中断优先级寄存器 sbit PPCA = IP^7; //PCA中断优先级控制位 sbit PLVD = IP^6; //低电压检测中断优先级控制位 sbit PADC = IP^5; // ADC中断优先级控制位 sbit PS = IP^4; //串口1中断优先级控制位 sbit PT1 = IP^3; //定时器1中断优先级控制位 sbit PX1 = IP^2; //外部中断1优先级控制位

STC12C5A60S2 单片机头文件

// STC12C5A60S2 单片机头文件 #ifndef __STC12C5A60S2_H_ #define __STC12C5A60S2_H_ //-------------------------------------------------------------------------------- /*新一代1T 8051系列单片机内核特殊功能寄存器C51 Core SFRs*/ // 7 6 5 4 3 2 1 0 Reset Value sfr ACC = 0xE0; //Accumulator 0000,0000 sfr B = 0xF0; //B Register 0000,0000 sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000 //----------------------------------- sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; //----------------------------------- sfr SP = 0x81; //Stack Pointer 0000,0111 sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000 sfr DPH = 0x83; //Data Pointer High Byte 0000,0000 //-------------------------------------------------------------------------------- /*新一代1T 8051系列单片机系统管理特殊功能寄存器*/ // 7 6 5 4 3 2 1 0 Reset Value sfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000 // 7 6 5 4 3 2 1 0 Reset Value sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000 //----------------------------------- sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000 /* PCA_P4: 0, 缺省PCA 在P1 口 1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口, PCA0/PWM0 从P1.3 切换到P4.2 口 PCA1/PWM1 从P1.4 切换到P4.3 口 SPI_P4:

相关主题
相关文档
最新文档