我现在想做这样一个单片机控制步进电机的程序,下面只是个程序的一部分 有思路但是具体语句实现上还有问题,具体如下:
我想让单片机的P0^0口(外部装置有个对准位置的红外接收管,每到一个特定的位置接收管电压变小,给P00口一个负跳变)做一个下跳沿触发,然后单片机开始发送脉冲控制步进电机转动,并且通过计数累计脉冲个数(比如说i个,顺便问一下如果i很大的话,单片机能存储下来吗?),等到转一周后又接收到负跳变,此时返回i的值(就是让我知道i是多少就行了,单片机上无显示器,可以寄存器放置吗,这里我也不太懂……),大概就是这样,我自己也在网上找这样类似的程序,但是太模糊了,找出来的都不太相关
如果哪位大神能发个链接地址啥的,我也很感谢啊,谢谢各位能看完这么多字!!
此帖出自
小平头技术问答
看了几遍,大致上弄明白了楼主要什么。
1、“顺便问一下如果i很大的话,单片机能存储下来吗”?绝对没有问题。一个字节放不下用两个字节,两个放不下用四个。
2、“单片机上无显示器,可以寄存器放置吗”?本来就是放在寄存器里面,即使有显示,也是显示寄存器里面的值。
首先检测下降沿可以用中断,比自己检测要及时一些,也比较方便,当然如果时间要求不是很严的话自己写代码用IO口监测也是可以的。
另外的问题楼上已经说了,一个自己不够用两个字节,两个不够用4个,总有够用的时候。存数也是本来就是要存到到内存中的(不能叫寄存器了),当然存放到寄存器中也是可以的。
sbit P0_0=P0^0;
sbit P1_3=P1^3; //假设从P1.3输出脉冲
unsigned int ijishu; //每产生一个脉冲计数一次
unsigned int iCount; //延时间隔时间变量
unsigned int iPulseCount; //脉冲脉宽时间变量
void timer0() interrupt 1
{//定时器每1毫秒一次中断
TH0=(65536-1000)/256; //设1ms中断1次TH1初值
TL0=(65536-1000)%256; //设1ms中断1次TL1初值
if(iCount)
{//计数未到0,计数器-1
iCount--;
}
if(iPulseCount)
{//计数未到0,计数器-1
iPulseCount--;
}
}
main()
{
TMOD = 0X01;//方式1
EA = 1;//总中断允许
ET0 = 1;//定时器0中断允许
TR0 = 1;//启动定时器0
P1_3 = 0; //脉冲输出端口,假设输出正脉冲,预置为低电平
while(P0_0) //当P0^0口高电平时计数开始
{
iCount = 1000;//每间隔1000*1ms = 1秒一个脉冲,t值变化改此处
while(iCount);//等待2秒中
P1_3 = 1; //置为高电平,输出正脉冲
iPulseCount = 10;//每间隔10*10ms = 100ms一个脉冲,脉宽变化改此处
while(iPulseCount);//高电平保持100ms
P1_3 = 0; //置为低电平,输出正脉冲结束
ijishu=ijishu+1;
}
}
一周热门 更多>