久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6034|回復: 5
打印 上一主題 下一主題
收起左側

單片機驅動帶編碼器直流電機 源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:580896 發表于 2019-7-9 14:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<STC12C5A60S2.h>
  2. //單片機頭文件,儲存一些殊寄存器的地址聲明
  3. #include<intrins.h>        
  4. //intrins頭文件儲存51編程中需要使用到空指令_nop_()、字符循環移位指令_crol_等
  5. #include <stdio.h>
  6. //stdio : "standard input & output"(標準輸入輸出),C/C++頭文件,把多個編譯單元(.c或者.cpp文件)公用的內容,單獨放在一個文件里減少整體代碼尺寸

  7. #define usint unsigned short int        //符號短整型
  8. #define uchar unsigned char                        //無符號字符型
  9. #define uint unsigned int                          //無符號整型
  10. #define VALID        0                                        //0
  11. #define INVALID        1                                        //1
  12. #define LCD_data P0                            //LCD數據端口P0

  13. sbit LCD_RS = P2^7;                        //LCD命令和數據控制位,1:寫數據位,0:寫命令
  14. sbit LCD_RW = P2^6;                        //LCD讀寫控制位
  15. sbit LCD_EN = P2^5;                        //LCD使能位

  16. sbit IN1 = P2^0;                        //電機
  17. sbit IN2 = P2^1;
  18. sbit ENA = P2^3;

  19. uchar code title2[] = {"電機轉速:"};
  20. uchar code ascii[] =
  21. {0x31,0x32,0x33,0x41,0x34,0x35,0x36,0x42,0x37,0x38,0x39,0x43,0x2A,0x30,0x23,0x44};   //數字和常用字符的ascii碼
  22. uint n = 0;                                        //T0定時中斷響應次數
  23. uint n_pwm = 0;                                //用于調節pwm占空比
  24. uint c = 0;                                        //外部計數中斷響應次數
  25. uint flag_T0 = 0;                        //定時器T0溢出flag
  26. uchar th = 0;                                //脈沖計數計算時的臨時變量高位
  27. uchar tl = 0;                                //……………………………………………低位
  28. uint num_pulse;                                //脈沖個數
  29. void delay_1ms(uint z){     //延時函數1ms  
  30.         uint x,y;
  31.         for(x = z; x > 0; x--)
  32.                 for(y = 920; y > 0; y--);
  33. }
  34. void write_cmd(uchar cmd){  //LCD寫命令函數
  35.         LCD_RS = 0;
  36.         LCD_RW = 0;
  37.         LCD_EN = 0;
  38.         P0 = cmd;
  39.         delay_1ms(6);
  40.         LCD_EN = 1;
  41.         delay_1ms(6);
  42.         LCD_EN = 0;
  43. }
  44. void write_dat(uchar dat){  //LCD寫數據函數
  45.         LCD_RS = 1;
  46.         LCD_RW = 0;
  47.         LCD_EN = 0;
  48.         P0 = dat;
  49.         delay_1ms(5);
  50.         LCD_EN = 1;
  51.         delay_1ms(5);
  52.         LCD_EN = 0;
  53. }
  54. void lcd_pos(uchar X,uchar Y){  //X表示LCD的行數,Y表示LCD的列數
  55.         uchar pos;
  56.         if(X == 0){
  57.                 X = 0x80;
  58.         }
  59.         else if(X == 1){
  60.                          X = 0x90;
  61.                  }
  62.                  else if(X == 2){
  63.                                    X = 0x88;
  64.                           }
  65.                           else if (X == 3){
  66.                                                 X = 0x98;
  67.                                    }
  68.         pos = X+Y ;
  69.         write_cmd(pos);    //顯示地址
  70. }
  71. void lcd_init(){         
  72.         uchar i = 0;                                   
  73.         write_cmd(0x30);   //基本指令操作
  74.         delay_1ms(5);
  75.         write_cmd(0x0C);   //顯示開,關光標
  76.         delay_1ms(5);
  77.         write_cmd(0x01);   //清除LCD的顯示內容
  78.         delay_1ms(5);
  79.         lcd_pos(0,0);       //將LCD光標定位到第一行第一列            
  80. }
  81. void pulse_dispaly(uint fe)                //顯示脈沖個數
  82. {
  83.         uchar i = 0;
  84.         uchar f[7];
  85.                 for(i = 0; i < 7; i++)
  86.                         f[i] = '0';
  87.                 f[0] = ((fe)/100000)                     +0x30;//十萬位的數字
  88.                 f[1] = ((fe)%100000)/10000                +0x30;//萬位的數字
  89.                 f[2] = ((fe)%10000)/1000                +0x30;//千位的數字
  90.                 f[3] = ((fe)%1000 )/100                 +0x30;//百位的數字
  91.                 f[4] = ((fe)%100  )/10                  +0x30;//十位的數字
  92.                 f[5] = ((fe)%10   )                     +0x30;//個位的數字
  93.                 f[6] = '\0';
  94.         i = 0;
  95.         lcd_pos(1,5);                            //將光標定位到第2行第6列開始顯示
  96.         while(f[i] != '\0'){
  97.                 write_dat(f[i]);
  98.                 i++;
  99.         }        
  100. }
  101. void display_text(int pos, uchar *text){        //顯示一段字text、pos設置在第幾行開頭顯示
  102.         uchar j;
  103.         lcd_pos(pos,0);
  104.         while(text[j]!='\0'){
  105.                 write_dat(text[j]);
  106.                 j++;
  107.         }
  108.         j=0;
  109. }
  110. void INIT(){                                //初始化函數
  111.         TMOD = 0X51;                        //定時器初始化0101_0001                                                
  112.         TH0 = (65536-922)/256;        //定時器初值(1ms),0.001s/(1.085*10^(-6))s=922
  113.         TL0 = (65536-922)%256;
  114.         TH1 = 0X00;        //計數器初值
  115.         TL1 = 0x00;
  116.         ET0 = 1;                //允許中斷T0
  117.         ET1 = 1;
  118.         EA = 1;                //總中斷開放
  119.         TR0 = 1;                //啟動T0
  120.         TR1 = 1;                //啟動T1
  121.         IN2 = 0;                //電機初始化
  122.         IN1 = 1;
  123.         ENA = 0;
  124. }
  125. void main(){
  126.         uchar i;
  127.         INIT();
  128.         lcd_init();                                        //LCD初始函數
  129.         display_text(1, title2);        //在第2行開頭顯示 "電機轉速:"
  130.         while(1){
  131.                 if (flag_T0 == 1){                //1s
  132.                         /*脈沖計數(電機轉速通過脈沖個數的方式輸出)*/
  133.                         th = TH1;                                                   //用臨時變量讀取計數器數值
  134.                         tl = TL1;
  135.                         num_pulse = th*256 + tl;                  //計數器16進制轉10進制
  136.                         TH1 = 0X00;                                                //重新賦計數器的值
  137.                         TL1 = 0x00;   
  138.                         pulse_dispaly(num_pulse);                 //循環調用顯示函數
  139.                         th = 0;
  140.                         tl = 0;
  141.                         /*脈沖計數*/
  142.                         flag_T0 = 0;
  143.                 }
  144.         }
  145. }
  146. void interrupt_Timer0() interrupt 1 {                //定時器中斷(1ms)
  147.         TR0 = 0;
  148.         TH0 = (65536-922)/256;        //重新賦初值
  149.         TL0 = (65536-922)%256;
  150.         n++;
  151.         n_pwm++;                        //一個pwm脈沖周期為10ms,速度10檔可調
  152.         ENA = 1;
  153.         if (n_pwm > 10)                //超過一個pwm周期
  154.                 n_pwm = 1;
  155.         if (n_pwm <= 5)                //占空比50%
  156.                 IN1 = 1;                //pwm高電平
  157.         else
  158.                 IN1 = 0;                //pwm低電平
  159.                         
  160.         if(n == 1000){                 //計滿1s
  161.                 flag_T0 = 1;
  162.                 n = 0;
  163.         }
  164.         TR0 = 1;
  165. }

  166. void interrupt_Timer1() interrupt 3        {         //計數器中斷
  167.         TR1 = 0;
  168.         TH1 = 0x00;                //重新賦值
  169.         TL1 = 0x00;
  170.         TR1 = 1;
  171. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:221051 發表于 2020-1-16 21:50 | 只看該作者
感謝樓主的分享!!
回復

使用道具 舉報

板凳
ID:751213 發表于 2020-5-13 22:13 | 只看該作者
終于找到了,謝謝樓主
回復

使用道具 舉報

地板
ID:960805 發表于 2021-8-16 19:25 | 只看該作者
請問有這份代碼的電路圖嗎?
回復

使用道具 舉報

5#
ID:960805 發表于 2021-8-16 19:26 | 只看該作者
請問樓主可以分享一下這個程序的電路圖嗎?謝謝
回復

使用道具 舉報

6#
ID:613605 發表于 2023-5-23 16:48 | 只看該作者
請問樓主可以分享一下這個程序的電路圖嗎?謝謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区三区精品 | 国产精品欧美一区二区三区不卡 | 欧美成人一区二免费视频软件 | 亚洲欧美中文日韩在线v日本 | 成人一区二区三区 | 亚洲一区二区三区免费在线观看 | 免费在线观看黄色av | 欧美日韩亚洲国产综合 | av免费成人 | 国产成人免费 | 91久久久久久久久 | 狠狠干狠狠操 | 精品国产一区二区三区av片 | 欧洲成人免费视频 | 99视频在线播放 | av香蕉| 精品一区二区三区在线视频 | 成人a在线观看 | 日本精品一区二区 | 成人夜晚看av | 超碰8 | 99精品观看| 日韩黄色小视频 | 中文字幕在线观看一区 | 99久久久无码国产精品 | 欧美日韩在线播放 | 成人欧美一区二区三区白人 | 亚洲性人人天天夜夜摸 | 午夜精品久久久久久久久久久久久 | 日韩精品成人在线 | 欧美一级网站 | 91精品国产综合久久精品 | 91国产精品| 久久99久久 | 日日日操 | 完全免费av在线 | 一区二区三区在线看 | 男女视频在线免费观看 | 久久国产日韩欧美 | 精品国产乱码久久久久久丨区2区 | 视频一区二区三区四区五区 |