亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
單片機串口控制步進電機的源程序
[打印本頁]
作者:
ZCRhandsome
時間:
2018-7-6 09:30
標題:
單片機串口控制步進電機的源程序
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P1
//因為步進電機是減速步進電機,減速比的1/64 ,
//所以N=64時,步進電機主軸轉一圈
//使用前請短接J2跳線帽,串口助手設置為比特率9600,無校驗位,停止位1,發送數據為16進制形式
uchar code CCW[8] ={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆時鐘旋轉相序表
uchar code CW[8] ={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正時鐘旋轉相序表
uchar code table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數碼管顯示數字表
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit FMQ=P3^6; //蜂鳴器
uchar flag_rec;
uint data_rec;
/*********************************************************************
中斷服務特殊功能寄存器配置
*********************************************************************/
void init_interrupt()
{
TMOD=0x20; //用定時器1設置串口波特率 9600
TH1=0xfd; //T1定時器裝初值
TL1=0xfd; //T1定時器裝初值
TR1=1; //啟動T1定時器
REN=1; //串口初始化
SM0=0; //設定串口工作方式1
SM1=1; //設定串口工作方式1
EA=1; //開啟總中斷
ES=1; //開啟串口中斷
}
/*************************************************************
串口中斷函數
**************************************************************/
void receive() interrupt 4
{
RI=0; //RI清零;因為收到數據或者或者發送了數據會由硬件置1
data_rec=SBUF; //接收數據SBUF,將SBUF中的數據讀走給data_rec,即將計算機的數據接收。
//a=SBUF;
ES = 0; //關閉串口中斷
flag_rec=1; //中斷標志位置1
}
/*****************************************************************
設置延時
******************************************************************/
void delaynms(uint aa)
{
uchar bb;
while(aa--)
{
for(bb=0;bb<115;bb++) //1ms基準延時程序
{ ; }
}
}
void delay500us()
{
int j;
for(j=0;j<57;j++)
{
;
}
}
/*******************************************
蜂鳴器
******************************************/
void beep()
{
uchar t;
for(t=0;t<100;t++)
{
delay500us();
FMQ=!FMQ; //產生脈沖
}
FMQ=1; //關閉蜂鳴器
}
/***************************************
正反轉設計
****************************************/
void motor_ccw_deta(uchar deta,uchar speed) //電機逆時針轉deta度 deta=11時30度,deta=66d時180度
{
uchar i;
while(deta--)
{
for(i=0;i<8;i++) //數組循環一周
{
P1=CCW[i];
delaynms(speed); //調節轉速
}
}
}
void motor_cw_deta(uchar deta,uchar speed) //電機順時針轉deta度 deta=11時30度,deta=66時180度
{
uchar i;
while(deta--)
{
for(i=0;i<8;i++) //內部循環一周
{
P1=CW[i];
delaynms(speed); //調節轉速
}
}
}
void Digital_tube_display(uint num)
{
//4位數碼管顯示控制
uchar temp,count;
temp = 0;
count = 0;
if(num > 999 || num < 0) return;
while(num)
{
temp = num % 10;
P0 = table[temp];
switch(count) //判斷
{
case 0:P2_3=0;break; //點亮第1個燈
case 1:P2_2=0;break; //點亮第2個燈
case 2:P2_1=0;break; //點亮第3個燈
case 3:P2_0=0;break; //點亮第4個燈
}
delaynms(5);
switch(count) //判斷
{
case 0:P2_3=1;break; //點亮第1個燈
case 1:P2_2=1;break; //點亮第2個燈
case 2:P2_1=1;break; //點亮第3個燈
case 3:P2_0=1;break; //點亮第4個燈
}
num = num / 10;
count++;
}
}
/**************************************************************
中斷處理函數
****************************************************************/
void deal_interrupt_Date(uint dat)
{
SBUF=dat; //發送數據dat_rec到SBUF,即將單片機的數據發送到計算機
while(!TI);
TI = 0;
beep();
motor_cw_deta(11,1); //電機順轉deta度,deta=11時30度,deta=66時180度
delaynms(10*dat); //由于目前還沒有找到如何傳輸255以上的數的方法,所以先乘以10
motor_ccw_deta(11,1); //電機逆轉deta齲琩eta=11時30度,deta=66時180度
ES=1; //打開串口中斷
flag_rec=0;
}
/**************************************************************
主程序
****************************************************************/
void main()
{
init_interrupt();
Digital_tube_display(0);
while(1)
{
Digital_tube_display(data_rec);
P1=0xf0;
if(flag_rec) //收到串口數據時,處理
{
deal_interrupt_Date(data_rec);
}
}
}
復制代碼
作者:
lindeijun1
時間:
2020-2-22 10:42
謝謝樓主分享
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1