哪位大佬能看看我這程序,為啥我按鍵輸入一度角度值,電機不能轉轉動對應角度,是脈沖函數部分錯了嗎,會的大佬能不能改一下,有感謝
US7S]@$EDC4{9LQTPR}93LQ.png (132.93 KB, 下載次數: 47)
下載附件
protues仿真圖
2019-5-30 21:23 上傳
單片機源程序如下:
- #include <reg52.h>
- #include<string.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit lcdrs=P2^0; //寄存器選擇,0:數據寄存器。1:為狀態/命令寄存器
- sbit lcden=P2^1; //--LCD控制引腳
- sbit angle=P3^3; //測轉角端口
- sbit ENA=P2^2; //電機使能控制端
- sbit Zheng=P2^5; //正反轉電平設置端口
- sbit Fan=P2^6;
- uchar Timer0_flag=0;
- uchar Timer0_BiaoZhi=0;//初始化占空比為1:3(高:低)
- uchar da;
- uchar gewei;
- uchar shiwei;
- uchar baiwei;
- uchar n;
- uchar angel;
- int aa[3];
- /******標志位設置*****/
- uchar KEY1=0;//優先級標志
- uchar KEY2=0;//加速標志
- uchar INT1_FLAG=0;
- uchar COUNTER_high=0;
- uchar COUNTER_low=0;
- uchar SUM=0;
- uint TIMER1_COUNTER=0;
- uint INT1_tingzhi=0; //在要測速時置0
- /****面板顯示****/
- uchar code lcd_desktop11[]="stop";//停止
- uchar code lcd_desktop12[]="ford";//正轉
- uchar code lcd_desktop13[]=" fanzhuang";//反轉
- uchar code lcd_desktop21[]=" speedup";//加速
- uchar code lcd_desktop22[]=" speeddn";//減速
- uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};//要顯示的轉速數字。
- //-----lcd液晶屏頭文件-----//
- /**延時函數**/
- void delayms(uchar xms)
- {
- uchar i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /****LCD寫命令******/
- void write_command(uchar com)//com寫入命令
- {
- lcdrs=0;
- P0=com;
- delayms(2);
- lcden=1;
- delayms(2);
- lcden=0;
- }
- /**************LCD寫數據*********/
- void write_data(uchar date)//數據為DATA
- {
- lcdrs=1;
- P0=date;
- delayms(2);
- lcden=1;
- delayms(2);
- lcden=0;
- }
- /********LCD初始化****************/
- void lcd_init()//顯示模式設置
- {
- lcden=0;
- write_command(0x38);
- write_command(0x0c);
- write_command(0x06);
- write_command(0x01);
- }
- /**電機初始化函數**/
- void motor_init(void)
- {
- ENA=0; // 停止
- }
- void ZhongDuanKaiQi(void)
- {
- EA=1;
- ET0=1; //計時器0允許中斷。產生脈沖。
- ET1=1; //計時器1允許中斷。對低電平進行計時。
- //EX1=1; //INT0允許中斷。測速。由外部來啟動。
- IT1=1; //低電平觸發。
- PX1=0; //低級中斷。
- PT0=1;
- PT1=0;
- TMOD=0x12;//定時器工作方式控制
- }
- /***定時器T1初始化!!!等待外部脈沖的到來***/
- void Timer1_init(void)
- {
- TH1=0;
- TL1=0; //等待外部脈的到來。INT1
- }
- /*****定時T0初始化*****/
- void Timer0_init(void)
- {
- TH0=0;
- TL0=0;
- TR0=1;
- }
- /********測速模塊,顯示速度*******/
- /*void speed_test(void)
- {
- // TIMER1_COUNTER;
- COUNTER_high=TH1;
- COUNTER_low=TL1;
- SUM=COUNTER_high*256+COUNTER_low+TIMER1_COUNTER*65536;//得到的是多少us。
- SUM=SUM/1000; //化為毫秒。
- SUM=1000/SUM; //圈每秒。
- SUM=SUM*60; //圈每分鐘;三位數。
- gewei=SUM%10;
- shiwei=SUM/10%10;
- baiwei=SUM/100;
- write_command(0xc0);
- write_data(baiwei);
- write_command(0xc1);
- write_data(shiwei);
- write_command(0xc2);
- write_data(gewei);
- SUM=0;
- TIMER1_COUNTER=0;
- }
- /********外中斷1函數**********/
- void INT1_QIDONG() interrupt 2
- {
- INT1_tingzhi++;
- if(INT1_tingzhi==5)
- {
- INT1_tingzhi=5;EX1=0;//關閉中斷。
- }
- if(INT1_tingzhi<=4)
- {
- INT1_FLAG++;
- if(INT1_FLAG==2)
- {
- INT1_FLAG=0;TR1=0;speed_test();
- }
- else
- {
- Timer1_init();
- TR1=1;
- }
- }
- }
- /******定時器T1計數*******/
- void Timer1_QIDONG() interrupt 3
- {
- TIMER1_COUNTER++;
- }
- /**相位測量并輸出!!!!!出現問題???**/
- /*void xiangwei_test(void)
- {
- uchar i=0,j=0;
- //while((P2^3==0)&&(P2^4==0));
- //if((P2^3==0)&&(P2^4==0))
- {
- //delayms(5);
- if(P2^3==1)
- {
- write_command(0x01);
- write_command(0x80);for(i=0;i<=3;i++) write_data(lcd_desktop13[i]);//反轉。
- j++;//反轉
- }
-
- if(P2^4==1)
- {
- write_command(0x01);
- write_command(0x80);for(i=0;i<=3;i++) write_data(lcd_desktop12[i]);//正轉。
- j++;
- }
- }
- }
- /****T0中斷發出信號并進行通道選擇****/
- 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 pulsegenerate(){
- int g,N;
- N=angel*40;
- for(g=0;g<N;g++)
- {
- ENA=0;
- delayms(10);
- ENA=1;
- delayms(10);
- ENA=0;
- delayms(10);
- }
- }
- void keyscan() //按鍵掃描函數
- {
- uint i=0;
- KEY1=5;
- Fan=0;
- Zheng=0;
- //ENA=1;
- KEY2=0;//初始化為正轉。
- Timer0_BiaoZhi=0;
- Timer0_flag=4;
-
- ZhongDuanKaiQi();//開啟中斷
- Timer0_init();// 初始化并開始發出脈場外中斷已經開啟。
- EX1=1; //外中斷開啟;測速,顯示速度。五次后結束關閉外中斷1。出現問題!!!
-
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉。
- write_data(lcd_desktop12[i]);
-
- }
- /******鍵盤0-9輸入模塊*******/
- uchar keyin(){ //鍵盤
- uchar temp;
- uchar com,com1,com2;
- P1=0xf0;
- if(P1!=0xf0){
- com1=P1;
- P1=0x0f;
- com2=P1;
- }
- P1=0xf0;
- while(P1!=0xf0);
- temp=com1|com2;
- if(temp==0xee)com=0x01;
- if(temp==0xed)com=0x02;
- if(temp==0xeb)com=0x03;
- if(temp==0xde)com=0x04;
- if(temp==0xdd)com=0x05;
- if(temp==0xdb)com=0x06;
- if(temp==0xbe)com=0x07;
- if(temp==0xbd)com=0x08;
- if(temp==0xbb)com=0x09;
- if(temp==0x7e)com=0x0a;
- if(temp==0x7d)com=0x00;
- if(temp==0x7b)com=0x0b;
- return com;
- }
- void xianshi(){
- uchar a;
- uchar d=1;
- uchar da;
- P1=0xf0;
- for(a=0;a<d;a++){
- int i1=0;
- while(P1==0xf0);
- da=keyin(); //調用keyin函數
-
- if(da>=0x00&&da<=0x09){
- aa[i1]=da;
- i1++;
- if(i1==3){
- angel=aa[0]*100+aa[1]*10+aa[2];
- i1=0;
- }
- }
- Timer0_flag = angel;
- //if(da>=0x00&&da<=0x09){aa[i1]=da;i1++;if(i1==3){angel1=aa[0]*100+aa[1]*10+aa[2];i1=0;}}
- if(4==d) {
- while(1){
- da=keyin(); //調用keyin函
- if(da==0x0a){
- lcd_init();
- //xianshi();
- }else if(da==0x0b){
- keyscan();
- }
- }
- }
-
- if(da==0x01){
- write_data('1');
- d++;
- }else if(da==0x02){
- write_data('2');
- d++;
- }else if(da==0x03){
- write_data('3');
- d++;
- }else if(da==0x04){
- write_data('4');
- d++;
- }else if(da==0x05){
- write_data('5');
- d++;
- }else if(da==0x06){
- write_data('6');
- d++;
- }else if(da==0x07){
- write_data('7');
- d++;
- }else if(da==0x08){
- write_data('8');
- d++;
- }else if(da==0x09){
- write_data('9');
- d++;
- }else if(da==0x00){
- write_data('0');
- d++;
- }/*else if(da==0x0a){
- lcd_init();
- //xianshi();
- }else if(da==0x0b){
- pulsegenerate();
- break;
- }*/
-
- }
- }
- /***************/
- /*****************/
-
- /* if((key2==0)&&(KEY1=5)) //按鍵K2按下,(正轉)只改變轉向(標志位改變輸出端口)
- {
- delayms(10);
- if(key2==0)
- {
- while(!key1);
- KEY1=5;
- Fan=0;
- Zheng=0;
- ENA=1;
- KEY2=0;//初始化為正轉。
- Timer0_BiaoZhi=0;
- Timer0_flag=4;
-
- ZhongDuanKaiQi();//開啟中斷
- Timer0_init();// 初始化并開始發出脈場外中斷已經開啟。
- EX1=1; //外中斷開啟;測速,顯示速度。五次后結束關閉外中斷1。出現問題!!!
-
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉。
- write_data(lcd_desktop12[i]);
- }
- }
-
- if((key3==0)&&(KEY1=5)) //按鍵K3按下,(反轉)只改變轉向
- {
- delayms(10);
- if(key3==0)
- {
- while(!key3);
- KEY2=~0; //反轉標志。
- //KEY2=(~0);
- xiangwei_test();
- KEY1=5;
- lcd_init();
- for(n=0;n<10;n++){
- write_data(lcd_desktop13[n]);}
- }
- }
- if((key4==0)&&(KEY1==5)) //按鍵K4按下,(加速)改變裝入的數值?循環次數?執行if里面的語句,通過size++來改變幅值的頻率
- {
- delayms(10);
- if(key4==0)
- {
- while(!key4);
- if(Timer0_BiaoZhi<4)
- {
- Timer0_BiaoZhi++;
- }
- else
- {
- Timer0_BiaoZhi=4;
- }
- EX1=1;
- KEY1=5;
- lcd_init();
- for(n=0;n<8;n++){
- write_data(lcd_desktop21[n]);}
- }
-
- }
-
- if((key5==0)&&(KEY1==5)) //按鍵K5按下,(減速)對其它標志位沒有影響。
- {
- delayms(5);
- if(key5==0)
- {
- while(!key5);
- if(Timer0_BiaoZhi==0)
- {
- Timer0_BiaoZhi=0;
- }
- else
- {
- Timer0_BiaoZhi--;
- }
- EX1=1;
- KEY1=5;
- lcd_init();
- for(n=0;n<8;n++){
- write_data(lcd_desktop22[n]);}
- }
- }
- if((key6==0)&&(KEY1==5))//按鍵K6按下,電機停止轉動使能端和計數啟動關閉,計數器工作否?設立標志位。此按鍵按下后除K1外無法啟動
- {
- delayms(5);
- if(key6==0)
- {
- while(!key6);
- //置位,保證后續操作正常。
-
-
-
- EA=0; //總中斷關
- motor_init(); //電機關
- lcd_init();
- Guan();
-
- }
- }
- }
-
- /*主函數*/
- void main()
- {
- ZhongDuanKaiQi();//初始化
- motor_init(); //電機停止
- lcd_init();
- while(1)
- {
- xianshi();
-
- }
- }
復制代碼
所有資料51hei提供下載:
lyp22.zip
(84.34 KB, 下載次數: 23)
2019-5-30 21:29 上傳
點擊文件名下載附件
仿真與程序文件
|