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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

電動牙刷的MCU驅動程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:297748 發表于 2019-6-17 13:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是電動牙刷的驅動程序,電路可以采用電池供電,也可以USB供電,可以檢測電量的多少

單片機源程序如下:
  1. #include "main.h"

  2. void main(void)
  3. {
  4.         SystemInit();
  5.         while(1)
  6.         {
  7.                 BatteryVoltageWarning();
  8.                 KeyScan();
  9.                 switch (key_flag)
  10.                 {
  11.                         case 0: Led50 = 1;Led70 = 1;Led100 = 1;  //檔位指示燈全滅
  12.                                         MotorA = 1;MotorB = 1;   //電機不轉
  13.                                         break;
  14.                         case 1: Led50 = 0;Led70 = 1;Led100 = 1;  //1擋指示燈亮
  15.                                         MotorA = 0;MotorB = 1;
  16.                                         break;
  17.                         case 2: Led50 = 1;Led70 = 0;Led100 = 1;  //2擋指示燈亮
  18.                                        
  19.                                         break;
  20.                         case 3: Led50 = 1;Led70 = 1;Led100 = 0;  //3擋指示燈亮
  21.                                        
  22.                                         break;
  23.                         default: break;
  24.                 }
  25.                 if(time_flag == 4)   //time_flag為4時,即4*30s=120s,2分鐘,此時電機停轉
  26.                         key_flag = 0;                       
  27.         }
  28. }

  29. /******延時x毫秒******/
  30. void DelayMs( uint x )                //@11.0592MHz
  31. {
  32.         uint a;
  33.         for(a=0;a<x;a++)
  34.         {
  35.                 uchar i, j;
  36.                 _nop_();
  37.                 i = 2;
  38.                 j = 199;
  39.                 do
  40.                 {
  41.                         while (--j);
  42.                 } while (--i);
  43.         }
  44. }

  45. /*******系統初始化******/
  46. void SystemInit()
  47. {
  48.         Led50 = 1;
  49.         Led70 = 1;
  50.         Led100 = 1;
  51.         LedPower = 1;
  52.         ModeKey = 1;
  53.         MotorA = 1;
  54.         MotorB = 1;
  55.         Timer0Init();
  56. }

  57. /*******定時器0初始化*****/
  58. void Timer0Init()                //333us @11.0592MHz  0.03%誤差
  59. {
  60.         TMOD &= 0xF0;                //設置定時器模式
  61.         TMOD |= 0x01;                //設置定時器模式
  62.         TL0 = 0xCD;                //設置定時初值
  63.         TH0 = 0xFE;                //設置定時初值
  64.         TF0 = 0;                //清除TF0標志
  65.         TR0 = 1;                //定時器0開始計時
  66.         ET0 = 1;          //開啟定時器0中斷
  67.         EA = 1;     //開啟總中斷
  68. }

  69. /*******讀ADC0832函數******/
  70. uchar Adc0832(uchar channel)     //AD轉換,返回結果
  71. {
  72.     uchar i=0;
  73.     uchar j;
  74.     uint dat=0;
  75.     uchar ndat=0;

  76.     if(channel==0)channel=2;
  77.     if(channel==1)channel=3;
  78.     ADDI=1;
  79.     _nop_();
  80.     _nop_();
  81.     ADCS=0;                    //拉低CS端
  82.     _nop_();
  83.     _nop_();
  84.     ADCLK=1;                   //拉高CLK端
  85.     _nop_();
  86.     _nop_();
  87.     ADCLK=0;                   //拉低CLK端,形成下降沿1
  88.     _nop_();
  89.     _nop_();
  90.     ADCLK=1;                   //拉高CLK端
  91.     ADDI=channel&0x1;
  92.     _nop_();
  93.     _nop_();
  94.     ADCLK=0;                   //拉低CLK端,形成下降沿2
  95.     _nop_();
  96.     _nop_();
  97.     ADCLK=1;                   //拉高CLK端
  98.     ADDI=(channel>>1)&0x1;
  99.     _nop_();
  100.     _nop_();
  101.     ADCLK=0;                   //拉低CLK端,形成下降沿3
  102.     ADDI=1;                    //控制命令結束
  103.     _nop_();
  104.     _nop_();
  105.     dat=0;
  106.     for(i=0;i<8;i++)
  107.     {
  108.         dat|=ADDO;            //收數據
  109.         ADCLK=1;
  110.         _nop_();
  111.         _nop_();
  112.         ADCLK=0;              //形成一次時鐘脈沖
  113.         _nop_();
  114.         _nop_();
  115.         dat<<=1;
  116.         if(i==7)dat|=ADDO;
  117.     }  
  118.     for(i=0;i<8;i++)
  119.     {
  120.         j=0;
  121.         j=j|ADDO;            //收數據
  122.         ADCLK=1;
  123.         _nop_();
  124.         _nop_();
  125.         ADCLK=0;             //形成一次時鐘脈沖
  126.         _nop_();
  127.         _nop_();
  128.         j=j<<7;
  129.         ndat=ndat|j;
  130.         if(i<7)ndat>>=1;
  131.     }
  132.     ADCS=1;                 //拉低CS端
  133.     ADCLK=0;                //拉低CLK端
  134.     ADDO=1;                 //拉高數據端,回到初始狀態
  135.     dat<<=8;
  136.     dat|=ndat;
  137.     return(dat);            //return ad k         
  138. }

  139. /*******電池低電量警告******/
  140. void BatteryVoltageWarning()
  141. {
  142.         ad_data =Adc0832(0);         //讀取電池電壓采樣值
  143.         //ADC0832模數轉換是8位ADC芯片,轉換回來的數值是0-255,0V時是0,5V時是255,相應的倍數就是255/5=51
  144.         //因此,將轉換回來的數除以51,就得到相應的電壓值了
  145.         battery_voltage = (double)(ad_data)/51.0;      
  146.         if(battery_voltage < 0.7)     //當電池電壓小于0.7V,即電量低于20%時,低電量指示燈亮
  147.                 LedPower = 0;
  148.         else
  149.                 LedPower = 1;
  150. }

  151. /*******按鍵掃描******/
  152. uchar KeyScan()
  153. {
  154.         if(!ModeKey)
  155.         {
  156.                 DelayMs(10);
  157.                 if(!ModeKey)
  158.                 {
  159.                         time_30s = 0;
  160.                         time_flag = 0;   //每次按檔位模式按鍵,電機轉動都要復位,即清零已經轉動的時間
  161.                         key_flag++;
  162.                         if(key_flag > 3)
  163.                                 key_flag = 0;
  164.                 }
  165.                 while(!ModeKey);
  166.         }
  167.         return key_flag;       
  168. }

  169. /*******產生電機PWM******/
  170. void MotorControl(uchar pwm, uchar ab)
  171. {
  172.         if(pwm > 10)
  173.                 pwm = 10;
  174.         if(time_30s > 90000)  //約為90000*333us=30s
  175.         {
  176.                 time_30s = 0;
  177.                 time_flag++;    //每30s停轉一次,每停轉一次time_flag就加一
  178.                 if(time_flag > 4)   //time_flag加到4,即4*30s=120s,2分鐘
  179.                         time_flag = 0;
  180.                 MotorA = 1;
  181.                 MotorB = 1;      
  182.                 DelayMs(1000);  //電機每隔30s停轉1s
  183.         }
  184.         else
  185.         {
  186.                 if(time_pwm > 10)  //PWM周期為10*333us=3.33ms,頻率約為1/3.33ms=300.3Hz
  187.                         time_pwm = 0;
  188.                 if(ab=='A')       //如果參數為A
  189.                 {
  190.                         MotorB = 0;   //則產生正脈沖,此時電機正轉
  191.                         if(time_pwm < pwm)        //占空比為(pwm/10*100%),改變pwm值(范圍0-10)即改變占空比(對應0-100%),從而可以改變電機的速度
  192.                                 MotorA = 1;
  193.                         else
  194.                                 MotorA = 0;
  195.                 }
  196.                 else if(ab=='B')  //如果參數為B
  197.                 {
  198.                         MotorA = 0;   //則產生負脈沖,此時電機反轉
  199.                         if(time_pwm < pwm)        //占空比為(pwm/10*100%),改變pwm值(范圍0-10)即改變占空比(對應0-100%),從而可以改變電機的速度
  200.                                 MotorB = 1;
  201.                         else
  202.                                 MotorB = 0;
  203.                 }
  204.         }
  205. }

  206. /*******定時器0中斷******/
  207. void Time0(void) interrupt 1   
  208. {
  209.         TL0 = 0xCD;               
  210.         TH0 = 0xFE;      //重新賦初值333us,0.03%誤差
  211.         time_pwm++;         
  212.         time_30s++;     //每333us進入一次中斷,同時time_pwm、time_30s值各加一
  213. }
復制代碼

所有資料51hei提供下載:
程序.zip (44.38 KB, 下載次數: 65)


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

使用道具 舉報

沙發
ID:1 發表于 2019-6-17 15:56 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

板凳
ID:297748 發表于 2019-6-18 14:00 | 只看該作者
admin 發表于 2019-6-17 15:56
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)

我上傳一個仿真圖吧
回復

使用道具 舉報

地板
ID:324611 發表于 2019-8-12 10:19 | 只看該作者
好東西,學習下。
回復

使用道具 舉報

5#
ID:386216 發表于 2019-8-28 16:05 | 只看該作者
樓主有沒原理圖,謝謝
回復

使用道具 舉報

6#
ID:336378 發表于 2019-9-10 12:00 | 只看該作者
看看,能不能有用。
回復

使用道具 舉報

7#
ID:56665 發表于 2019-9-11 08:50 | 只看該作者
下載看了一下,牙刷里面就是一個電機,正轉反轉線路怎么接,還是要有原理圖才清楚。
回復

使用道具 舉報

8#
ID:276663 發表于 2019-9-11 09:48 | 只看該作者
admin 發表于 2019-6-17 15:56
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)

管理員建議太好了
回復

使用道具 舉報

9#
ID:573089 發表于 2019-10-31 20:14 | 只看該作者
希望樓主能上傳看看
回復

使用道具 舉報

10#
ID:386216 發表于 2019-11-15 15:24 | 只看該作者
樓主,程序我有看了,有問題啊,你都沒有調動MotorControl(uchar pwm, uchar ab)這個函數
回復

使用道具 舉報

11#
ID:709319 發表于 2020-3-18 09:30 | 只看該作者
下下來研究研究!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产三区四区 | 国产精品永久久久久 | 久草视频网站 | 2018国产精品 | 国产成人免费在线 | 亚洲一区二区三区免费在线观看 | 噜噜噜噜狠狠狠7777视频 | 亚洲中午字幕 | 午夜国产一级片 | 日韩免费在线 | 日本黄色影片在线观看 | 巨大荫蒂视频欧美另类大 | 免费av直接看 | 欧美日韩大陆 | 啪啪免费网站 | 国产亚洲一区二区三区在线观看 | 日韩av在线一区二区 | 99re在线视频观看 | 成人永久免费视频 | 无码一区二区三区视频 | 久久综合一区二区三区 | 国产色黄 | 亚洲国产精久久久久久久 | 日韩国产精品一区二区三区 | 玖玖爱365 | 久久久久久一区 | 成人网址在线观看 | 激情av | 精品久久久久久亚洲综合网 | 91xxx在线观看 | 国产欧美在线 | 久久久久久久综合 | 亚洲精品电影在线观看 | 日韩欧美在线播放 | 天堂综合 | 成人黄视频在线观看 | 久久久久久国产精品免费免费狐狸 | 亚洲乱码国产乱码精品精98午夜 | 91精品国产综合久久福利软件 | 一区二区三区影院 | 久久精品福利视频 |