十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
每50ms来了多少脉冲,那定时器就不能50ms中断一次,尽量快的中断会比较好,2个变量计数,一个计算50ms,一个累加脉冲
创新互联致力于互联网网站建设与网站营销,提供成都做网站、网站设计、外贸营销网站建设、网站开发、seo优化、网站排名、互联网营销、小程序定制开发、公众号商城、等建站开发,创新互联网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。
如果是循环中查询的话我一般这样做, 定义一个变量比如keyLastStatus来记录上一次扫描周期的状态
sbit key=P2.0; char keyLastStatus=0;
keyLastStatus=key; //初始化
while (1)
{
if(key==1 keyLastStatus!=key) Todo(); //上升沿
if(key==0 keyLastStatus!=key) Todo(); //下降沿
keyLastStatus=key; //记录上一次的状态
}
1、使用T0和T1外部脉冲计数,控制两个电机,到1700个脉冲电机停止,
--统计脉冲个数,用外部中断更好。
--T0和T1,留着定时用。
用四个按键控制,按键1控制电机正转,按键2控制电机反转,按键3控制电机1正转,按键4控制电机2正转。
2、例程:
#includereg51.h
sbit k1 = ?; //自己定义
sbit k2 = ?
sbit k3 = ?
sbit k4 = ?
sbit DIAN1 = ?
sbit DIAN2 = ?
sbit DIAN3 = ?
sbit DIAN4 = ?
sbit SEN1 = ?
sbit SEN2 = ?
void delay(unsigned int x)
{
unsigned int m, n;
for(m = x; m 0; m--) for(n = 115; n 0; n--);
}
void main(void)
{
TMOD = 0x55;
IE = 0x8a;
while(1) {
if (!k1) {
delay(10);
if (!k1) {
while(!k1);
TH0 = (65536 - 1700) / 256;
TL0 = (65536 - 1700) % 256;
SEN1 = 0;
DIAN1 = 0; DIAN2 = 1;
SEN1 = 1;
TR0 = 1;
}
}
if (!k2) {
delay(10);
if (!k2) {
while(!k2);
TH0 = (65536 - 1700) / 256;
TL0 = (65536 - 1700) % 256;
SEN1 = 0;
DIAN1 = 1; DIAN2 = 0;
SEN1 = 1;
TR0 = 1;
}
}
if (!k3) {
delay(10);
if (!k3) {
while(!k3);
TH1 = (65536 - 1700) / 256;
TL1 = (65536 - 1700) % 256;
SEN2 = 0;
DIAN3 = 0; DIAN4 = 1;
SEN2 = 1;
TR1 = 1;
}
}
if (!k4) {
delay(10);
if (!k4) {
while(!k4);
TH1 = (65536 - 1700) / 256;
TL1 = (65536 - 1700) % 256;
SEN2 = 0;
DIAN3 = 1; DIAN4 = 0;
SEN2 = 1;
TR1 = 1;
}
}
}
}
给你个基本框架,根据你的具体要求再修改吧。使用定时1中断实现,精度比较高。
#include reg52.h
#define PERIODH (65536l-10000l)/0X100 //设10ms中断1次TH1初值
#define PERIODL (65536l-10000l)%0X100 //设10ms中断1次TL1初值
sbit P1_1 = 0x91; //假设从P1.1输出脉冲
unsigned int iCount; //延时间隔时间变量
unsigned int iPulseCount; //脉冲脉宽时间变量
void timer1() interrupt 3 using 1
{//定时器每0.01秒一次中断
TH1 = PERIODH;
TL1 = PERIODL;
if(iCount)
{//计数未到0,计数器-1
iCount--;
}
if(iPulseCount)
{//计数未到0,计数器-1
iPulseCount--;
}
}
main()
{
TMOD = 0X10;//方式1
EA = 1;//总中断允许
ET1 = 1;//定时器1中断允许
TR1 = 1;//启动定时器1
P1_1 = 0; //脉冲输出端口,假设输出正脉冲,预置为低电平
while(1)
{
iCount = 200;//每间隔200*10ms = 2秒一个脉冲,t值变化改此处
while(iCount);//等待2秒中
P1_1 = 1; //置为高电平,输出正脉冲
iPulseCount = 10;//每间隔10*10ms = 100ms一个脉冲,脉宽变化改此处
while(iPulseCount);//高电平保持100ms
P1_1 = 0; //置为低电平,输出正脉冲结束
}
}
不知道你想怎么用这个脉冲函数,这个函数是莫非是传说中的冲击函数? 就是那个负无穷到正无穷只有0点有非零值,切负无穷到正无穷积分等于1的那个?这个函数在程序实现中,只有参与卷积才有用,储存的时候顶多就是一个冲击中心位置,既然是单位的,冲击强度也省了,重载个卷积算符吧
随便你输入那一天都能算星期几
#includetime.h
#includestdio.h
#includeconio.h
#includestddef.h
#define BIG 1
#define SMALL 2
void info()
{
textcolor(RED);
gotoxy(37,11);
puts("WEEKDAY");
}
int runyear(int year) /*判断是否为闰年*/
{
return !(year%4)year%100||!(year%400);
}
void main()
{
int year,month,day,yeardata,monthdata;
char *weekday;
time_t lt;
struct tm *ptr;
lt=time(NULL);
do
{
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Year: ");
scanf("%d",year);
}while(year0||year9999);
yeardata=runyear(year);
do
{
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Month:");
scanf("%d",month);
}while(month1||month12);
switch(month) /*大小月,2月*/
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: monthdata=BIG; break;
case 4:
case 6:
case 9:
case 11: monthdata=SMALL; break;
case 2: monthdata=3; break;
}
l1:
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Day:");
scanf("%d",day);
if(monthdata==BIG)/*大月*/
{
if(day1||day31)
goto l1;
}
if(monthdata==SMALL)/*小月*/
{
if(day1||day30)
goto l1;
}
if(yeardata==0monthdata==3)/*平年2月*/
{
if(day1||day28)
goto l1;
}
if(yeardata==1monthdata==3)/*闰年2月*/
{
if(day1||day29)
goto l1;
}
ptr=localtime(lt);
weekday=asctime(ptr);
ptr-tm_mday=day;
ptr-tm_mon=month;
ptr-tm_year=year;
weekday=asctime(ptr);
clrscr();
gotoxy(13,30);
puts(weekday);
}