?? dw.c
字號:
#include <REGX51.H>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uint dw;
int Mispeed=25; //步進電機起始速度
int Maspeed=100; //步進電機最高轉動速度
int speed; //速度計數
int loopdj; //控制電機線圈的接通
int ldata;
int count; //顯示速度值
uint id=0; //電機狀態(tài)判斷
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
uint code DHTab[]={76,0xd3,86,95,100,106,110,115,119,123};
uint code DLTab[]={0,0x00,86,73,212,0,214,96,163,165};
void delay(uint n); //延時函數
void viewkey(); //鍵值處理程序
uchar scankey(uchar num); //鍵值掃描程序
void led_xianshi(); //速度值顯示函數
//延時函數
void delay(uint n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<200;j++);
}
//主函數
void main()
{
speed=Mispeed; //初值
loopdj=0xf7;
P1=0xff;
TMOD=0x10; //定時器T1初始化
TH1=0x4c;
TL1=0x00;
EA=1; //開總中斷
ET1=1;
while(1)
{
P3=0xff;
if((P3&0xff)!=0xff)
{
delay(2);
if((P3&0xff)!=0xff)
{
dw=scankey(P3); //掃描鍵值
}
}
viewkey(); //鍵值處理及顯示
}
}
//鍵值掃描程序
uchar scankey(uchar num)
{ uchar keynum;
ldata=num;
while((P3&0xff)!=0xff); //按鍵完全釋放
switch(ldata)
{
case 0xfe:keynum=1;break;
case 0xfd:keynum=2;break;
case 0xfb:keynum=3;break;
case 0xf7:keynum=4;break;
}
return(keynum); //返回鍵值
}
//鍵值處理及顯示程序
void viewkey()
{
//啟動步進電機模塊
if(dw==1)
{
TR1=1; //啟動T1
speed=25;
dw=5;
led_xianshi(); //顯示速度值
}
//加速模塊
else if(dw==2)
{
while((P3&0xff)!=0xff); //按鍵完全釋放
speed++;
if(speed>Maspeed)
{speed=100;}
dw=5;
led_xianshi(); //顯示速度值
}
//減速模塊
else if(dw==3)
{
speed--;
if(speed<Mispeed)
{speed=25;}
dw=5;
led_xianshi(); //顯示速度值
}
//停止電機轉動模塊
else if(dw==4)
{
TR1=0; //停止T1
P1=0xff; //P1.4-P1.7均置高
speed=0;
dw=5;
led_xianshi(); //顯示速度值
}
else if(dw==5)
{
//TR1=1; //啟動T1
dw=5;
led_xianshi(); //顯示速度值
}
}
//速度值顯示函數
void led_xianshi()
{
int led_bai,led_shi,led_ge;
count=speed;
led_bai=count/100; //顯示值百位
led_shi=count%100/10; //顯示值十位
led_ge =count%10; //顯示值個位
P2=0x7f; //個位位選
P0=table[led_ge]; //顯示個位數
delay(2);
P2=0xbf; //十位位選
P0=table[led_shi]; //顯示十位數
delay(2);
P2=0xdf; //百位位選
P0=table[led_bai]; //顯示百位數
delay(2);
}
//定時器T1中斷處理函數
void T1INT() interrupt 3 using 2
{
int t;
TR1=0;
t=speed-Mispeed;
TH1=DHTab[t/10]; //重新置初值
TL1=DLTab[t%10];
loopdj=loopdj<<1; //循環(huán)輸出控制步進電機
P1=loopdj;
id++;
if(id==4)
{
id=0; //重新置0
loopdj=0xf7; //循環(huán)
}
TR1=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -