|
300黑幣
C51單片機(jī)產(chǎn)生PWM輸入L298驅(qū)動(dòng)電機(jī),控制啟停,正反轉(zhuǎn),加減速,這些都可以實(shí)現(xiàn),可以以反饋到LCD1062上。但是通過(guò)T1定時(shí)器、外中斷INT1組合測(cè)速(脈沖頻率)無(wú)法實(shí)時(shí)顯示到屏幕,就是可以顯示,但是數(shù)值不變化。也不知道為啥。
個(gè)人認(rèn)為問(wèn)題應(yīng)該出在測(cè)速模塊或者外中斷1函數(shù)里,但是找不出原因,請(qǐng)大佬看看!
單片機(jī)源程序如下:
- #include <reg52.h>
- #include<string.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit lcdrs=P2^0; //寄存器選擇,0:數(shù)據(jù)寄存器。1:為狀態(tài)/命令寄存器
- sbit lcden=P2^1; //--LCD控制引腳
- sbit speed=P3^2; //測(cè)速端口
- sbit ENA=P2^2; //電機(jī)使能控制端
- sbit key1=P1^0; //啟動(dòng)按鍵
- sbit key2=P1^1; //正轉(zhuǎn)按鍵
- sbit key3=P1^2; //反轉(zhuǎn)按鍵
- sbit key4=P1^3; //加速按鍵
- sbit key5=P1^4; //減速按鍵
- sbit key6=P1^5; //停止按鍵
- sbit Zheng=P1^6; //正轉(zhuǎn)輸出端口
- sbit Fan=P1^7; //反轉(zhuǎn)輸出端口
- uchar Timer0_flag=4;
- uchar Timer0_BiaoZhi=0;//初始化占空比為1:3(高:低)
- uchar gewei;
- uchar shiwei;
- uchar baiwei;
- /******標(biāo)志位設(shè)置*****/
- uchar KEY1=0;//優(yōu)先級(jí)標(biāo)志
- uchar KEY2=0;//加速標(biāo)志
- uchar INT1_FLAG=0;
- uchar COUNTER_high=0;
- uchar COUNTER_low=0;
- uchar SUM=0;
- uint TIMER1_COUNTER=0;
- uint INT1_tingzhi=0; //在要測(cè)速時(shí)置0
- /****面板顯示****/
- uchar code lcd_desktop10[]="WUU";//不顯示
- uchar code lcd_desktop11[]="RUN";//運(yùn)行
- uchar code lcd_desktop12[]="FWD";//正轉(zhuǎn)
- uchar code lcd_desktop13[]="REV";//反轉(zhuǎn)
- uchar code lcd_desktop14[]="JIA";//加速
- uchar code lcd_desktop15[]="JAN";//減速
- uchar code lcd_desktop16[]="OFF";//停止
- uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};//要顯示的轉(zhuǎn)速數(shù)字。
- //-----lcd液晶屏頭文件-----//
- /**延時(shí)函數(shù)**/
- void delayms(uchar xms)
- {
- uchar i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /****LCD寫(xiě)命令******/
- void write_command(uchar com)//com寫(xiě)入命令
- {
- lcdrs=0; //LED選擇輸入命令
- P0=com; //向P0口輸入命令39-32端口
- delayms(2); //延時(shí)
- lcden=1; //打開(kāi)LCD使能
- delayms(2); //一個(gè)高脈沖
- lcden=0; //關(guān)閉LED使能
- }
- /**************LCD寫(xiě)數(shù)據(jù),來(lái)源網(wǎng)上*********/
- void write_data(uchar date)//數(shù)據(jù)為DATA
- {
- lcdrs=1; //設(shè)置為輸入數(shù)據(jù)
- P0=date; //將數(shù)據(jù)賦給P0口
- delayms(2); //延時(shí)
- lcden=1; //置高
- delayms(2);
- lcden=0; //置低完成高脈沖
- }
- /********LCD初始化,來(lái)源網(wǎng)上****************/
- void lcd_init()//顯示模式設(shè)置
- {
- lcden=0;
- write_command(0x38); //設(shè)置16×2 顯示5×7點(diǎn)陣,8位數(shù)據(jù)接口
- write_command(0x0c); //設(shè)置開(kāi)始顯示不顯示光標(biāo)(指令4)
- write_command(0x06); //寫(xiě)一個(gè)字符后地址指針加一(指令3)
- write_command(0x01); //顯示清零數(shù)據(jù)指針清零(指令1)
- }
- /**電機(jī)初始化函數(shù)**/
- void motor_init(void)
- {
- ENA=0; // 停止
- }
- void ZhongDuanKaiQi(void)
- {
- EA=1;
- ET0=1; //計(jì)時(shí)器0允許中斷。產(chǎn)生脈沖。
- ET1=1; //計(jì)時(shí)器1允許中斷。對(duì)低電平進(jìn)行計(jì)時(shí)。
- //EX1=1; //INT0允許中斷。測(cè)速。由外部來(lái)啟動(dòng)。
- IT1=1; //外部中斷1低電平觸發(fā)。
- PX1=0; //外中斷0為低級(jí)中斷。
- PT0=1; //定時(shí)器0為高優(yōu)先級(jí)中斷
- PT1=0; //外中斷1為低優(yōu)先級(jí)中斷
- TMOD=0x12;//定時(shí)器工作方式控制
- }
- /***定時(shí)器T1初始化!!!等待外部脈沖的到來(lái)***/
- void Timer1_init(void)
- {
- TH1=0;
- TL1=0; //等待外部脈的到來(lái)。INT1
- }
- /*****定時(shí)T0初始化*****/
- void Timer0_init(void)
- {
- TH0=0;
- TL0=0;
- TR0=1;
- }
- /********測(cè)速模塊,顯示速度*******/
- void speed_test(void)
- {
- // TIMER1_COUNTER;
- COUNTER_high=TH1;
- COUNTER_low=TL1;
- SUM=COUNTER_high*256+COUNTER_low+TIMER1_COUNTER*65536;//得到的是多少u(mài)s。
- //count:每百16位進(jìn)1,16位為65536;TH1:每8位進(jìn)1,8位為256;TL1:每次進(jìn)1;即TL1由0增加度到內(nèi)255時(shí),TH1加1,TL1回0,TH1由0增加到65535時(shí),count加1,TH1回0,三者之和為總次數(shù)。
- SUM=SUM/1000; //化為毫秒。
- SUM=1000/SUM; //圈每秒。
- SUM=SUM*60; //圈每分鐘;三位數(shù)。
- gewei=SUM%10+0x30;
- shiwei=SUM/10%10+0x30;
- baiwei=SUM/100+0x30;
- write_command(0x80+0x4c);
- write_data(baiwei);
- write_command(0x80+0x4d);
- write_data(shiwei);
- write_command(0x80+0x4e);
- write_data(gewei);
- SUM=0;
- TIMER1_COUNTER=0;
- }
- /********外中斷1函數(shù)**********/
- void INT1_QIDONG() interrupt 2
- {
- INT1_tingzhi++;
- if(INT1_tingzhi==5)
- {
- INT1_tingzhi=5;EX1=0;//關(guān)閉中斷。
- }
- if(INT1_tingzhi<=4)
- {
- INT1_FLAG++;
- if(INT1_FLAG==2)
- {
- INT1_FLAG=0;TR1=0;speed_test();
- }
- else
- {
- Timer1_init();
- TR1=1;
- }
- }
- }
- /******定時(shí)器T1計(jì)數(shù)*******/
- void Timer1_QIDONG() interrupt 3
- {
- TIMER1_COUNTER++;
- }
- /****T0中斷發(fā)出信號(hào)并進(jìn)行通道選擇****/
- void Timer0() interrupt 1
- {
- Timer0_flag--;
- if((Timer0_BiaoZhi)>=(Timer0_flag))
- {
- if(KEY2==0)
- {
- Zheng=1;Fan=0;
- }
- else
- {
- Zheng=0;Fan=1;
- }
- }
- else
- {
- Zheng=0;Fan=0;
- }
- if(Timer0_flag==0) Timer0_flag=5;
- }
- void Guan(void)
- {
- ET0=0;
- EX1=0;
- ET1=0;
- }
- void keyscan() //按鍵掃描函數(shù)
- {
- uint i=0;
- if(key1==0) //按鍵K1啟動(dòng)按鈕。只有該位啟動(dòng)時(shí),后面的幾位才有效。啟動(dòng)T0計(jì)數(shù)開(kāi)始發(fā)出脈沖。
- {
- delayms(10);
- if(key1==0)
- {
- while(!key1);
- KEY1=5;
- Fan=0;
- Zheng=0;
- ENA=1;
- KEY2=0;//初始化為正轉(zhuǎn)。
- Timer0_BiaoZhi=0;
- Timer0_flag=4;
-
- ZhongDuanKaiQi();//開(kāi)啟中斷
- Timer0_init();// 初始化并開(kāi)始發(fā)出脈沖外中斷已經(jīng)開(kāi)啟。
- EX1=1; //外中斷開(kāi)啟;測(cè)速,顯示速度。
-
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop10);i++)//顯示正轉(zhuǎn)。
- write_data(lcd_desktop11[i]);
- }
- }
-
- if(key2==0&&KEY1==5) //按鍵K2按下,(正轉(zhuǎn))只改變轉(zhuǎn)向(標(biāo)志位改變輸出端口)
- {
- delayms(10);
- if(key2==0)
- {
- while(!key2);
- KEY2=0; //正轉(zhuǎn)標(biāo)志,電機(jī)正向旋轉(zhuǎn)。
- //KEY2=(~1);
-
- KEY1=5;
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉(zhuǎn)。
- write_data(lcd_desktop12[i]);
- }
- }
-
- if(key3==0&&KEY1==5) //按鍵K3按下,(反轉(zhuǎn))只改變轉(zhuǎn)向
- {
- delayms(10);
- if(key3==0)
- {
- while(!key3);
- KEY2=~0; //反轉(zhuǎn)標(biāo)志。
- //KEY2=(~0);
-
- KEY1=5;
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop12);i++)//顯示反轉(zhuǎn)。
- write_data(lcd_desktop13[i]);
- }
- }
- if(key4==0&&KEY1==5) //按鍵K4按下,(加速)改變裝入的數(shù)值?循環(huán)次數(shù)?執(zhí)行if里面的語(yǔ)句,通過(guò)size++來(lái)改變幅值的頻率
- {
- delayms(10);
- if(key4==0)
- {
- while(!key4);
- if(Timer0_BiaoZhi<4)
- {
- Timer0_BiaoZhi++;
- }
- else
- {
- Timer0_BiaoZhi=4;
- }
- EX1=1;
- KEY1=5;
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop13);i++)//顯示加速。
- write_data(lcd_desktop14[i]);
- }
-
- }
-
- if((key5==0)&&(KEY1==5)) //按鍵K5按下,(減速)對(duì)其它標(biāo)志位沒(méi)有影響。
- {
- delayms(5);
- if(key5==0)
- {
- while(!key5);
- if(Timer0_BiaoZhi==0)
- {
- Timer0_BiaoZhi=0;
- }
- else
- {
- Timer0_BiaoZhi--;
- }
- EX1=1;
- KEY1=5;
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop14);i++)//顯示減速。
- write_data(lcd_desktop15[i]);
- }
- }
- if((key6==0)&&(KEY1==5))//按鍵K6按下,電機(jī)停止轉(zhuǎn)動(dòng)使能端和計(jì)數(shù)啟動(dòng)關(guān)閉,計(jì)數(shù)器工作否?設(shè)立標(biāo)志位。此按鍵按下后除K1外無(wú)法啟動(dòng)
- {
- delayms(5);
- if(key6==0)
- {
- while(!key6);
- //置位,保證后續(xù)操作正常。
-
-
-
- EA=0; //總中斷關(guān)
- motor_init(); //電機(jī)關(guān)
- Guan();
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop15);i++)//顯示停止。
- write_data(lcd_desktop16[i]);
- }
- }
- }
-
- /*主函數(shù)*/
- void main()
- {
- ZhongDuanKaiQi();//初始化
- motor_init(); //電機(jī)停止
- lcd_init();
- while(1)
- {
- keyscan();
-
- }
- }
復(fù)制代碼
11111.jpg (28.62 KB, 下載次數(shù): 52)
下載附件
2020-5-17 20:52 上傳
電路圖和程序,可以仿真。
電機(jī)控制及顯示.zip
(68.96 KB, 下載次數(shù): 8)
2020-5-17 20:54 上傳
點(diǎn)擊文件名下載附件
|
|