基于STC89C52光电码盘测速 C程序
测速显示C程序
![测速显示C程序](https://img.taocdn.com/s3/m/f3215f6c1ed9ad51f01df227.png)
#include <REG52.H>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar a,b,c,d;#define LED_DAT P0sbit pin_SpeedSenser = P3^5; //速度传感器脉冲信号输出端接在T1上#define TIME_CYLC 100 //12M晶振,定时器10ms 中断一次我们1秒计算一次转速,1000ms/10ms = 100#define PLUS_PER 2 //码盘的齿数,这里假定码盘上有2个齿,即传感器检测到2个脉冲,认为1圈#define K 1.0 //校准系数sbit zhen1=P1^0;sbit fan1=P1^1;sbit en1=P1^2;uchar code loops[] = {0x7f,0xbf,0xdf,0xef}; //定义显示位控制驱动码uchar code table[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05}; // 0,1,2,3,4,5,6,7,8,9uint Tcounter = 0; //时间计数器bit Flag_Fresh = 0; // 刷新标志bit Flag_clac = 0; //计算转速标志bit Flag_Err = 0; //超量程标志//在数码管上显示一个四位数void DisplayFresh();//计算转速,并把结果放入数码管缓冲区void ClacSpeed();//初始化定时器void init_timer();//延时函数void Delay(uint ms);void it_timer0() interrupt 1 //定时器0中断的响应函数{TF0 = 0; //定时器T0用于数码管的动态刷新TH0 = 0xD8; //初始化TL0 = 0xF0;Flag_Fresh = 1;Tcounter++;if(Tcounter>TIME_CYLC){Flag_clac = 1;//周期到,该重新计算转速了}}void it_timer1() interrupt 3 //中断地址是0x001b{TF1 = 0; //定时器T1用于单位时间内收到的脉冲数,要速度不是很快,T1永远不会益处Flag_Err = 1; //如果速度很高,我们应考虑另外一种测速方法:脉冲宽度算转速}void main(void){init_timer();while(1){zhen1=1;fan1=0;en1=1;Delay(31);en1=0;Delay(169);if(Flag_Fresh){Flag_Fresh = 0;DisplayFresh(); // 定时刷新数码管显示}if(Flag_clac){Flag_clac = 0;ClacSpeed(); //计算转速,并把结果放入数码管缓冲区Tcounter = 0;//周期定时清零TH1=TL1 = 0x00;//脉冲计数清零}if(Flag_Err) //超量程处理{//数码管显示字母'EEEE',开机时初始化为0000a = 0x2c;b = 0x2c;c = 0x2c;d = 0x2c;while(1){DisplayFresh();//不再测速等待复位i}}}}//在数码管上显示一个四位数void DisplayFresh(){P2 =loops[0] ;LED_DAT = table[a];Delay(20);P2 =loops[1] ;LED_DAT = table[b];Delay(20);P2 =loops[2] ;LED_DAT = table[c];Delay(20);P2 =loops[3] ;LED_DAT = table[d];Delay(20);}//计算转速,并把结果放入数码管缓冲区void ClacSpeed(){uint speed ;ulong PlusCounter;PlusCounter = TH1*256 + TL1;speed = K*(PlusCounter/PLUS_PER);//K是校准系数,如速度不准,调节K的大小a = (speed/1000)%10;b = (speed/100)%10;c = (speed/10)%10;d = speed%10;}void init_timer() //初始化{TMOD = 0x51; //定时10毫秒,TOT1选择软件门方式1,T0定时,T1计数,96页可查TH0 = 0xD8; //T0初始化TL0 = 0xF0;ET0=1; //T0中断允许EA=1; //T0中断TR0=1; //TO运行TH1 = 0x00; //T1初始化TL1 = 0x00;ET1=1; //T1中断允许TR1=1; //T1运行zhen1=1;fan1=0;}void Delay(uint ms) //延时0.1ms函数{uchar x,y;for(x=ms;x>0;x--)for(y=11;y>0;y--);}。
【速度】6050STC89C52单片机LCD调试程序
![【速度】6050STC89C52单片机LCD调试程序](https://img.taocdn.com/s3/m/df97de551a37f111f0855bed.png)
【关键字】速度/****************************************MPU6050?IIC尝试程序?使用单片机STC89C52晶振:11.0592M显示:LCD1602功能:?显示加速度计和陀螺仪的10位原始数据****************************************/#include<REG52.H>#include<math.h>#include<intrins.h>//Keil library #include <stdio.h>//Keil library #include <INTRINS.H>typedef unsigned char uchar;typedef unsigned short ushort;typedef unsigned int uint;/****************************************?定义51单片机端口?****************************************/#define DataPort P0 //LCD1602数据端口sbit SCL=P1^0; //IIC时钟引脚定义sbit SDA=P1^1; //IIC数据引脚定义sbit LCM_RS=P2^4; //LCD1602命令端口sbit LCM_RW=P2^5; //LCD1602命令端口sbit LCM_EN=P2^6; //LCD1602命令端口/****************************************定义MPU6050内部地址?****************************************/#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)? #define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)? #define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,//典型值:0x18(不自检,2000deg/s)? #define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率//典型值:0x01(不自检,2G,5Hz)?#define ACCEL_XOUT_H 0x3B#define ACCEL_XOUT_L 0x3C#define ACCEL_YOUT_H 0x3D#define ACCEL_YOUT_L 0x3E#define ACCEL_ZOUT_H 0x3F#define ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43#define GYRO_XOUT_L 0x44#define GYRO_YOUT_H 0x45#define GYRO_YOUT_L 0x46#define GYRO_ZOUT_H 0x47#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B //电源,典型值:0x00(正常启用)#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)?#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取?//****************************************?//定义类型及变量?//****************************************?uchar dis[4];//显示数字(-511至512)的字符数组int dis_data;//变量//int?Temperature,Temp_h,Temp_l;?//温度及高低位数据?//****************************************?//函数声明?//****************************************?void delay(unsigned int k);//延时LCD相关函数?void InitLcd(); //初始化lcd1602?void lcd_printf(uchar *s,int temp_data);void WriteDataLCM(uchar dataW); //LCD数据?void WriteCommandLCM(uchar CMD,uchar Attribc); //LCD指令?void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示一个字符?void DisplayListChar(uchar X,uchar Y,uchar *DData,L); //显示字符串MPU6050操作函数void InitMPU6050(); //初始化MPU6050?void Delay5us();void I2C_Start();void I2C_Stop();void I2C_SendACK(bit ack);bit I2C_RecvACK();void I2C_SendByte(uchar dat);uchar I2C_RecvByte();void I2C_ReadPage();void I2C_WritePage();void display_ACCEL_x();void display_ACCEL_y();void display_ACCEL_z();uchar Single_ReadI2C(uchar REG_Address); //读取I2C数据?void Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C写入数据?//****************************************?//整数转字符串?//****************************************?void lcd_printf(uchar *s,int temp_data){if(temp_data<0){temp_data=-temp_data; *s='-';}else *s='?';*++s=temp_data/100+0x30;temp_data=temp_data%100;//取余运算*++s=temp_data/10+0x30;temp_data=temp_data%10;//取余运算*++s=temp_data+0x30;}//**************************************** // 延时//**************************************** void delay(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++);}} //**************************************** //LCD1602初始化//**************************************** void InitLcd(){WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); DisplayOneChar(0,0,'A');DisplayOneChar(0,1,'G');}//**************************************** //LCD1602写允许//**************************************** void WaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;}//****************************************//LCD1602写入命令//****************************************?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;}//****************************************//LCD1602写入数据?//****************************************void WriteDataLCM(uchar dataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}//****************************************//LCD1602写入一个字符?//****************************************void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData); }//****************************************//LCD1602显示字符串?//****************************************void DisplayListChar(uchar X,uchar Y,uchar *DData,L){uchar ListLength=0; Y&=0x1; X&=0xF;while(L--){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}//**************************************//延时5微秒(STC90C52RC@12M)//不同的工作环境,需要调整此函数//当改用1T的MCU时,请调整此延时函数//**************************************void Delay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//**************************************? //I2C起始信号?//**************************************? void I2C_Start(){SDA=1; //拉高数据线SCL=1; //拉高时钟线Delay5us(); //延时SDA=0; //产生下降沿Delay5us(); //延时SCL=0; //拉低时钟线}//************************************** //I2C停止信号//************************************** void I2C_Stop(){SDA=0; //拉低数据线SCL=1; //拉高时钟线Delay5us();//延时SDA=1; //产生上升沿Delay5us(); //延时}//************************************** //I2C发送应答信号//入口参数://ack(0:ACK 1:NAK)//************************************** void I2C_SendACK(bit ack){SDA=ack; //写应答信号SCL=1; //拉高时钟线Delay5us(); //延时SCL=0; //拉低时钟线Delay5us(); //延时}//**************************************? //I2C接收应答信号?//**************************************? bit I2C_RecvACK(){SCL=1;//拉高时钟线Delay5us(); //延时CY=SDA; //读应答信号SCL=0; //拉低时钟线Delay5us(); //延时return CY;}//**************************************? //向I2C总线发送一个字节数据?//**************************************? void I2C_SendByte(uchar dat){uchar i;for(i=0;i<8;i++) //8位计数器{dat<<=1; //移出数据的最高位SDA=CY; //送数据口SCL=1; //拉高时钟线Delay5us(); //延时SCL=0; //拉低时钟线Delay5us(); //延时}I2C_RecvACK();}//**************************************? //从I2C总线接收一个字节数据?//**************************************? uchar I2C_RecvByte(){uchar i;uchar dat=0;SDA=1; //使能内部上拉,准备读取数据,for(i=0;i<8;i++)//8位计数器{dat<<=1;SCL=1; //拉高时钟线Delay5us();//延时dat|=SDA; //读数据SCL=0; //拉低时钟线Delay5us(); //延时}return dat;}//**************************************? //向I2C设备写入一个字节数据?//**************************************?void Single_WriteI2C(uchar REG_Address,uchar REG_data){I2C_Start(); //起始信号I2C_SendByte(SlaveAddress); //发送设备地址+写信号I2C_SendByte(REG_Address); //内部寄存器地址,I2C_SendByte(REG_data); //内部寄存器数据,I2C_Stop(); //发送停止信号}//**************************************?//从I2C设备读取一个字节数据?//**************************************?uchar Single_ReadI2C(uchar REG_Address){uchar REG_data;I2C_Start();//起始信号??I2C_SendByte(SlaveAddress); //发送设备地址+写信号?? I2C_SendByte(REG_Address); //发送存储单元地址,从0开始?? I2C_Start(); //起始信号?I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号REG_data=I2C_RecvByte(); //读出寄存器数据??I2C_SendACK(1); //接收应答信号I2C_Stop(); //停止信号return REG_data;}//**************************************?//初始化MPU6050?//**************************************?void InitMPU6050(){Single_WriteI2C(PWR_MGMT_1,0x00); //解除休眠状态Single_WriteI2C(SMPLRT_DIV,0x07);Single_WriteI2C(CONFIG,0x06);Single_WriteI2C(GYRO_CONFIG,0x18);Single_WriteI2C(ACCEL_CONFIG,0x01);}//**************************************?//合成数据?//**************************************?int GetData(uchar REG_Address){char H,L;H=Single_ReadI2C(REG_Address);L=Single_ReadI2C(REG_Address+1);return (H<<8)+L; //合成数据}//**************************************?//在1602上显示10位数据?//**************************************?void Display10BitData(int value,uchar x,uchar y){value/=64;//转换为10位数据lcd_printf(dis, value);//转换数据显示DisplayListChar(x,y,dis,4);//启始列,行,显示数组,显示长度}\void main(){delay(500); //上电延时InitLcd(); //液晶初始化InitMPU6050(); //初始化MPU6050delay(150);while(1){Display10BitData(GetData(ACCEL_XOUT_H),2,0); //显示X轴加速度Display10BitData(GetData(ACCEL_YOUT_H),7,0); //显示Y轴加速度Display10BitData(GetData(ACCEL_ZOUT_H),12,0); //显示Z轴加速度Display10BitData(GetData(GYRO_XOUT_H),2,1); //显示X轴角速度Display10BitData(GetData(GYRO_YOUT_H),7,1); //显示Y轴角速度Display10BitData(GetData(GYRO_ZOUT_H),12,1); //显示Z轴角速度delay(500);}}此文档是由网络收集并进行重新排版整理.word可编辑版本!。
光电测速系统软件程序设计C语言
![光电测速系统软件程序设计C语言](https://img.taocdn.com/s3/m/9bc94849852458fb770b5620.png)
#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit key1=P3^0; //程序开始,进入设置最大值阶段第二功能:设置个位数值sbit key2=P3^1; //设置十位数值第二功能:开始/暂停sbit key3=P3^2; //设置百位数值第二功能:显示设定的最大值sbit key4=P3^3; //设置千位数值第二功能:显示测速结果sbit key5=P3^4; //设置最大值完设定工作时间阶段第二功能:结束,并显示----回到程序初始阶段sbit dula=P3^6; //锁存器段选控制sbit wela=P3^7; //锁存器位选控制sbit led1=P1^0; //正在测速sbit led2=P1^1; //超速报警sbit buzz=P1^2; //蜂鸣器控制位sbit led3=P1^3; //反转指示灯sbit led4=P1^4; //正转指示灯sbit count=P3^5; //脉冲输入端口sbit a1=P1^5; //继电器控制高电平接电源sbit a2=P1^6; //继电器控制高电平接地uint ge,shi,bai,qian,num1,num2,num3,num4,aa,bb,t1,t2,t3,t4;uint maxspeed; //最大速uint t2time; //定时时间uchar timeset; //定时标志位long double respeed,respeed1; //测得实际速度uchar key1flag,key2flag,key5flag,keytime; //按键标志位uchar time1count,flagt2,a;/*-------------------字形表0-9---------------------------*/uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};void delay(uint z);void portinit();void timeinit();void time0start();void time1start();void time2start();void display(uchar g,uchar g1,uchar s,uchar s1,uchar b,uchar b1,uchar q,uchar q1);void keyconve();void key1conve();void key2conve();void key5conve();void key5convetime();void key1convetime();void speedcompare();/********************************************************/ /* 延时子函数*/ /* */ /********************************************************/ void delay(uint z){uint x,y,i;for(x=z;x>0;x--)for(y=6;y>0;y--)for(i=19;i>0;i--);}/********************************************************/ /* */ /* 变量、标志位和端口初始化*/ /* */ /********************************************************/ void portinit(){P0=P1=P2=P3=0xff;buzz=0;ge=shi=bai=qian=0;bb=t1=t2=t3=t4=t2time=0;num1=num2=num3=num4=0;aa=key1flag=key2flag=key5flag=time1count=0;maxspeed=respeed=respeed1=0;flagt2=keytime=timeset=0;EA=1;a1=a2=1;T2MOD=0;EXEN2=0;T2CON=0;}/********************************************************/ /* */ /* 定时计数初始化*/ /* */ /********************************************************/ void timeinit(){TH1=0;TL1=0;TH0=(65536-20000)/256;TL0=(65536-20000)%256;TMOD=0x51;}/********************************************************//* 定时器0开启;定时器0关闭;*/ /* 计数器1开启;计数器1关闭;*/ /* 定时器2开启;*/ /********************************************************/ void time0start(){TR0=1;ET0=1;}void time1start(){TR1=1;ET1=1;TH1=TL1=0;}void time2start(){TR2=1;ET2=1;TH2=(65536-50000)/256;TL2=(65536-50000)%256;RCAP2H=(65536-50000)/256;RCAP2L=(65536-50000)%256;}/********************************************************//* 定时器0中断*/ /* *//********************************************************/ void timer0() interrupt 1{TH0=(65536-20000)/256;TL0=(65536-20000)%256;aa++;if(aa==50){aa=0;ET0=0;ET1=0;if(a<1)a++;else{respeed1=(TH1*256+TL1)*60/6.0+time1count*65536*60/6.0;/*假设转一圈接收6个脉冲信号,则一秒所接收的脉冲数m/6*60即为每分钟转数,即m*10*/respeed=respeed1/10;num4=(uint)respeed/1000;num3=(uint)respeed%1000/100;num2=(uint)respeed%100/10;num1=(uint)respeed%10;}time0start();time1start();}}/********************************************************//* 计数器1中断*//********************************************************/void timer1() interrupt 3{ET1=0;time1count++;ET1=1;}/********************************************************//* 定时器2中断*//********************************************************/void timer2() interrupt 5{if(flagt2==1){bb++;if(bb==20){bb=0;if(t2time==0)a2=!a1;else{t2time--;t4=t2time/1000;t3=t2time%1000/100;t2=t2time%100/10;t1=t2time%10;}}}TF2=0;}/********************************************************//* 两个四位数码管动态分时显示*//* -----显示设定值和转速*//* -----倒计时显示*//********************************************************/void display(uchar g,uchar g1,uchar s,uchar s1,uchar b,uchar b1,uchar q,uchar q1) {wela=1;P2=0xf7;wela=0;dula=1;P0=table[g];dula=0;P0=0xff;delay(1);wela=1;P2=0x8f;wela=0;dula=1;P0=table[g1];dula=0;delay(1);wela=1;P2=0xfb;wela=0;dula=1;P0=table[s];dula=0;P0=0xff;delay(1);wela=1;P2=0x4f;wela=0;dula=1;P0=table[s1];dula=0;delay(1);wela=1;P2=0xfd;wela=0;dula=1;P0=table[b];dula=0;P0=0xff;delay(1);wela=1;P2=0x2f;wela=0;dula=1;P0=table[b1];dula=0;delay(1);wela=1;P2=0xfe;wela=0;dula=1;P0=table[q];dula=0;P0=0xff;delay(1);wela=1;P2=0x1f;wela=0;dula=1;P0=table[q1];dula=0;delay(1);}/********************************************************/ /* key1,key2,key3,key4第一功能*/ /* 个位十位百位千位设值*/ /* 设定最高警戒速度按键转换程序*/ /********************************************************/void keyconve(){if(key1==0){delay(10);if(key1==0){if(timeset==0){ge++;if(ge>9)ge=0;while(!key1){display(t1,ge,t2,shi,t3,bai,t4,qian);}}else{t1++;if(t1>9)t1=0;while(!key1){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}if(key2==0){delay(10);if(key2==0){if(timeset==0){shi++;if(shi>9)shi=0;while(!key2){display(t1,ge,t2,shi,t3,bai,t4,qian);}}else{t2++;if(t2>9)t2=0;while(!key2){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}if(key3==0){delay(10);if(key3==0){if(timeset==0){bai++;if(bai>9)bai=0;while(!key3){display(t1,ge,t2,shi,t3,bai,t4,qian);}}else{t3++;if(t3>9)t3=0;while(!key3){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}if(key4==0){delay(10);if(key4==0){if(timeset==0){qian++;if(qian>9)qian=0;while(!key4){display(t1,ge,t2,shi,t3,bai,t4,qian);}}else{t4++;if(t4>9)t4=0;while(!key4){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}}/********************************************************/ /* key1第二功能开始设定最大值*/ /* 初始显示0000 */ /********************************************************/ void key1conve(){if(key1==0){delay(10);if(key1==0){key1flag=!key1flag;while(!key1){display(t1,ge,t2,shi,t3,bai,t4,qian);}}}}/********************************************************/ /* key2第二功能:控制程序开始(暂停)测速*//********************************************************/ void key2conve(){if(key2==0){delay(10);if(key2==0){key2flag=!key2flag;while(!key2){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}/********************************************************/ /* key5第二功能:设定最大速结束进入设倒计时阶段*/ /********************************************************/ void key5conve(){if(key5==0){delay(10);if(key5==0){key5flag=!key5flag;timeset=!timeset;while(!key5){display(t1,ge,t2,shi,t3,bai,t4,qian);}}}}/********************************************************/ /* key5第三功能:开始倒计时*/ /********************************************************/ void key5convetime(){if(key5==0){delay(10);if(key5==0)keytime=!keytime;t2time=1000*t4+100*t3+10*t2+t1;if(t2time==0);elseflagt2=1;while(!key5){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}/********************************************************/ /* key1第三功能:控制正反转*/ /********************************************************/ void key1convetime(){if(key1==0){delay(10);if(key1==0){a1=a2=!a1;while(!key1){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}/********************************************************/ /* 实测转速与警戒速比较超出警报*/ /* 蜂鸣器报警,LED警报灯亮*/ /* 显示正反转,指示灯显示*/ /********************************************************/ void speedcompare(){maxspeed=1000*qian+100*bai+10*shi+ge;if(maxspeed<respeed){if(maxspeed==0) //设定最大速为零即未设置时不警报;{if(a1==1&&a2==1)led3=0;if(a1==0&&a2==0)led4=0;led2=0;buzz=1;}}else{led2=1;buzz=0;led3=1;led4=1;}}/********************************************************//* *//* 主程序*//* *//********************************************************/void main(){portinit(); //开始初始化timeinit(); //定时计数初始化time0start(); //开定时0time1start(); //开计数1TR0=0;TR1=0;while(key1flag==0) //key1标志位:设定最大值,初始显示0000{display(10,10,10,10,10,10,10,10);key1conve();}while(key5flag==0) //key5标志位置1后则设定最大速结束进入设定倒计时阶段{display(t1,ge,t2,shi,t3,bai,t4,qian);keyconve();key5conve();}delay(300);while(keytime==0) //key5,开始倒计时,设0不会有影响{display(t1,num1,t2,num2,t3,num3,t4,num4);keyconve();key5convetime();}time2start(); //定时器2开启while(1){display(t1,num1,t2,num2,t3,num3,t4,num4);key1convetime();key2conve(); //按键key2第二功能开始与暂停测速if(key2flag==1){TR0=1;TR1=1;led1=0;if(a1==1&&a2==1)led3=0;if(a1==0&&a2==0)led4=0;display(t1,num1,t2,num2,t3,num3,t4,num4);speedcompare();}else{if(key2flag==0){TR0=0;TR1=0;led1=1;led3=1;led4=1;buzz=0;a=0;}}if(key3==0) //key3显示设定的最大值{delay(10);if(key3==0){while(key4==1) //切换显示实际转速{display(t1,ge,t2,shi,t3,bai,t4,qian);}}display(t1,num1,t2,num2,t3,num3,t4,num4);}if(key5==0) //程序结束,重新开始进入显示----{delay(10);if(key5==0)goto end;}}end:;}Z111光电测速系统十位个位千位百位/测速/暂停/设值/正反转/显实测速/显设定值个十百千结束设值/ 测速显设/显实每步正反转开/停定值测速结束正转反转。
基于51单片机的光电编码器测速
![基于51单片机的光电编码器测速](https://img.taocdn.com/s3/m/72dafc096294dd88d0d26bee.png)
摘要光电编码器是高精度位置控制系统常用的一种位移检测传感器。
在位置控制系统中,由于电机既可能正转,也可能反转,所以要对与其相连的编码器输出的脉冲进行计数,要求相应的计数器既能实现加计数,又能实现减计数,即进行可逆计数。
其计数的方法有多种,包括纯粹的软件计数和硬件计数。
文中分别对这两种常用的计数方法进行了分析,对其优缺点进行了对比,最后提出了一种新的计数方法,利用80C51单片机内部的计数器实现对光电编码器输出脉冲的加减可逆计数,既节省了硬件资源,又能得到较高的计数频率。
本设计就是由单片机STC89C52RC芯片,光电编码器和1602液晶为核心,辅以必要的电路,构成了一个基于51单片机的光电编码器测速器。
该系统有两个控制按键,分别用于控制每秒的转速和每分钟的转速,并将速度用1602液晶显示出来。
该测速器测速精准,具有实时检测的功能,操作简单。
关键词:光电编码器,51单片机,C语言,1602液晶目录一、设计任务与要求 (3)1.1 设计任务 (3)1.2 设计要求 (3)二、方案总体设计 (4)2.1 方案一 (4)2.2 方案二 (4)2.3 系统采用方案 (4)三、硬件设计 (6)3.1 单片机最小系统 (6)3.2 液晶显示模块 (6)3.3 系统电源 (7)3.4光电编码器电路 (7)3.5 整体电路 (8)四、软件设计 (9)4.1 keil软件介绍 (9)4.2 系统程序流程 (9)五、仿真与实现 (11)5.1 proteus软件介绍 (11)5.2 仿真过程 (11)5.3 实物制作与调试 (12)5.4 使用说明 (13)六、总结 (14)6.1 设计总结 (14)6.2 经验总结 (14)七、参考文献 (15)一、设计任务与要求1.1 设计任务1).对更多小器件的了解2).巩固51单片机和C语言的知识,熟悉单片机和C语言的实际操作运用3).掌握仿真软件的运用和原理图的绘制4).加深焊接的技巧,提高焊接的能力5).熟悉调试方法和技巧,提高解决实际问题的能力6).熟悉设计报告的编写过程1.2 设计要求1).两个按键控制显示每分钟和每秒钟的功能2).74LS74辅助光电编码器测转向3).光电编码器输出脉冲计数4).1602液晶显示转速二、方案总体设计设计一个基于51单片机的光电编码器测测速。
基于STCT89C52单片机的共享单车测速里程超速报警系统设计
![基于STCT89C52单片机的共享单车测速里程超速报警系统设计](https://img.taocdn.com/s3/m/6311ecc9760bf78a6529647d27284b73f2423639.png)
基于STCT89C52单片机的共享单车测速里程超速报警系统设计摘要共享单车已经成为城市出行的主要选择之一,但是其使用过程中也存在超速等问题。
本论文基于STCT89C52单片机设计了一种共享单车测速里程超速报警系统,该系统可以实现对共享单车的测速和计算里程,并根据设置的阈值进行超速报警,从而提高共享单车的行车安全性。
关键词:STCT89C52单片机,共享单车,测速里程,超速报警AbstractShared bicycles have become one of the main choices for urban travel, but there are also problems such as speeding duringthe use process. Based on the STCT89C52 single-chip microcomputer, this paper designs a shared bicycle speed measurement and mileage speed limit alarm system, which can measure the speed and calculate the mileage of shared bicycles, and alarm for speeding according to the set threshold, thereby improving the driving safety of shared bicycles.Keywords: STCT89C52 single-chip microcomputer, shared bicycle, speed measurement and mileage, speed limit alarm一、引言随着人们对环保出行的重视和互联网技术的发展,共享单车已经成为城市出行的主要选择之一。
基于AT89C51的LCD数字测速仪的设计测量汽车速度
![基于AT89C51的LCD数字测速仪的设计测量汽车速度](https://img.taocdn.com/s3/m/cfae675bf7ec4afe04a1df87.png)
目录1、设计背景 (1)2、欲实现功能 (3)3、系统硬件设计 (4)3.1系统框图及测速原理 (4)3.2单片机AT89C52 (5)3.3 OPTC光电断续器 (6)3.4 液晶显示LM016L (7)3.5 三端稳压集成器LM7805 (8)3.6电源 (8)4 、软件设计 (9)4.1 程序流程图 (9)4.2 C语言编程 (9)5 、系统仿真及调试 (10)6 、元器件清单 (11)7 、结语 (11)8 、附录 (13)附录1 实验仿真电路 (13)附录2 源程序 (14)9 、参考文献 (23)10 、致谢 (24)内容摘要随着居民生活水平的不断提高,家用轿车开始普及为人们娱乐、休闲代步的工具。
汽车测速仪能够满足人们最基本的需求,让人们能清楚地知道当前的速度、里程、时间等物理量。
以便做出判断和采取必要的措施,以防止交通事故的发生。
测速仪作为汽车最基本、最重要的部件之一,在汽车的运行过程中起着至关重要的作用。
一个性能良好、测量精确、稳定的测速系统,从某种意义上说,直接影响着汽车乃至司乘人员的生命安全。
本论文主要阐述一种基于光电传感器的汽车测速仪的设计。
以 AT89C52 单片机为核心,OPTC 光断续器测转数,实现对汽车速度、时间的测量统计,并能将汽车的里程数及速度信息送单片机,并通过单片机输出驱动信号,用LCD实时显示。
文章详细介绍了汽车测速仪的硬件电路和软件设计。
硬件部分利用光电传感器组件将汽车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。
软件部分用C语言进行编程,采用模块化设计思想。
该系统硬件电路简单,子程序具有通用性,完全符合设计要求。
关键词:速度;时间;光断续器;单片机;LCD显示The car speedometer design based on the AT89C51ABSTRACTWith the developing of people’s life, the car is becoming the universal tool of transportation and substitute for walking and becoming the first choice of entertainment and exercising. The car speedometer can fulfill the basic need of people’s life, so that they can learn the speed、the mileage 、the time of the car. For that people could take some necessary measures in case of any accident happened by a dangerous speed. As one of the most basic and important part of a ca r, speedometer is taking an important role during the car’s running. To some extent, an accurate and stable speedometer has a effect on the driver’s life directly.In this paper, the car speedometer design based on the photoelectric sensor element is elaborated. By AT89C52 as kernel, using photoelectric sensor element to measure revolution, the measure and statistic are achieved. The car speed can be displayed on LCD. In this article, the hardware circuit and software design of car speedometer instrument are introduced in detail. About the hardware, the pulse number is transmitted of one cycle of the car into Single Chip Microcomputer system. Then the signal processed by Single Chip Microcomputer system is sent to display scream. About the software, in C language; the program is designed in the mode of modules. The system has simple hardware, common sub-program, and meets the demand of design.KEY WORDS:Mileage / speed; Time;temperature;photoelectric sensor element; Single chip microcomputer; LCD基于AT89C51的LCD数字测速仪1设计背景随着人们生活水平的逐渐提高,人们对于生活质量的要求也日益增加,尤其是对出行的要求。
基于单片机的自行车测速系统设计与实现论文
![基于单片机的自行车测速系统设计与实现论文](https://img.taocdn.com/s3/m/533c4dd6a1c7aa00b52acb59.png)
桂林电子科技大学毕业设计(论文)报告用纸第1 页摘要随着社会的进步发展和环保意识的增强,能够锻炼身体,且能环保出行的自行车成了大众的宠儿。
随自行车的快速发展,人们对自行车的功能要求也越来越高。
自行车测速仪通过测量并显示出行时的日期、时间、温度、速度和里程数,能够较好的满足人们对自行车的基本需求。
本设计通过分析自行车测速仪的原理,基于STC89C52单片机和C语言,设计和实现了一种自行车测速系统。
该系统主要包括单片机数据处理、电机测速、温度测量、时钟计时、显示数据、按键控制七大功能模块。
在系统实现中,硬件部分以STC89C52单片机为处理核心,用红外对管传感器将车轮的转数转换为电脉冲,进行处理后送入单片机,通过测量电机转的圈数,经过数据处理得到速度和路程数。
软件部分采用C语言进行编程,实现系统的控制与显示。
本系统的实现达到了预期的设计目标。
关键词:自行车测速;STC89C52单片机;红外对管传感器;C语言AbstractWith the development of social progress and environmental protection consciousness, can physical exercise, andgreen travl bicycle ,became the darling of the public. With the rapid development of bicycle, the bicycle features people are increasingly high requirements. Bicycle speedometer can display the travel date, time, temperature, speed and mileage by measuring,to better me people's basic needs for bicycle.This design through the analysis of principles of bicycle speedometer, based on STC89C52 singlechip and C language,design and implementation of a bicycle speed system.The system includes a SCM data processing, motor speed, temperature measurement, timing, data shows,key control that seven major function module.In the system realization, The hardware part with STC89C52 SCM as core processor. Using the infrared tube sensor will wheel speed is converted into electrical pulses, processed into the microcontroller.By measuring the motor cycles,after data processing, we can know the speed and distance. The software using C language programming ,to realize the system control and display. The realization of this system reaches the expected design goal.Key words:Bicycle Tachometer ;STC89C52 single chip microcomputer; Infrared tube sensor; C language目录引言 (2)1 设计要求 (2)1.1 毕业设计题目 (2)1.2 设计的主要功能 (2)2 工作原理和系统结构 (3)3 硬件设计 (4)3.1 系统总电路图 (4)3.2 单片机控制处理模块 (4)3.3红外对管测速模块 (8)3.4 DS1302时钟芯片模块 (10)3.5 DS1302温度采集模块 (12)3.6 LCD显示模块 (14)3.7 电机驱动模块 (15)3.8 按键功能、供电和串口下载模块 (15)4 软件设计 (18)4.1 Keil uVision 4软件介绍 (18)4.2 程序设计思想与开发环境 (18)4.3 主程序设计 (19)4.4 各个模块程序设计 (19)4.4.1 红外对管测速模块程序设计 (19)4.4.2 DS18B20温度测量模块程序设计 (21)4.4.3 DS1302时钟芯片模块程序设计 (24)4.4.4 LCD12864显示模块程序设计 (27)5 系统测试 (28)5.1 硬件调试 (28)5.2 软件调试 (29)5.3 对实际电路进行测试 (29)6 总结 (31)致谢 (32)参考文献: (33)附录 (34)引言自行车是传统产业,具有100多年的历史,由于环保以及交通的问题,自行车再度成为世界各国特别是发达国家居民喜爱的交通、健身工具。
运动控制-M法T法测速单片机程序设计.
![运动控制-M法T法测速单片机程序设计.](https://img.taocdn.com/s3/m/5af1d9cfff00bed5b9f31dfa.png)
M法、T法测速单片机程序设计摘要本设计为M法、T法测速的单片机程序设计。
使用STC89C52单片机作为控制器,使用该单片机的外部中断和定时器对编码器的输出的脉冲进行采样来计算出电机的转速。
可以使用按键输入来调整M法、T法测速法中Z、Tc和Tt等参数以及测速方法的选择,以此来增强本设计的适应性。
参数选择结果和电机转速计算结果均显示在LCD1602上。
关键字:STC89C52,M法、T法测速,LCD1602,电机转速0 / 30ⅠAbstractThis design as m, t-law velocity measurement of single-chip computer programming. Using STC89C52 single-chip computer as the controller, using the microcontroller's external interrupts and timers for encoder output pulse is sampled to calculate the speed of the motor. Can be adjusted using touchtone m, t law Velocimetry parameters such as z, Tt and Tc, as well as in speed measurement method of choice, as a way to enhance the adaptability of this design. Parameter selection and calculation of motor speed results are available on LCD1602.Keywords:STC89C52,M、T method, the LCD1602, Motor speedⅡ目录第1章绪论 01.1 旋转编码器 01.2 数字测速的精度指标 (1)1.2.1 分辨率 (1)1.2.2 测速误差率 (2)1.3 M法测速 (2)1.4 T法测速 (3)第2章硬件系统设计 (4)2.1 STC89C52介绍 (5)2.2硬件电路 (6)2.3.1时钟电路 (7)2.3.2 显示电路 (7)2.3.3 速度检测电路 (8)2.3.4 按键输入电路 (9)第3章系统软件设计 (9)3.1 主程序设计 (9)3.1 M法测速程序设计 (10)3.2 T法测速程序设计 (11)总结 (13)参考文献 (14)Ⅲ附录A 系统原理图 (15)附录B 主要C语言源程序 (16)Ⅲ第1章绪论1.1旋转编码器旋转编码器是用来测量转速的装置,光电式旋转编码器通过光电转换,可将输出轴的角位移、角速度等机械量转换成相应的电脉冲以数字量输出(REP)。
STC89c52单片机 计算器C语言程序
![STC89c52单片机 计算器C语言程序](https://img.taocdn.com/s3/m/08afcac74793daef5ef7ba0d4a7302768e996f68.png)
STC89c52单片机计算器C语言程序STC89C52单片机计算器C语言程序下面是STC89C52单片机计算器的C语言程序,适用于P2位选P0段选时钟12MHZ。
程序代码如下:includedefine uchar unsigned chardefine uint unsigned intuchar Led[17] = {0x3f。
0x06.0x5b。
0x4f。
0x66.0x6d。
0x7d。
0x07.0x7f。
0x6f。
0x77.0x7c。
0x39.0x5e。
0x79.0x71.0x00};long float Number[]={0,0,0,0};uchar A[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};long int D[] = {0,0,0,0,0,0,0,0};uchar code C[] = {0x0.0xFE。
0xFD。
0xFB。
0xF7.0xEF。
0xDF。
0xBF。
0x7F};uchar k=16;uchar b;long float Out_put;uchar e=0;uchar g=0;uchar L=0;uchar g1=0;uchar g2=0;uchar g3=0;uchar g4=0;char j=-1;uchar m=0;uchar n=0;uchar x=0;程序中包含了头文件和宏定义,以及数码管段选、数码管显示位控制寄存器、数码管显示内容寄存器、数码管位选、按键控制变量等各种变量。
其中,Led数组存储了数码管的段选值,Number数组存储了数字,A数组存储了数码管的位选值,D数组存储了数码管的显示内容,C数组存储了数码管的位选值,k、b、Out_put、e、g、L、g1、g2、g3、g4、j、m、n、x 等变量用于按键控制和运算。
代码中没有明显的格式错误,可以直接使用。
下面是已经修改过的文章:uchar xo = 0./*控制开始计数小数点的变量*/long int result;void Delay(uint o) {uint i。
基于STC89C52光电码盘测速C程序
![基于STC89C52光电码盘测速C程序](https://img.taocdn.com/s3/m/31081c056ad97f192279168884868762caaebb71.png)
TL1=0;
}
TH0=(65536-10000)/256; TL0=(65536-10000)%256; }
文档之家的所有文档均为用户上传分享文档之家仅负责分类整理如有任何问题可通过上方投诉通道反馈
基于STC89C52光电码盘测速C程序
基于STC89C52光电码盘测速C程序#include
#include
#define uint unsignedint
#define uchar unsigned char
P2|=0x08;
}
void main(void)
{
init();
TR0=1; //启动定时器0
TR1=1;
while(1)
{பைடு நூலகம்
dectobit(f);
display();
}
}
timer()interrupt 1 using 2 {
i=i+1;
if(i==100)
{ i=0;
f=TH1*256+TL1;
LED2_data=dec/100;
dec=dec % 100;
LED1_data=dec/10;
dec=dec % 10;
LED0_data=dec;
}
/*显示程序*/
void display()
{
P0=table[LED3_data]; //个位
P2&=~0x01;
delay(10);
P2|=0x01;
P0=table[LED2_data]; //十位
P2&=~0x02;
delay(20);
P2|=0x02;
P0=table[LED1_data];
基于STC89C52单片机毕业设计(完整版)-附-原理图-pcb图-源程序-仿真图
![基于STC89C52单片机毕业设计(完整版)-附-原理图-pcb图-源程序-仿真图](https://img.taocdn.com/s3/m/4fae44b10066f5335b812111.png)
基于STC89C52单片机的电子密码锁学生姓名: xx学生学号: xxxxx院(系):电气信息工程学院年级专业: 2010级电子信息工程2班指导教师:***二〇一三年六月摘要随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事情屡见不鲜,电子密码锁具有安全性能高,成本低,功耗低,操作简单等优点使其作为防盗卫士的角色越来越重要。
从经济实用角度出发,采用51系列单片机,设计一款可更改密码,LCD1602显示,具有报警功能,该电子密码锁体积小,易于开发,成本较低,安全性高,能将其存储的现场历史数据及时上报给上位机系统,实现网络实时监控,方便管理人员及时分析和处理数据。
其性能和安全性已大大超过了机械锁,特点有保密性好,编码量多,远远大于弹子锁,随机开锁成功率几乎为零;密码可变,用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降;误码输入保护。
当输入密码多次错误时,报警系统自动启动;电子密码锁操作简单易行,受到广大用户的亲睐。
关键词单片机, 密码锁, 更改密码, LCD1602目录错误!未定义书签。
1 绪论1.1电子密码锁简介 (1)1.2 电子密码锁的发展趋势 (1)2 设计方案 (3)3 主要元器件 (4)3.1 主控芯片STC89C52 (4)3.2 晶体振荡器 (8)3.3 LCD显示密码模块的设计 (9)3.3.1 LCD1602简介 (9)3.3.2 LCD1602液晶显示模块与单片机连接电路 (11)4 硬件系统设计 (12)4.1 设计原理 (12)4.2 电源输入电路 (12)4.3 矩阵键盘 (13)4.4 复位电路 (14)4.5 晶振电路 (14)4.6 报警电路 (15)4.7 显示电路 (15)4.8 开锁电路 (16)4.9 电路总体构成 (16)5 软件程序设计 (18)5.1 主程序流程介绍 (18)5.2 键盘模块流程图 (19)5.3 显示模块流程图 (21)5.4 修改密码流程图 (22)5.5 开锁和报警模块流程图 (23)6 电子密码锁的系统调试及仿真 (25)6.1硬件电路调试及结果分析 (25)6.2软件调试及功能分析 (25)6.2.1调试过程 (25)6.2.2 仿真结果分 (26)7 结论 (29)参考文献 (30)附录: (31)1 绪论1.1电子密码锁简介电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
基于89C52单片机的智能循迹测速避障小车
![基于89C52单片机的智能循迹测速避障小车](https://img.taocdn.com/s3/m/a038c78b9b6648d7c0c746d2.png)
基于89C52单片机的智能循迹测速避障小车为了参加我校举办的电子科技竞赛,刚刚开始学习单片机的我们,经过讨论,决定做一辆智能循迹测速小车,综合我们搜集的材料以与自己的修改,我们做出了我们的作品。
以下是我们整理的材料:一、原理图1、最小系统我们采用的是89C52单片机来做小车的最小系统,针对自己的需要只把要用到的排针口接了上去,具体电路图如下:2、电机驱动我们采用L293D作为驱动芯片,L293D是一种直流电机控制器件,具有外围电路简单,易于集成、控制等特点,电路图如下:其中我们用TLP521-4光耦器作为电机的稳定,即稳定的是电机的电压,避免电机的电流过大烧坏单片机,起到保护单片机的作用,增加安全性,减少电路干扰,简化电路设计。
其电路图如下:3、测速电路我们采用RPR220反射式光电传感器作为测速器,反射式红外光电传感器模块是一种利用反射式红外光电传感器制成的在传感器的有效检测距离围对被测物体的存在性进行检测的电路装置,由红外光发射接收器、电压变化检测电路、检测灵敏度调节电位器、检测状态指示 LED 灯等四个主要部分组成,额定工作电压 DC3.3V 或 DC5.5V(兼容支持 DC3V~DC5.5V,而无需额外的硬件配置),DC5V 工作电压条件下,约为 60mA,最大不超过 80 mA。
具体电路图如下:4、探测器我们仍采用RPR220反射式光电传感器作为探测器,基于它受被测物体的红外反射特性影响很大,亦能通过检测灵敏度调节电位器进行调节,我们用它来探测黑线(即路线),实现循迹功能。
事实证明它的灵敏度是很高的,具体电路如下:相应的放大电路我们采用LM339芯片作为放大器,LM339芯片通常用作电压比较器,该电压比较器的特点是:1)失调电压小,典型值为2mV;2)电源电压围宽,单电源为2-36V,双电源电压为±1V-±18V;3)对比较信号源的阻限制较宽;4)共模围很大,为0~(Ucc-1.5V)Vo;5)差动输入电压围较大,大到可以等于电源电压;6)输出端电位可灵活方便地选用。
51单片机STC89C52RC上生成CRC16校验码的C语言程序
![51单片机STC89C52RC上生成CRC16校验码的C语言程序](https://img.taocdn.com/s3/m/27e510e7e009581b6bd9ebb5.png)
/*一段简单的51单片机CRC16校验码生成代码,上机测试通过,给那些想拿来主义的朋友们使用或许有用@Email:***********//*本代码在Keil中测试通过,在STC89C52RC单片机上测试通过*/#include <STC89C5xRC.H>#define uint unsigned int#define uchar unsigned char#define ushort unsigned shortuchar test_DATA[6]={0x01,0x06,0x00,0x01,0x00,0x17}; /////待校验数据,一组6字节的数据ushort CRC16num; ///////////CRC16校验码存储变量/////////////标准CRC16校验查询表,不要问我怎么得来的,就是这么用////////////////////////////////// CRC 高位字节值表*/////////////////////////////////////////// static uchar code auchCRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80,0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;////////////////////////////////// CRC 低位字节值表/////////////////////////////////////static uchar code auchCRCLo[] = {0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04,0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8,0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10,0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C,0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0,0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C,0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54,0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98,0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40};////////////////////////////////////////////////////////////////////////////////////////////////////// ///CRC16校验函数,使用函数需输入待校验数组指针(数组名字咯)与数组字节数,返回值为ushort型16位CRC校验码///ushort CRC16(uchar *puchMsg , ushort usDataLen ){uchar uchCRCHi = 0xFF ; /* 高CRC字节初始化*/uchar uchCRCLo = 0xFF ; /* 低CRC字节初始化*/uint uIndex ; /* CRC循环中的索引*/while (usDataLen--) /* 传输消息缓冲区*/ {uIndex = uchCRCHi ^ *puchMsg++ ; /* */uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex]; /* 计算CRC */uchCRCLo = auchCRCLo[uIndex] ; /* */}return (uchCRCHi << 8 | uchCRCLo) ;}////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////主函数////////////////////////////////////////////////////////void main(){///////////////串口通讯相关设定://******************///////////////////////////////////// PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xFD; //设定定时初值TH1 = 0xFD; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1////////////////////////////////////////////////////////////////////////////////////////////////////////计算出CRC16校验码后通过串口发送,可用串口通讯助手等软件察看CRC16校验码////本例计算出的正确的CRC16校验码数值为:0x9804//while(1){CRC16num=CRC16(test_DATA,6);SBUF=CRC16num>>8;while (!TI);TI=0;SBUF=CRC16num;while (!TI);TI=0;}}//////////////////////////////////////////////////////////////////////////////////////////////////////。
基于STC89 C52单片机的测速计设计
![基于STC89 C52单片机的测速计设计](https://img.taocdn.com/s3/m/36bdbbda050876323112121b.png)
优秀 的 电子 产 品。特 别 是 搭 配 传 感 器 与 调 理 电
路, 可 以将 物理 量转化 成数 字信 号 , 使 单 片机 的处
理能 力得 以充 分发挥 。
旋转设 备 , 例如 发动 机 、 水轮、 飞轮等 , 在E t 常 生 活或者 工业 生产 中应用 广泛 。转 速是影 响旋 转
出低 电平信 号 ) 。测 量 转 速 时 , 只需 按 照 图 1所 示 固定 强磁性 的钕 铁 硼磁 铁 以及 霍 尔元 件 , 就可 以实现 转速 信 号 采集 。当转 轮 转 动 时 , 磁 体 随转
轮旋转 , 霍尔 元 件处 的磁 场 强度 随之 呈 周 期性 变 化 。当磁场 周期 性 变 化 时 , 霍 尔元 件 会 产 生 一个
可测量 瞬时转 速 , 又 可 测 量稳 定 情 况 下 的平 均 转
速 。而基 于单 片 机 技 术 的测 速 计 往 往 具 有 功 耗
同周期 变化 的 电压信号 。
低, 价 格低廉 , 使 用方便 等优 点 。
介 于此 , 本文 研究 提 出了一种 基 于 S T C 8 9 C 5 2
在嵌入式行业 , 随着 微 控 制 单 元 MC U 的发 展, 涌 现 出一 大批 集成 度高 , 速度快 , 功 能强 , 可靠 性 好 的控制 系统及 智 能仪器 仪表 产 品。这得 益于
1 工 作 原 理
霍尔元 件是 以霍 尔效应 为原 理制 备 的一种磁
单 片 机可 以有 效 处 理采 样 信 号 的 功能 。此 外 , 较
低 的开发成 本 和较高 的开发 效率 也不 断 吸引开发 人员 让其在 低成 本和 短时 间的条 件下设 计 出性能
传感 器 , 其 结构 是这样 : 一个 金 属或半 导体 薄 片置
基于STC89C52的光电计数器设计
![基于STC89C52的光电计数器设计](https://img.taocdn.com/s3/m/f1f002e19b89680203d8256a.png)
光电计数器的设计摘要本系统采用的是以单片机STC89c52为核心的自动计数器。
采用反射式光电传感器,将红外发光管与光电接收管相邻安放,每当物体通过一次,红外光就被物体反射,光电接收管接收一次,光电接收管的输出电压就发生一次变化,这个变化的电压信号通过放大和处理后,形成计数脉冲,通过光电隔离耦合并行输入至STC89c52单片机的P1口,通过软件控制和键盘设定计数值并用LED加以显示,便可实现对物体的计数统计。
所谓的光电传感器是将光信号转化为电信号的一种传感器。
它的理论基础是光电效应。
这类效应大致可分为三类。
第一类是外光电效应,即在光照射下,能使电子逸出物体表面。
利用这种效应所做成的器件有真空光电管、光电倍增管等。
第二类是内光电效应,即在光线照射下,能使物质的电阻率改变。
这类器件包括各类半导体光敏电阻。
第三类是光生伏特效应,即在光线作用下,物体内产生电动势的现象,此电动势称为光生电动势。
这类器件包括光电池、光电晶体管等。
光电效应都是利用光电元件受光照后,电特性发生变化。
敏感的光波长是在可见光附近,包括红外波长和紫外波长。
市场上的光电计数器采用的光电传感器有摄像头、光电管等,采用的光的种类有普通光和激光,可见光和不可见光等。
光电传感器一般由光源、光学通路和光电元件三部分组成。
光电式传感器是以光电器件作为转换元件的传感器,光电检测方法具有精度高、应用快、非接触等优点,而可测参数多,光电传感器的结构简单,形式灵活多变,因此,光电传感器在检测和控制中应用非常广泛。
关键词计数器光电传感器单片机数码管毕业设计(论文)AbstractThe system USES the microcontroller is STC89c52 as the core of the automatic counters. By reflecting photoelectric sensor, the infrared luminescence tubes and optoelectronics receiving tube adjacent put, whenever objects through time, infrared light is reflected, photoelectric receiving tube receiving once, photoelectric receiving pipe output voltage has a time change, this change voltage signal by amplifying and processed, forming counting pulses, through photoelectric isolating coupling parallel input to STC89c52 MCU P1 mouth, through software control and keyboard Settings count value and LED to display, can realize to the object counting statistics. This counter can or mechanical artificially count way into electronic counted, and using LED digital pipe display, can be applied to many professions, to meet modern production and lifestyle needs.The so-called photoelectric sensor is light signals are converted to electrical signals a sensor. It is based on the theory of the photoelectric effect. This kind of effect can be roughly classified into three kinds. The first kind is the photoelectric effect, namely in light, can make the electronic escaping surface. Using this effect made devices have vacuum phototubes, photomultiplier tubes, etc. The second type is inside the photoelectric effect, that is, in a light ray can make physical resistivity change. Such devices including various types of semiconductor photoconductive resistance. The third type is born volts effect that light, the object in light effect produced inside emf phenomenon, this electromotive force called light born electromotive force. Such devices including si-based ones, photoelectric transistor, etc. The photoelectric effect is using photoelectric element by light, the electrical characteristics change. Sensitive in the visible light wavelengths is near, including infrared wavelength and uv wavelength. Market photoelectric counter adopts photoelectric sensor have a webcam, phototubes to wait, use light species are regular light and laser, visible and not visible, etc. Photoelectric sensor are usually made of light source, optical path and photoelectric element of three parts. Photoelectric sensor is photoelectric device as conversion of components of the sensor, photoelectric detection method has high accuracy, application quickly, non-contact wait for an advantage, but measurable lots of parameters, photoelectric sensor of simple structure, and flexible in form, therefore, photoelectric sensors in the detection and control is widely used.keywordscounter, photoelectric sensor, microcontroller, digital tube.毕业设计(论文)目录一、绪论 (1)二、光电计数器整体设计过程 (2)(一)光电计数器的设计任务及要求 (2)1.1设计任务 (2)1.2设计要求 (2)1.3总分析结果 (2)(二)设计方案的选择 (3)2.1采用组合逻辑电路和时序逻辑电路实现 (3)2.2以CD4518为核心的计数电路 (3)2.3以STC89c52为核心的计数电路 (4)2.4方案的选定 (4)2.5系统结构框图 (5)(三)硬件结构及功能 (5)3.1 芯片STC89c52 (5)3.1.1 STC89c52的引脚功能 (5)3.1.2 STC89c52系统结构图 (9)3.2 光电传感器的原理和特点 (9)3.2.1 反射式光电传感器 (9)3.2.2 光敏二极管 (11)3.2.3 红外发光二极管的原理和特性 (12)3.3 蜂鸣器的原理 (12)3.3.1 电磁式蜂鸣器内部结构 (13)3.3.2电磁式蜂鸣器驱动原理 (14)3.4 LED数码显示器简介 (15)3.4.1 LED数码显示器的结构 (15)3.4.2 LED数码显示器的两种接法 (15)(四)硬件电路设计 (16)4.1 发射与接收电路 (16)4.2 计数与显示电路 (17)4.3 报警电路 (18)(五)电路设计原理 (18)5.1计数测量 (18)5.2 中断方式计数 (19)(六)软件程序设计 (19)(七)结论 (23)参考文献 (24)附录 (25)附录一 (25)附录二 (26)一、绪论所谓的光电计数器是利用光电元件制成的自动计数装置。
单片机89C52光电转速测量系统
![单片机89C52光电转速测量系统](https://img.taocdn.com/s3/m/2806c3ec3186bceb19e8bbf8.png)
《光电技术》综合设计报告书 设计题目:基于89c52的光电转速测量系统 姓名:学号:<一)课程设计报告的内容4.实时测量设计过程 块给出原理图,分别说明各模块、各元件的选择<包括:设计方案、上机设计与仿真结果、硬件实验方案)一、 总体设计方案:转速测量系统设计分为三个部分,分别为光电传感器部分、整流滤波部分和单片机与数码管显示部分<如下图)。
各部分模块的功能:①传感器:用来对信号的采样。
②整形电路:对传感器送过来的信号进行放大和整形,在送入单片机进行数据的处理转换。
③单片机:对处理过的信号进行转换成转速的实际值,送入LED ④LED 显示:用来对所测量到的转速进行显示。
1.光电传感器:本设计采用H42B6槽型光电传感器<原理图如下)。
<还可以采用H2018、ITR9606等传感器)转盘结构如下,转盘在槽型光电传感器中转动时,光电晶体管接收到的是脉冲信号。
2.整流滤波部分:本设计采用双电压比较器LM393N,它有两个输入端和两个输出端,一个基准电压端。
输入端电压低于基准电压时输出端为高电平,反之输出端电平翻转。
3. 单片机与数码管显示部分:本设计采用单片机STC89C52,方便烧写程序,且内存比51大。
数码管采用四位七段数码管,引脚较少,方便焊接电路。
(1)STC89C52引脚图(2>晶振电路部分(3>复位电路部分 (4>四位共阴数码管设计图示系统图,硬件图,结1.光电传感器部分2.显示部分<信号从15脚输入)3.系统总程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intuint mm=1234。
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}。