|
- #include <reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LED P1
- //因為步進(jìn)電機(jī)是減速步進(jìn)電機(jī),減速比的1/64 ,
- //所以N=64時,步進(jìn)電機(jī)主軸轉(zhuǎn)一圈
- //使用前請短接J2跳線帽,串口助手設(shè)置為比特率9600,無校驗位,停止位1,發(fā)送數(shù)據(jù)為16進(jìn)制形式
- uchar code CCW[8] ={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆時鐘旋轉(zhuǎn)相序表
- uchar code CW[8] ={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正時鐘旋轉(zhuǎn)相序表
- uchar code table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數(shù)碼管顯示數(shù)字表
- 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;
- /*********************************************************************
- 中斷服務(wù)特殊功能寄存器配置
- *********************************************************************/
- void init_interrupt()
- {
- TMOD=0x20; //用定時器1設(shè)置串口波特率 9600
- TH1=0xfd; //T1定時器裝初值
- TL1=0xfd; //T1定時器裝初值
- TR1=1; //啟動T1定時器
- REN=1; //串口初始化
- SM0=0; //設(shè)定串口工作方式1
- SM1=1; //設(shè)定串口工作方式1
- EA=1; //開啟總中斷
- ES=1; //開啟串口中斷
- }
- /*************************************************************
- 串口中斷函數(shù)
- **************************************************************/
- void receive() interrupt 4
- {
- RI=0; //RI清零;因為收到數(shù)據(jù)或者或者發(fā)送了數(shù)據(jù)會由硬件置1
- data_rec=SBUF; //接收數(shù)據(jù)SBUF,將SBUF中的數(shù)據(jù)讀走給data_rec,即將計算機(jī)的數(shù)據(jù)接收。
- //a=SBUF;
- ES = 0; //關(guān)閉串口中斷
- flag_rec=1; //中斷標(biāo)志位置1
- }
- /*****************************************************************
- 設(shè)置延時
- ******************************************************************/
- void delaynms(uint aa)
- {
- uchar bb;
- while(aa--)
- {
- for(bb=0;bb<115;bb++) //1ms基準(zhǔn)延時程序
- { ; }
- }
- }
- void delay500us()
- {
- int j;
- for(j=0;j<57;j++)
- {
- ;
- }
- }
- /*******************************************
- 蜂鳴器
- ******************************************/
- void beep()
- {
- uchar t;
- for(t=0;t<100;t++)
- {
- delay500us();
- FMQ=!FMQ; //產(chǎn)生脈沖
- }
- FMQ=1; //關(guān)閉蜂鳴器
- }
- /***************************************
- 正反轉(zhuǎn)設(shè)計
- ****************************************/
- void motor_ccw_deta(uchar deta,uchar speed) //電機(jī)逆時針轉(zhuǎn)deta度 deta=11時30度,deta=66d時180度
- {
- uchar i;
- while(deta--)
- {
- for(i=0;i<8;i++) //數(shù)組循環(huán)一周
- {
- P1=CCW[i];
- delaynms(speed); //調(diào)節(jié)轉(zhuǎn)速
- }
- }
- }
- void motor_cw_deta(uchar deta,uchar speed) //電機(jī)順時針轉(zhuǎn)deta度 deta=11時30度,deta=66時180度
- {
- uchar i;
- while(deta--)
- {
- for(i=0;i<8;i++) //內(nèi)部循環(huán)一周
- {
- P1=CW[i];
- delaynms(speed); //調(diào)節(jié)轉(zhuǎn)速
- }
- }
- }
- void Digital_tube_display(uint num)
- {
- //4位數(shù)碼管顯示控制
-
- 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++;
- }
- }
- /**************************************************************
- 中斷處理函數(shù)
- ****************************************************************/
- void deal_interrupt_Date(uint dat)
- {
- SBUF=dat; //發(fā)送數(shù)據(jù)dat_rec到SBUF,即將單片機(jī)的數(shù)據(jù)發(fā)送到計算機(jī)
- while(!TI);
- TI = 0;
- beep();
- motor_cw_deta(11,1); //電機(jī)順轉(zhuǎn)deta度,deta=11時30度,deta=66時180度
- delaynms(10*dat); //由于目前還沒有找到如何傳輸255以上的數(shù)的方法,所以先乘以10
- motor_ccw_deta(11,1); //電機(jī)逆轉(zhuǎn)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) //收到串口數(shù)據(jù)時,處理
- {
- deal_interrupt_Date(data_rec);
- }
-
- }
- }
復(fù)制代碼 |
評分
-
查看全部評分
|