历史上的今天
今天是:2024年12月17日(星期二)
2019年12月17日 | 按钮 温度 红外三种方式控制电机转速的单片机程序
2019-12-17 来源:elecfans
电路原理图如下:
单片机源程序如下:
#include #include unsigned int times; unsigned int controlway; unsigned int flag=0; unsigned int flaghongwai=0; //电机控制 sbit out3=P2^2; sbit out1=P2^0; sbit out2=P2^1; //按钮控制 sbit button=P1^0; sbit buttonup=P1^6; sbit buttondown=P1^7; //温度控制 sbit DQ=P3^7; sbit temp=P1^1; //红外控制 sbit hongwai=P1^2; sbit IR = P3^2; unsigned char N[4];//识别码,操作码存放 unsigned char X1,X2,X3,X4; void delay(unsigned char n){ do{ _nop_(); _nop_(); _nop_(); n--; }while(n); } //温度控制 void init_ds18b20(){ unsigned char x=0; DQ=0; delay(120); DQ=1; delay(16); delay(80); } unsigned char readbyte(){ unsigned char i=0; unsigned char date=0; for(i=8;i>0;i--){ DQ=0; delay(1); DQ=1; date>>=1; if(DQ) date|=0x80; delay(11); } return (date); } void writebyte(unsigned char dat){ unsigned char i=0; for(i=8;i>0;i--){ DQ=0; DQ=dat&0x01; delay(5); DQ=1; dat>>=1; delay(5); } } unsigned char retemp(){ unsigned char a,b,tt; unsigned int t; init_ds18b20(); writebyte(0xcc); writebyte(0x44); init_ds18b20(); writebyte(0xcc); writebyte(0xbe); a=readbyte(); b=readbyte(); t=b; //t=t<<8; t<<=8; t=t|a; tt=t*0.0625; return (tt); } //按键检测,电机转速控制 timer0 () interrupt 1 { unsigned char tempread=0; if(button==0){ controlway=1; }else if(temp==0){ controlway=2; }else if(hongwai==0){ controlway=3; }else{ controlway=1; } switch(controlway){ case 1: if(buttonup==0){ if(times<10000){ times+=1000; } }else if(buttondown==0){ if(times>0){ times-=1000; } } delay(100); break; case 2: flag++; if(flag==20) { tempread=retemp(); if(tempread>24&&tempread<34){ times=1000*(tempread-24); }else{ times=10000; } flag=0; } break; case 3: //转换为外部中断 IT0 = 0; EX0 = 1; break; } TH0=0x3c; TL0=0xb0; } //红外接收信号 /********************** 外部中断函数************************/ void exint0() interrupt 0 { unsigned int cnt; unsigned char i; EX0 = 0; cnt = 0; while(!IR) cnt++; //记录引导码时间 if(cnt < 1000){EX0=1;return;} //9ms的计数值(12MHz:1000< cnt <1500) cnt = 0; while(IR) if(cnt++ > 400){EX0=1;return;} //防卡死,超时保护(12MHz: > 300) if(cnt < 200){EX0=1;return;} //(12MHz不分频: <260) for(i=0; i<32; i++) //读取32位位码 { cnt = 0; while(!IR); while(IR) if(cnt++ > 200){EX0=1;return;} //超时保护(12MHz:>=200) N[i/8] >>= 1;
史海拾趣
|
我在BT.656(一个视频数据传输协议)的数据传输协议中看到,对数据的传输格式规定有相当大小的Blanking部分,占到整个数据传输块的很大一部分,我弄不清这个Blanking有什么用处呢?… 查看全部问答> |
|
如果我要扩展串口 用16c554的话 那如果我一个串口用一个中断的话那样中断就太费了 ,我看到网上说可以共享一个中断,不知道怎么操作方法。使用一个irq吗… 查看全部问答> |
|
embedded vb 如何把它编译的程序,转成cab阿。在线等 embedded vb 如何把它编译的程序,转成cab阿。在线等 我初次是用这个软件,在他的模拟ppc 2002上已经可以使用了,但是我想安装在真实的机器上测试,不知道怎么弄 希望搞人指教… 查看全部问答> |




