基于51单片机的波特率自动识别系统程序

基于51单片机的波特率自动识别系统程序
基于51单片机的波特率自动识别系统程序

#include

#define uint unsigned int

#define uchar unsigned char

#define disp_off 0x3e //关显示

#define disp_on 0x3f //开显示

#define disp_x 0xb8 //页地址

#define disp_z 0xc0 //行地址

#define disp_y 0x40 //列地址

#define comm 0 //命令标志

#define dat 1 //数据标志

#define data_ora P0 //MCU P0<------> LCM

sbit cs1=P2^0; //cs1=L,选择左半屏

sbit cs2=P2^1; //cs2=L,选择右半屏

sbit rs =P2^2; //H:写数据,L:写指令

sbit rw =P2^3; //H:读,L:写

sbit e =P2^4; //读写使能

sbit bf =P0^7; //执行操作标志

sbit res=P0^4; //复位初始化标志

uchar uart_data,temp,baud_set=0x00;

uchar dispnum[90];

uchar baud[5]={0x00,0x09,0x06,0x00,0x00};

uchar r_dat[4]={0x00,0x10,0x00,0x00};

uchar code baudrate[7][5]={

{0x00,0x00,0x03,0x00,0x00},

{0x00,0x00,0x06,0x00,0x00},

{0x00,0x01,0x02,0x00,0x00},

{0x00,0x02,0x04,0x00,0x00},

{0x00,0x04,0x08,0x00,0x00},

{0x00,0x09,0x06,0x00,0x00},

{0x01,0x04,0x04,0x00,0x00},

}; //波特率大小

uchar code hz11[]={

/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 发--*/

0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0,

0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00,

0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B,

0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00,

/*-- 文字: 送--*/

0x00,0x80,0xD0,0xB0,0xA0,0x80,0x80,0x70,

0x40,0xC0,0x60,0x50,0x40,0x00,0x00,0x00,

0x08,0x08,0x08,0x0C,0x0B,0x08,0x09,0x0D,

0x1B,0x13,0x13,0x35,0x3D,0x30,0x10,0x08,

/*-- 文字: 数--*/

0x00,0x00,0x40,0xE0,0x40,0xF0,0xE0,0x70,

0x00,0xF0,0x50,0xC0,0x40,0x40,0x00,0x00,

0x00,0x02,0x13,0x16,0x1E,0x0B,0x16,0x13,

0x11,0x0B,0x06,0x0F,0x18,0x18,0x10,0x00,

/*-- 文字: 据--*/

0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0xF0,

0x60,0x50,0xD0,0x50,0x70,0x60,0x00,0x00,

0x00,0x12,0x13,0x31,0x1F,0x11,0x0D,0x07,

0x3D,0x15,0x17,0x15,0x3D,0x1D,0x03,0x00,

};

uchar code hz12[]={

/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 波--*/

0x00,0x80,0x20,0x20,0x40,0x40,0xE0,0x20,

0x20,0xF0,0x30,0x20,0x20,0xC0,0x00,0x00,

0x00,0x19,0x09,0x0D,0x14,0x18,0x27,0x31,

0x13,0x0D,0x0D,0x1B,0x18,0x30,0x30,0x10,

/*-- 文字: 特--*/

0x00,0xC0,0x60,0x40,0xF0,0x60,0x40,0xA0,

0xA0,0xF0,0xF0,0xA0,0xA0,0x80,0x80,0x00,

0x00,0x02,0x02,0x02,0x3F,0x01,0x01,0x12,

0x26,0x2E,0x2A,0x3F,0x1A,0x02,0x00,0x00,

/*-- 文字: 率--*/

0x00,0x00,0x20,0x60,0x60,0xA0,0x60,0xB0,

0x70,0xA0,0xA0,0x60,0x20,0x20,0x00,0x00,

0x00,0x04,0x04,0x07,0x05,0x04,0x05,0x3F,

0x1F,0x05,0x05,0x05,0x0C,0x0C,0x04,0x00,

/*-- 文字: 为--*/

0x00,0x00,0x00,0x80,0x80,0xB0,0xA0,0x80,

0x80,0xC0,0xE0,0xB0,0x80,0x80,0x00,0x00,

0x00,0x10,0x18,0x18,0x0C,0x04,0x02,0x01,

0x13,0x36,0x34,0x30,0x1E,0x07,0x00,0x00,

};

uchar code num[]={

/*-- 隶书12; 此字体下对应的点阵为:宽x高=8x16 --*/ /*-- 文字: 0 --*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,

0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

/*-- 文字: 1 --*/

0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, /*-- 文字: 2 --*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, /*-- 文字: 3 --*/

0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 4 --*/

0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, /*-- 文字: 5 --*/

0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 6 --*/

0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 7 --*/

0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, /*-- 文字: 8 --*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, /*-- 文字: 9 --*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, /*-- 文字: a --*/

0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00, 0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20, /*-- 文字: b --*/

0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00, 0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: c --*/

0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00, 0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00, /*-- 文字: d --*/

0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00, 0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00, /*-- 文字: e --*/

0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, 0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, /*-- 文字: f --*/

0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,

/*-- 文字: x --*/

0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,

0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,};

uchar code dispunit[]={

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ /*-- 文字: b --*/

0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,

0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*-- 文字: p --*/

0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,

0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,

/*-- 文字: s --*/

0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,

0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,

};

uchar code hz13[]={

/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 发--*/

0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0,

0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00,

0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B,

0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00,

/*-- 文字: 送--*/

0x00,0x80,0xD0,0xB0,0xA0,0x80,0x80,0x70,

0x40,0xC0,0x60,0x50,0x40,0x00,0x00,0x00,

0x08,0x08,0x08,0x0C,0x0B,0x08,0x09,0x0D,

0x1B,0x13,0x13,0x35,0x3D,0x30,0x10,0x08,

/*-- 文字: 数--*/

0x00,0x00,0x40,0xE0,0x40,0xF0,0xE0,0x70,

0x00,0xF0,0x50,0xC0,0x40,0x40,0x00,0x00,

0x00,0x02,0x13,0x16,0x1E,0x0B,0x16,0x13,

0x11,0x0B,0x06,0x0F,0x18,0x18,0x10,0x00,

/*-- 文字: 据--*/

0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0xF0,

0x60,0x50,0xD0,0x50,0x70,0x60,0x00,0x00,

0x00,0x12,0x13,0x31,0x1F,0x11,0x0D,0x07,

0x3D,0x15,0x17,0x15,0x3D,0x1D,0x03,0x00,

};

uchar code hz14[]={

/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 为--*/

0x00,0x00,0x00,0x80,0x80,0xB0,0xA0,0x80,

0x80,0xC0,0xE0,0xB0,0x80,0x80,0x00,0x00,

0x13,0x36,0x34,0x30,0x1E,0x07,0x00,0x00,};

/************************函数声明***********************/

void chk_busy (void); //判断LCD工作状态

void delay (uint us); //us延时函数

void init_uart(void); //初始化串口程序

void wr_lcd (uchar dat_comm,uchar content);//写数据或命令到LCD

void init_lcd (void); //初始化LCD程序

void lat_disp (uchar data1,uchar data2);//LCD写点阵程序

void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar *chn);//写字符函数

void change(void); //调整波特率显示码程序

void change_dat(void); //调整接收到的数据为显示码程序

void disp (void); //LCD显示程序

void measure(void); //1bit数据发送时间测量程序

void search(void); //查询发送数据波特率程序

void init_T0 (void); //T0初始化程序

void disp_dat(void); //数据显示程序

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

void main ()

{

init_T0 (); //初始化T0

init_lcd (); //初始化LCD

measure (); //检测主机发送波特率

init_uart(); //初始化串口

disp(); //调用显示

while (1)

{

disp_dat(); //修改接收数据

}

}

/***********************us延时函数**********************/

void delay (uint us)

{

while(us--);

}

/**********************T0初始化程序***********************/

void init_T0 (void)

{

TMOD=0x01; //工作方式1

TH0=0x00; //初始化定时器内部寄存器

TL0=0x00;

}

/***************1bit数据发送时间测量程序*************/

void measure(void)

{

while(RXD); //等待主机发送起始位0

TR0=1; //启动定时器计时

while(!RXD); //等待主机发送最高位1

TR0=0; //定时器停止计时

baud_set=TH0; //将1bit的发送时间存入baud_SET }

/**********************初始化串口程序********************/

void init_uart(void)

{

SCON=0x50; //工作方式1,允许接收

TMOD=TMOD|0x20; //T1为工作方式2

TH1=255-baud_set; //设置T1

TL1=255-baud_set;

ES=1; //允许串行中断

EA=1; //开总中断

TR1=1; //启动定时器T1

SBUF=0x0d; //向主机发送确认码

}

/********************判断LCD工作状态********************/

void chk_busy (void)

{

data_ora=0xff;

rs=0; //命令标志

rw=1; //读数据

e=1;

while(bf||res==1);

e=0;

}

/*******************写数据或命令到LCD******************/

void wr_lcd (uchar dat_comm,uchar content)

{

chk_busy (); //查看LCD是否处于忙状态

rs=dat_comm; //写入命令/数据

rw=0; //写数据

data_ora=content; //送命令/数据

e=1;

e=0;

}

/*********************初始化LCD程序********************/

void init_lcd (void)

{

delay(50);

cs1=0;

cs2=0;

wr_lcd (comm,disp_off);

wr_lcd (comm,disp_on); //开显示

lat_disp(0x00,0x00); //清屏

}

/********************LCD写点阵程序*********************/

void lat_disp (uchar data1,uchar data2)

{

uchar i,j;

cs1=0;

cs2=0;

wr_lcd (comm,disp_on);

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

{

wr_lcd (comm,disp_x+j); //设置页地址

wr_lcd (comm,disp_z); //设置起始行

wr_lcd (comm,disp_y); //设置列地址

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

{

wr_lcd (dat,data1);

wr_lcd (dat,data2);

}

}

}

/**********************写字符函数**********************/

void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar *chn) {

uchar i,j,k,l,a;

wr_lcd (comm,disp_on); //开显示

for(l=0;l

{

for(k=0;k

{

for(j=0;j

{

wr_lcd (comm,disp_x+x+l*xl+j); //行数调整

wr_lcd (comm,disp_z); //列数调整

wr_lcd (comm,disp_y+y+k*yl); //字数调整

a=l*xl*yl*row_yl+k*xl*yl+j*yl;

for(i=0;i

wr_lcd (dat,chn[a+i]);

}

}

}

}

/****************调整波特率显示码程序******************/

void change(void)

{

uchar temp,i,j,n=0;

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

{

temp=baud[j];

if((j==0&baud[0]==0x00)|((j==1&baud[1]==0x00)))

{

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

dispnum[n++]=0x00;

}

else

{

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

dispnum[n++]=num[i+temp*16];

}

}

}

/*************调整接收到的数据为显示码程序*************/

void change_dat(void)

{

uchar temp,i,j,n=0;

r_dat[2]=uart_data/16; //将高四位存入r_dat[2]

r_dat[3]=uart_data%16; //将低四位存入r_dat[3]

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

{

temp=r_dat[j];

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

dispnum[n++]=num[i+temp*16];//转换显示码

}

}

/*********************LCD显示程序*********************/

void disp (void)

{

lat_disp(0x00,0x00); //清屏

search(); //查询波特率显示码

change(); //调整显示码

cs1=0;

cs2=1; //显示LCD屏幕左侧前三行信息chn_disp (0,0,2,16,1,4,hz11);

chn_disp (2,24,2,8,1,5,dispnum);

chn_disp (4,0,2,16,1,4,hz13);

cs1=1;

cs2=0; //显示LCD屏幕右侧前三行信息chn_disp (0,0,2,16,1,4,hz12);

chn_disp (2,8,2,8,1,3,dispunit);

chn_disp (4,0,2,16,1,1,hz14);

}

/*********************数据显示程序*********************/

void disp_dat(void)

{

change_dat(); //调整显示

cs1=0;

cs2=1;

chn_disp (6,24,2,8,1,4,dispnum); //将接收到得数据显示在屏幕左侧第四行

}

/********************串口中断程序********************/

void serial_TI(void) interrupt 4

{

if(RI==1)

{

RI=0; //接收中断,清零RI

uart_data=SBUF; //将接收数据存入temp,并将接收数据发送至上位机

SBUF=uart_data;

temp=uart_data;

}

else //发送中断,清零RI

TI=0;

}

/**************查询发送数据波特率程序***************/

void search(void)

{

uchar i;

switch(baud_set)

{

case 0x5f:

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

baud[i]=baudrate[0][i]; //波特率为300

break;

case 0x2f:

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

baud[i]=baudrate[1][i]; //波特率为600

break;

case 0x17:

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

baud[i]=baudrate[2][i]; //波特率为1200

break;

case 0x0b:

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

baud[i]=baudrate[3][i]; //波特率为2400

break;

case 0x05:

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

baud[i]=baudrate[4][i]; //波特率为4800

break;

case 0x02:

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

baud[i]=baudrate[5][i]; //波特率为9600

break;

case 0x01:

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

baud[i]=baudrate[6][i]; //波特率为14400

break;

default:

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

baud[i]=0x0e; //超出测量范围,显示EEEEE break;

}

}

51单片机串口通信及波特率设置

51单片机串口通信及波特率设置 MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。 1. 数据缓冲寄存器SBUF SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。 2. 状态控制寄存器SCON SCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。它的各个位定义如下: MSB LSB SM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。 SM0 SM1 工作方式功能波特率 0 0 0 8位同步移位寄存器Fosc/12 0 1 1 10位UART 可变 1 0 2 11位UART Fosc/64或Fosc/32 1 1 3 11位UART 可变 SM2在工作方式2和3中是多机通信的使能位。在工作方式0中,SM2必须为0。在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。此功能可用于多处理机通信。 REN为允许串行接收位,由软件置位或清除。置位时允许串行接收,清除时禁止串行接收。 TB8是工作方式2和3要发送的第9位数据。在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。在多处理机通信中,该位用于表示是地址帧还是数据帧。 RB8是工作方式2和3中接收到的第9位数据(例如是奇偶位或者地址/数据标识位),在工作方式1中若SM2=0,则RB8是已接收的停止位。在工作方式0中RB8不使用。 TI 为发送中断标志位,由硬件置位,软件清除。工作方式0中在发送第8位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。TI=1时,申请中断。CPU 响应中断后,发送下一帧数据。在任何工作方式中都必须由软件清除TI。 RI为接收中断标志位,由硬件置位,软件清除。工作方式0中在接收第8位末尾由硬件置位;在其他工作方式时,在接收停止位的中间由硬件置位。RI=1时,申请中断,要求CPU取走数据。但在工作方式1中,SM2=1且未接收到有效的停止位时,不会对RI置位。在任何工作方式中都必须由软件清除RI。 系统复位时,SCON的所有位都被清除。 控制寄存器PCON也是一个逐位定义的8位寄存器,目前仅仅有几位有定义,如下所示:MSB LSB

基于51单片机的室内空气检测文献综述

福州大学至诚学院本科生毕业设计(论文)文献综述 题目:基于单片机的室内空气 质量监测系统设计 姓名:陈志勇 学号:211114112 系别:电气工程及其自动化 专业:自动化 年级:2011级 指导教师:(签名) 年月日 1、研究背景与意义

全球经济的快速发展和工业水平的提高,人类所面临的大气污染问题日益严峻,空气质量的好坏受到越来越多的关注。随着生活水平的提高、居住条件的改善,人们对生活环境质量的要求也越来越高,拥有一个健康无污染的室内环境就成为很多人的共同愿望。特别是近几年,国内各大城市对PM2.5持续居高不下,这引起了广泛的关注。而对于室内环境来说,工业排放的可吸附颗粒物、装修房间排放的甲醛、及厨房排放的油烟等是其污染的主要来源。这些烟尘、甲醛等有害物质的含量远远超出了正常的标准,严重影响了人们的身体健康。 信息技术的发展改变了人们日常办公的方式和环境,更多的人可以选择在室内完成一天的工作。尤其是生活在城市中的群体,有一半以上的时间都是在室内环境中度过。在这种环境下,即使空气中的污染物的浓度不太高,长期处在室内并呼吸受到污染过的空气,健康也势必会受到影响,污染空气带来的伤害也是无法估量的。有时,室内污染比室外污染更加严重,因此对室内空气污染的预防与治理具有重大意义,它直接影响到人们的生活环境和身体健康。 事实上,人类超过一半的疾病都是由于空气污染造成的,全世界每年死于空气污染的人数以数百万计。因此,近年来,人们越来越意识到改善空气质量的重要性。一方面,控制污染源,减少污染物的产生;另一方面,采取措施,减少已存在的污染物。解决室内环境的污染问题,有很多种方法可以选择。因此,本文采用静电式来净化室内空气,一定程度上可以改善室内空气质量。该设计系统能够检测空气环境质量,比如温度、湿度,更重要的是能检测空气中掺杂的一定浓度粉尘、烟雾、甲醛等杂质气体,当浓度超过设定值时进行报警,并启动高压静电模块,将这些杂质颗粒吸附在高压静电的极板上。 2 研究动态 气体传感器测定甲醛成为近年来甲醛检测研究的新热点。早在1983年,压电类甲醛传感器就已问世。这种传感器可以不需要对样品进行任何处理就可以测定,但易受水分子的影响而使晶体震动频率发生漂移,故基本无实用性。为适应室内空气甲醛现场快速检测的要求,目前已开发出不少甲醛快速测定仪,这些仪器可直接在现场测定甲醛浓度,操作方便,适用于室内和公共场所空气中甲醛浓度的现场测定,也适用于环境测试舱法测定木质板材中的甲醛释放量。但这些仪器的工作原理、响应性能、适应范围等都不同。 在测试甲醛、苯等害气体方面,国外比较出名的有:美国ESC公司生产的Z 一300甲醛检测仪、英国PPM公司生产的PPM-400甲醛检测仪;国内的有:江苏安普电子工程有限公司生产的400型甲醛分析仪、北京宾达绿创科技有限公司生产的甲醛测定仪抑一308等。

单片机中断程序大全

单片机中断程序大全公司内部编号:(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引脚

51单片机课设 串口计算器

[二0一三年]

1作品简介 本作品为带有串口通信功能的计算器,PC可通过串口助手软件将算式发送至单片机,单片机立即将计算结果发送回PC,并且在液晶上显示结果。串口通信波特率为两档可调,分别为9600bps和4800bps,可通过两个按键调整,同时在液晶上会显示当前的波特率。 计算器可自动识别输入的字符串,并自动判断输入的算式是否正确;可自动识别算式中包含错误字符、除数为零、浮点数做取余运算等错误。当计算结果超出设定范围时在液晶上出现“超出范围”提示,同时向PC发送“The result is out of range! ”。 2作品整体方案 2.1 串行通信功能: 实验板和PC电脑通过USB线相连,使MCU和PC软件“串口助手”能够进行串行通信。 (1)当实验板上电时默认波特率为9600bps,并发送欢迎词和提示词,例如“Welcome to Calculator V1.0”,"You can press key1 and key2 to change baud rate.".... (2)当实验板上按键1按下时波特率变更为4800bps,按键2按下时波特率变更为9600bps,并用两个LED灯指示相应的波特率。 2.2 计算器功能 通过串口助手发送框发送需要计算的公式,例如20*4=,MCU收到后解析公式并计算结果,将结果返回给串口,例如“The result is 80”,同时将计算结果显示在数码管上,具体细节如下: (1)可以进行加(+)、减(-)、乘(*)、除(\)、取余(%)运算; (2)整形、浮点型运算; (3)当计算结果为整形数时,有效的运算结果范围是-999~9999,超过此结果,返回相应的提示符,例如“The result is out of range.”,液晶上显示“超出范围”; (4)当计算结果为浮点数时,有效的运算结果范围是-99.9~999.9,液晶上保

基于51单片机的温度控制系统的设计

基于单片机的温度控制系统设计 1.设计要求 要求设计一个温度测量系统,在超过限制值的时候能进行声光报警。具体设计要求如下: ①数码管或液晶显示屏显示室内当前的温度; ②在不超过最高温度的情况下,能够通过按键设置想要的温度并显示;设有四个按键,分别是设置键、加1键、减1键和启动/复位键; ③DS18B20温度采集; ④超过设置值的±5℃时发出超限报警,采用声光报警,上限报警用红灯指示,下限报警用黄灯指示,正常用绿灯指示。 2.方案论证 根据设计要求,本次设计是基于单片机的课程设计,由于实现功能比较简单,我们学习中接触到的51系列单片机完全可以实现上述功能,因此可以选用AT89C51单片机。温度采集直接可以用设计要求中所要求的DS18B20。报警和指示模块中,可以选用3种不同颜色的LED灯作为指示灯,报警鸣笛采用蜂鸣器。显示模块有两种方案可供选择。 方案一:使用LED数码管显示采集温度和设定温度; 方案二:使用LCD液晶显示屏来显示采集温度和设定温度。 LED数码管结构简单,使用方便,但在使用时,若用动态显示则需要不断更改位选和段选信号,且显示时数码管不断闪动,使人眼容易疲劳;若采用静态显示则又需要更多硬件支持。LCD显示屏可识别性较好,背光亮度可调,而且比LED 数码管显示更多字符,但是编程要求比LED数码管要高。综合考虑之后,我选用了LCD显示屏作为温度显示器件,由于显示字符多,在进行上下限警戒值设定时同样可以采集并显示当前温度,可以直观的看到实际温度与警戒温度的对比。LCD 显示模块可以选用RT1602C。

3.硬件设计 根据设计要求,硬件系统主要包含6个部分,即单片机时钟电路、复位电路、键盘接口模块、温度采集模块、LCD 显示模块、报警与指示模块。其相互联系如下图1所示: 图1 硬件电路设计框图 单片机时钟电路 形成单片机时钟信号的方式有内部时钟方式和外部时钟方式。本次设计采用内部时钟方式,如图2所示。 单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为此放大器的输入端和输出端,其频率范围为~12MHz ,经由片外晶体振荡器或陶瓷振荡器与两个匹配电容一 起形成了一个自激振荡电路,为单片机提供时钟源。 复位电路 复位是单片机的初始化操作,其作用是使CPU 和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作,以防止电源系统不稳定造成CPU 工作不正常。在系统中,有时会出现工作不正常的情况,为了从异常状态中恢复,同时也为了系统调试方便,需要设计一个复位电路。 单片机的复位电路有上电复位和按键复位两种形式,因为本次设计要求需要有启动/复位键,因此本次设计采用按键复位,如图3。复位电路主要完成系统 图2 单片机内部时钟方式电路 图3 单片机按键复位电路

51单片机中断程序大全

//实例42:用定时器T0查询方式P2口8位控制LED闪烁#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位赋初值

8051的串口波特率的计算(笔记版)

8051的串口波特率的计算 1、方式0的波特率,固定为晶振频率的十二分之一。 2、方式2的波特率,取决于PCON寄存器的SMOD位。PCON是一个特殊的寄 存器,吹了最高位SMOD位,其他位都是虚设的。计算方法如下: SMOD=0,波特率为晶振的1/64; SMOD=1,波特率为晶振的1/32. 3、方式1与方式3的波特率都是由定时器的溢出率决定的。 公式为: BR=(2SOMD/32)*(定时器TI的溢出率) 通常情况下,我们使用定时器的方式2,即比率发生器,自动重载计数常数。 溢出的周期为: T=(256-X)*12/fosc 溢出率为溢出周期的倒数,即 T1=1/T 所以: 式中:SMOD是所选的方式,fosc是晶振频率。X是初始值。 51单片机模拟串口波特率计算方法 1.计算波特率位间隔时间(即定时时间,其实就是波特率的倒数) 位间隔时间(us)=10(6)(us)/波特率(bps)

2.计算机单片机指令周期: 指令周期(us)=12/晶振频率(Mhz) 补充问题:做串口通信时,为什么要把晶振频率设为11.0592,为什么要把波特率设为9600? 先说波特率。波特率从300到115200都可以,甚至更高或更低。一般规范的波特率都是3的倍数,比如9600、19200、38400;但是并不是一定的,波特率也可以是10000或者10001、10002,只要你的设备能产生符合这个要求的频率,尤其是自己用时,波特率都是很随意的,没有限制。只是多数时候为了和电脑配合,波特率才规范为固定的几个值,且为了传输稳定,用9600。 用11.0592晶振的原因是51单片机的定时器导致的。通常用11.0592M晶振是为了得到标准的无误差的波特率。举例说来,如我们要得到的9600的波特率,晶振为11.0592M和12M,定制器1为2SMOD设为1,分别看看那所求的TH1为何值。代入公式: 11.0592M 9600=(2/32)*((11.0592M/12)(256-TH1)) TH 1=250 12M 9600=(2/32)*((12M/12)(256-TH1)) TH1=249.49

基于51单片机的室内甲醛测试系统

基于51单片机的室内甲醛测试系统 甲醛是一种具有刺激气味的无色气体,也是一种潜在的致癌物质,对人体健康有较大的危害,许多疾病的诱发都与甲醛有关,如哮喘,白血病等。甲醛浓度在每立方米空气中达到0.06-0.07mg/m3时,儿童就会发生轻微气喘。当室内空气中甲醛含量为0.1mg/m3时,就有异味和不适感。达到0.5mg/m3时,可刺激眼睛,引起流泪,它对人体健康的危害不容忽视。单片机具有通用性强、体积小、价格低、稳定可靠等突出优点,在智能产品、测控系统等领域得到广泛的应用。本文设计的测试仪可现场可直接显示甲醛浓度值。当其浓度值小于国家规定的标准值(可按键修改)时绿灯亮,可以入住,当超过规定的室内居住标准值时红灯亮开始报警提醒人们暂时不要入住。 1 硬件介绍 基于单片机的室内甲醛测试仪由单片机系统,显示电路,功能键盘,甲醛传感器,测量电路及3位半双积分A/D转换器,报警输出电路构成。系统结构: 1.1测量电路 测量电路由CH20/S-10甲醛传感器,I/U(电流/电压)变换器RCV420芯片,5G14433A/D 转换器等组成。 甲醛传感器由甲醛探头,CH20传感器组成。当空气被内部的采样系统吸收后,将产生的电流信号与相连产生一个与甲醛浓度成正比的电流,该电流经过4~20MA甲醛模块的信号调理,与I/U变换器RCV420芯片转换成0~5V的电压,该电压经过5G14433A/D转换器,与8051单片机相连,在显示器上显示出甲醛的浓度值,当超过国家规定的标准时进行报警。CH20/S-10的相关参数如下:电化学工作原理;量程:0-10PPM;最大过载浓度:50PPM;最小分辨率:±0.05PPM;工作寿命:3年;灵敏度:1200±300nA/ppm,4~20MA甲醛模块;工作温度:-20~45,响应时间(T90):<50s。 Burr-Brown公司生产的RCV420精密I/U变换器能将4~20mA的环路电流变换成0~5V的电压输出。作为一种单片集成电路具有可靠的性能和很低的成本。除具有精密运放和电阻网络外,还集成有10V基准电压源。在不需要外调整的情况下,可以获得86dB的共模抑制比和40V的共模电压输入。在全量程范围内输入阻抗仅有1.5V的压降,对于环路电流具有很好的变换能力。其芯片引脚分布及内部结构图。 在使用中10、11和12脚相连,2、5和13脚相连接地,14和15脚相连接,作为0~5V 电压信号的输出端,当需要调整增益时14和15脚之间接入电位器来调整增益,但这样会减小共模抑制比,减少量是增益增加1%,共模抑制比将减少6dB,因此我们在使用时一般直接将14和15脚短接,7和8脚悬空,4和16脚分别接一个1μF的电容接地,IN+或IN-端接输入的电流信号,一般情况下,只使用一端,具体使用那端取决于输入信号的极性和所需输出电压的极性,我们在使用过程中,使用的是IN+端。 1.2 5G14433A/D转换器 5G14433A/D转换器是国产的广为流行的最典型的双积分3位半A/D转换器它具有抗干扰性能好,转换精度高(相当于11位二进制数),自动校零,自动极性输出,自动量程控制信号输出,动态字位扫描BCD码输出,单基准电压,外接元件少,价格低廉等特点。但其转换速度慢,约1~10次/秒在不要求高速转换的场合。5G14433芯片引脚参数及其与单片机的连接如下: VAG:被测电压VX和基准电压VR的接地端(模拟地)。 VR:外接输入基准电压(+2V或+200mv)

基于51单片机控制的智能窗的设计

基于单片机控制的智能窗的设计 摘要 我们现在使用的窗户大部分采用人工关闭方式,不具有自动防盗、防雨、防煤气中毒等人性化的功能;平时我们外出时经常忘记关闭窗户,遇上下雨时,雨水会进入室内,对室内的电器、摆设等物品造成不必要的损害。晚上睡觉时我们通常把窗户关死,一旦燃气发生泄漏,由于室内不透气造成窒息中毒致残、致死的事件时有发生。为了防盗,我们一般在窗户外面安装防护栏,但如今很多城市为了美化市容通常不允许安装防盗窗。再者,现在使用的窗户大多数是单纯推拉式或平移式的,这给在楼层高的住户擦拭玻璃带来很大困难。本文借助单片机、电子电路及传感器的知识设计了可以实现清晨自动开窗、防雨、智能防盗和可燃性气体泄漏时报警并开窗,从而可解决现实生活中存在的很多问题。本智能窗的设计本着安全、方便、节能、人性化的原则进行,可使现代生活显著提高。 关键词:防风雨防盗 51单片机智能 目录 第1章总体方案的设计 (3) 1.1 本设计的主要任务和内容 (3) 1.2 控制系统架构图 (6) 第2章机械结构的设计 (4) 2.1 自动开关窗机械传动形式设计 (4) 2.1.1自动开关窗任务分析 (4) 2.1.2齿轮齿条参数选择 (4) 第3章自动控制系统主要硬件的设计 (5) 3.1 单片机选型 (5) 3.1.1单片机发展过程 (5) 3.1.2单片机发展趋势 (5) 3.1.3AT89S51单片机简介 (6) 3.2 数据检测传感器的选择 (6) 3.2.1数据检测传感模块组成 (6) 3.2.2传感器选型及电路 (10) 3.3 A/D转换电路的设计.................................................... 11

51单片机定时中断C语言的写法步骤

51单片机定时中断C语言的写法步骤 程序说明:51单片机定时器0工作于方式一,定时50ms中断一次 晶振为12M #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 ET0 = 1; //开定时器0中断 EA = 1; //开总中断 TR0 = 1; //启动定时器0 while(1) { ; } } void Timer0_int() interrupt 1 { //重新装初值 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 } /****************************************************************************** *********************************/ 上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样 #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = 0x3c; //高八位装入初值 TL1 = 0xb0; //低八位装入初值 IE = 0x82;//开总中断并开定时器0中断 TR0 = 1; //启动定时器0 while(1) { ; } }

void Timer0_int() interrupt 1 { //重新装初值 TH1 = 0x3c; //高八位装入初值TL1 = 0xb0; //低八位装入初值}

单片机波特率的计算方法

51单片机波特率计算的公式和方法 51单片机芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。它的各个位的具体定义如下: SM0SM1SM2REN TB8RB8TI RI SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。 波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准9600不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是9600÷10=960字节。 51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。 模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率,就是说定时器1每溢出一次,串口发送一次数据。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。

上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2下定时器1溢出速率的计算公式如下: 溢出速率=(计数速率)/(256-TH1初值) 溢出速率=fosc/[12*(256-TH1初值)] 上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。通常用11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD 设为1,分别看看那所要求的TH1为何值。代入公式: 11.0592M 9600=(2÷32)×((11.0592M/12)/(256-TH1)) TH1=250

基于51单片机的空气智能加湿器设计毕业设计论文

三门峡职业技术学院 信息工程系 毕 业 设 计 论 文 毕业设计题目:基于51单片机的空气智能加湿器设计专业:计算机应用技术(嵌入式方向)

在日常生活中加湿器得到了广泛的应用,但是现有的加湿器都需要手工控制开启和关闭并且不具备对室内空气温湿度的监测,人们在使用过程中存在过度加湿和干烧的问题,不仅给室内空气舒适度造成负面影响并且还存在安全隐患。因此开发设计一种价格低廉、功耗低、具有自动控制功能的加湿器显得尤为必要。本设计采用智能控制,以AT89C51单片机为核心,外接辅助电路,通过实现加湿器的防干烧、声光报警、智能开启和关闭以及室内温湿度的显示功能基本实现加湿器的智能化。 关键词:单片机、智能、加湿器、相对湿度、传感器

摘要-------------------------------------------------------------- 1目录-------------------------------------------------------------- 2第一章任务来源意义及目的------------------------------------------- 3第二章设计方案---------------------------------------------------- 4 2.1 总体设计---------------------------------------------------- 4 2.2 实现方式---------------------------------------------------- 4 2.3 理论基础---------------------------------------------------- 5 2.3.1 单片机---------------------------------------------------- 5 2.3.2 DS18B20传感器--------------------------------------------- 5 2.3.3 1602LCD液晶显示屏----------------------------------------- 6第三章硬件设计---------------------------------------------------- 8 3.1 设计方案---------------------------------------------------- 8 3.2 电路图------------------------------------------------------ 8 3.3 信号分析---------------------------------------------------- 9 3.4 功能描述---------------------------------------------------- 9 3.5 复位电路---------------------------------------------------- 9 3.6液位定位及光电开关------------------------------------------ 10 3.7 1602显示屏------------------------------------------------- 10 3.8 DS18B20温度传感器------------------------------------------ 11 第四章软件设计--------------------------------------------------- 11 4.1整体设计及说明---------------------------------------------- 11 4.2 DS18B20流程设计-------------------------------------------- 13 4.3 1602字符型LCD流程设计------------------------------------- 15 第五章系统调试--------------------------------------------------- 17 第六章总结------------------------------------------------------- 18 参考文献----------------------------------------------------------- 19 致谢------------------------------------------------------------- 20 附录一 LCD控制及显示子程序--------------------------------------- 21

MCS-51单片机串行口工作方式与波特率计算举例

MCS-51单片机串行口工作方式与波特率计算举例 1)方式0 方式0是外接串行移位寄存器方式。工作时,数据从RXD串行地输入/输出,TXD 输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。 实际应用在串行I/O口与并行I/O口之间的转换。 2)方式1 方式1是点对点的通信方式。8位异步串行通信口,TXD为发送端,RXD为 接收端。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。 在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。 (1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入 输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND 和DATA无效,发送停止位,一帧结束,置TI=1。 (2)接收:REN=1后,允许接收。接收器以所选波特率的16倍速率采样RXD 端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。此后: A、若RI=0、SM2=0,则8位数据装入SBUF,停止位入RB8,置RI=1。

基于51单片机的室内空气质量检测系统设计毕业论文

基于单片机的气体质量检测系统的设计 摘要 本论文研究设计了一种用于公共场所及室内具有检测及超限报警功能的室内空气质量检测系统。其设计方案基于89C51单片机,选择瑞士蒙巴波公司的CH20/S-10甲醛传感器和MQ-5气体传感器。系统将传感器输出的4~20mA的标准信号通过以AD0832为核心的A/D转换电路调理后,经由单片机进行数据处理,最后由LCD显示甲醛浓度值。文中详细介绍了数据采集子系统、数据处理过程以及数据显示子系统和报警电路的设计方法和过程。系统对于采样地点超出规定的甲醛容许浓度和天然气规定浓度时采用三极管驱动的单音频报警电路提醒监测人员。同时,操作人员对于具体报警点的上限值可以通过单片机编程进行设置。 另外,该系统对浓度信号进行了信号补偿等处理,减少了测量误差,因此,具有较高的测量精度,而且结构简单,性能优良。本系统的量程为0-10ppm,精度为0.039ppm 。 关键词: 甲醛检测/天然气检测/AT89C52单片机

ABSTRACT This thesis design of a paper for public places and indoor testing and over-limit alarm functions with indoor air quality testing system. Its design is based on 89C51 single chip, with the choice of MQ-5 gas sensors and CH20/S-10 formaldehyde sensor from Switzerland mengbabo company. Sensor system will output 4 ~ 20mA standard signal through the core ADC0832 for A / D conversion circuit after conditioning, by the single-chip microcomputer for data processing, at last display the formaldehyde concentration on the LCD . The article detailed the data acquisition subsystem, data processing and data display and alarm system circuit design method and process. When the sampling sites when the formaldehyde and Natural gas concentration exceeded,To the single-transistor drive circuit audio alarm will sound the alarm,Testing staff to remind. At the same time,The concentration of formaldehyde, Can be set through the single-chip programming. In addition, the system signals a concentration compensation signal processing, a reduction of measurement error, therefore, have a high measurement accuracy, and simple structure, excellent performance. The range of the system for 0-10ppm, accuracy 0.039ppm. Keywords: Formaldehyde detection,Natural gas detection, AT89C52 single-chip

基于51单片机的波特率自动识别系统程序

#include #define uint unsigned int #define uchar unsigned char #define disp_off 0x3e //关显示 #define disp_on 0x3f //开显示 #define disp_x 0xb8 //页地址 #define disp_z 0xc0 //行地址 #define disp_y 0x40 //列地址 #define comm 0 //命令标志 #define dat 1 //数据标志 #define data_ora P0 //MCU P0<------> LCM sbit cs1=P2^0; //cs1=L,选择左半屏 sbit cs2=P2^1; //cs2=L,选择右半屏 sbit rs =P2^2; //H:写数据,L:写指令 sbit rw =P2^3; //H:读,L:写 sbit e =P2^4; //读写使能 sbit bf =P0^7; //执行操作标志 sbit res=P0^4; //复位初始化标志 uchar uart_data,temp,baud_set=0x00; uchar dispnum[90]; uchar baud[5]={0x00,0x09,0x06,0x00,0x00}; uchar r_dat[4]={0x00,0x10,0x00,0x00}; uchar code baudrate[7][5]={ {0x00,0x00,0x03,0x00,0x00}, {0x00,0x00,0x06,0x00,0x00}, {0x00,0x01,0x02,0x00,0x00}, {0x00,0x02,0x04,0x00,0x00}, {0x00,0x04,0x08,0x00,0x00}, {0x00,0x09,0x06,0x00,0x00}, {0x01,0x04,0x04,0x00,0x00}, }; //波特率大小 uchar code hz11[]={ /*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 发--*/ 0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0, 0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00, 0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B, 0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00, /*-- 文字: 送--*/

基于51单片机的智能家居控制系统设计

基于单片机的智能家居控制系统设计 摘要 智能家居是时代发展的产物,是住户想享受快速网上冲浪、便捷实时的通讯、安全防范、丰富娱乐生活、便捷的生活家居管理,优质物业管理等智能化住宅所特有的生活方式,使忙碌一天的人们真正体会到智慧家带来的生活乐趣。本设计以STC89C52RC单片机为核心设计数字时钟和智能窗帘:通过光敏电阻检测光线强弱,当光线强度达到一定的程度时,通过单片机控制电机将窗帘拉上,否则打开窗帘。另外用点阵显示时间和当前室内温度,由于下午十点后基本属于睡眠时间,故忽略光线强度,拉上窗帘并自动切换到手动模式,以节约电能,待第二天起床再将其切换至自动模式。由于一般电机无法自主精确定位,需要辅助器件构成一个闭环系统才能精确的控制窗帘的张合程度,故本设计采用步进电机控制,通过齿轮变速,精确控制窗帘的张合程度,避免窗帘由于过度的张合造成损害,同时由于减少了辅助器件,节省了能源。同时,本设计还选用DS12C887时钟芯片,该芯片内部自带锂电池,即使在断电的情况下仍然能继续工作。该芯片有内置晶振,能够提供准确的时间,正常工作状态下工作一个月误差为+ 1分钟。芯片内部带有闹钟功能,带有世纪寄存器,能够解决世纪问题,还有闰年补偿能多项功能。比只利用晶振驱动的电子时钟功能更强大,时间更准确。 关键词:单片机;智能窗帘;时钟芯片

Abstract Intelligent furniture is outcome of the developing time. It is a special lifestyle with which residents can enjoy fast online surfing, convenient communication, safety guard and which can enrich residents’ entertainment, make their furnishing management more convenient and which can optimize their property management. It can provide people who have been busy for a whole day with entertainment that intelligent ones bring to them. These are designs called digital clock and intelligent curtain that center on STC89C52RC MCU. It detects whether the light is hard or not through photosensitive electric resistance. When light is hard to some level, the curtain is closed under the control of the MCU on the generator, and is opened on the contrary. In addition, it shows time and the present indoor’s temperature with dot matrix. Light can be neglected after 10 o’clock pm when most people have fallen asleep. At this time, the curtain is closed and get to be under manual mode, so as to cut down electricity consumption, it was not turned to automatic mode until residents’ getting up in the morning. Commonly seen generators are not able to fix precisely, they can form a closed loop system to realize precise control on curtains only with the help of some assistant devices. Thus, this design precisely controls curtains under the control of steering engines and with gears to alter the speed. By that, curtains are protected from damages by over-operation. At the same time, less assistant devices are used and energy consumption is cut down. Meanwhile, the design selects DS12C887 chips which contain lithium cells themselves and which can continue operating even when it is out of electricity. Such chips contain some internally installed crystal that can provide precise time with only one minute’s error within one month when operating normally. Such chips also have alarm function and century register. Thus, they can solve century problem. This design is much stronger and preciser than any electric clocks using only crystal to operate. Keywords: MCU; intelligent curtain; clock chip

相关文档
最新文档