每50ms來(lái)了多少脈沖,那定時(shí)器就不能50ms中斷一次,盡量快的中斷會(huì)比較好,2個(gè)變量計(jì)數(shù),一個(gè)計(jì)算50ms,一個(gè)累加脈沖
創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷,提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站開(kāi)發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷、小程序定制開(kāi)發(fā)、公眾號(hào)商城、等建站開(kāi)發(fā),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。
如果是循環(huán)中查詢的話我一般這樣做, 定義一個(gè)變量比如keyLastStatus來(lái)記錄上一次掃描周期的狀態(tài)
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; //記錄上一次的狀態(tài)
}
1、使用T0和T1外部脈沖計(jì)數(shù),控制兩個(gè)電機(jī),到1700個(gè)脈沖電機(jī)停止,
--統(tǒng)計(jì)脈沖個(gè)數(shù),用外部中斷更好。
--T0和T1,留著定時(shí)用。
用四個(gè)按鍵控制,按鍵1控制電機(jī)正轉(zhuǎn),按鍵2控制電機(jī)反轉(zhuǎn),按鍵3控制電機(jī)1正轉(zhuǎn),按鍵4控制電機(jī)2正轉(zhuǎn)。
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;
}
}
}
}
給你個(gè)基本框架,根據(jù)你的具體要求再修改吧。使用定時(shí)1中斷實(shí)現(xiàn),精度比較高。
#include reg52.h
#define PERIODH (65536l-10000l)/0X100 //設(shè)10ms中斷1次TH1初值
#define PERIODL (65536l-10000l)%0X100 //設(shè)10ms中斷1次TL1初值
sbit P1_1 = 0x91; //假設(shè)從P1.1輸出脈沖
unsigned int iCount; //延時(shí)間隔時(shí)間變量
unsigned int iPulseCount; //脈沖脈寬時(shí)間變量
void timer1() interrupt 3 using 1
{//定時(shí)器每0.01秒一次中斷
TH1 = PERIODH;
TL1 = PERIODL;
if(iCount)
{//計(jì)數(shù)未到0,計(jì)數(shù)器-1
iCount--;
}
if(iPulseCount)
{//計(jì)數(shù)未到0,計(jì)數(shù)器-1
iPulseCount--;
}
}
main()
{
TMOD = 0X10;//方式1
EA = 1;//總中斷允許
ET1 = 1;//定時(shí)器1中斷允許
TR1 = 1;//啟動(dòng)定時(shí)器1
P1_1 = 0; //脈沖輸出端口,假設(shè)輸出正脈沖,預(yù)置為低電平
while(1)
{
iCount = 200;//每間隔200*10ms = 2秒一個(gè)脈沖,t值變化改此處
while(iCount);//等待2秒中
P1_1 = 1; //置為高電平,輸出正脈沖
iPulseCount = 10;//每間隔10*10ms = 100ms一個(gè)脈沖,脈寬變化改此處
while(iPulseCount);//高電平保持100ms
P1_1 = 0; //置為低電平,輸出正脈沖結(jié)束
}
}
不知道你想怎么用這個(gè)脈沖函數(shù),這個(gè)函數(shù)是莫非是傳說(shuō)中的沖擊函數(shù)? 就是那個(gè)負(fù)無(wú)窮到正無(wú)窮只有0點(diǎn)有非零值,切負(fù)無(wú)窮到正無(wú)窮積分等于1的那個(gè)?這個(gè)函數(shù)在程序?qū)崿F(xiàn)中,只有參與卷積才有用,儲(chǔ)存的時(shí)候頂多就是一個(gè)沖擊中心位置,既然是單位的,沖擊強(qiáng)度也省了,重載個(gè)卷積算符吧
隨便你輸入那一天都能算星期幾
#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);
}