国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: 51單片機自動窗簾電機控制程序與Proteus仿真圖 [打印本頁]

作者: eng    時間: 2021-6-13 03:27
標題: 51單片機自動窗簾電機控制程序與Proteus仿真圖
單片機控制電機轉速運用PWM
仿真原理圖如下(proteus仿真工程文件和單片機程序完整源碼可到本帖附件中下載)

部分源碼:
  1. /*********************************************************/
  2. // 向DS1302寫入時間數據
  3. /*********************************************************/
  4. void DS1302_Write_Time()
  5. {
  6.   uchar i;
  7.     uchar temp1;
  8.     uchar temp2;
  9.    
  10.     for(i=0;i<7;i++)            // 十進制轉BCD碼
  11.     {
  12.         temp1=(TimeBuff[i]/10)<<4;
  13.         temp2=TimeBuff[i]%10;
  14.         TimeBuff[i]=temp1+temp2;
  15.     }
  16.    
  17.     DS1302_Write_Byte(0x8E,0x00);                                // 關閉寫保護
  18.     DS1302_Write_Byte(0x80,0x80);                                // 暫停時鐘
  19.     DS1302_Write_Byte(0x8C,TimeBuff[0]);                // 年
  20.     DS1302_Write_Byte(0x88,TimeBuff[1]);                // 月
  21.     DS1302_Write_Byte(0x86,TimeBuff[2]);                // 日
  22.     DS1302_Write_Byte(0x8A,TimeBuff[3]);                // 星期
  23.     DS1302_Write_Byte(0x84,TimeBuff[4]);                // 時
  24.     DS1302_Write_Byte(0x82,TimeBuff[5]);                // 分
  25.     DS1302_Write_Byte(0x80,TimeBuff[6]);                // 秒
  26.     DS1302_Write_Byte(0x80,TimeBuff[6]&0x7F);        // 運行時鐘
  27.     DS1302_Write_Byte(0x8E,0x80);                                // 打開寫保護  
  28. }



  29. /*********************************************************/
  30. // 從DS1302讀出時間數據
  31. /*********************************************************/
  32. void DS1302_Read_Time()  
  33. {
  34.     uchar i;

  35.     TimeBuff[0]=DS1302_Read_Byte(0x8D);                        // 年
  36.     TimeBuff[1]=DS1302_Read_Byte(0x89);                        // 月
  37.     TimeBuff[2]=DS1302_Read_Byte(0x87);                        // 日
  38.     TimeBuff[3]=DS1302_Read_Byte(0x8B);                        // 星期
  39.     TimeBuff[4]=DS1302_Read_Byte(0x85);                        // 時
  40.     TimeBuff[5]=DS1302_Read_Byte(0x83);                        // 分
  41.     TimeBuff[6]=(DS1302_Read_Byte(0x81))&0x7F;        // 秒

  42.     for(i=0;i<7;i++)        // BCD轉十進制
  43.     {           
  44.         TimeBuff[i]=(TimeBuff[i]/16)*10+TimeBuff[i]%16;
  45.     }
  46. }


  47. /*********************************************************/
  48. // ADC0832的時鐘脈沖
  49. /*********************************************************/
  50. void WavePlus()
  51. {
  52.     _nop_();
  53.     ADC_CLK = 1;
  54.     _nop_();
  55.     ADC_CLK = 0;
  56. }


  57. /*********************************************************/
  58. // 獲取指定通道的A/D轉換結果
  59. /*********************************************************/
  60. uchar Get_ADC0832()
  61. {
  62.     uchar i;
  63.     uchar dat1=0;
  64.     uchar dat2=0;
  65.    
  66.     ADC_CLK = 0;                // 電平初始化
  67.     ADC_DAT = 1;
  68.     _nop_();
  69.     ADC_CS = 0;
  70.     WavePlus();                    // 起始信號
  71.     ADC_DAT = 1;
  72.     WavePlus();                    // 通道選擇的第一位
  73.     ADC_DAT = 0;      
  74.     WavePlus();                    // 通道選擇的第二位
  75.     ADC_DAT = 1;
  76.    
  77.     for(i=0;i<8;i++)        // 第一次讀取
  78.     {
  79.         dat1<<=1;
  80.         WavePlus();
  81.         if(ADC_DAT)
  82.             dat1=dat1|0x01;
  83.         else
  84.             dat1=dat1|0x00;
  85.     }
  86.    
  87.     for(i=0;i<8;i++)        // 第二次讀取
  88.     {
  89.         dat2>>= 1;
  90.         if(ADC_DAT)
  91.             dat2=dat2|0x80;
  92.         else
  93.             dat2=dat2|0x00;
  94.         WavePlus();
  95.     }
  96.    
  97.     _nop_();                        // 結束此次傳輸
  98.     ADC_DAT = 1;
  99.     ADC_CLK = 1;
  100.     ADC_CS  = 1;   

  101.     if(dat1==dat2)            // 返回采集結果
  102.         return dat1;
  103.     else
  104.         return 0;
  105. }


  106. /*********************************************************/
  107. // 按鍵掃描(設置當前時間)
  108. /*********************************************************/
  109. void KeyScanf1()
  110. {
  111.     if(KeySet_P==0)
  112.     {
  113.         LcdGotoXY(0,13);                // 顯示秒鐘的冒號
  114.         LcdWriteData(':');
  115.         LcdWriteCmd(0x0f);            // 啟動光標閃爍
  116.         LcdGotoXY(0,3);                    // 定位光標到年份閃爍
  117.         DelayMs(10);                        // 延時等待,消除按鍵按下的抖動
  118.         while(!KeySet_P);                // 等待按鍵釋放
  119.         DelayMs(10);                        // 延時等待,消除按鍵松開的抖動
  120.         
  121.         /* 調整年份 */
  122.         while(1)
  123.         {
  124.             if(KeyDown_P==0)                            // 如果減按鍵被下去
  125.             {
  126.                 if(TimeBuff[0]>0)                        // 判斷年份是否大于0        
  127.                     TimeBuff[0]--;                        // 是的話就減去1
  128.                 LcdGotoXY(0,2);                            // 光標定位到年份的位置
  129.                 LcdPrintNum(TimeBuff[0]);        // 刷新顯示改變后的年份
  130.                 LcdGotoXY(0,3);                            // 定位光標到年份閃爍
  131.                 DelayMs(300);                                // 延時0.3秒左右
  132.             }
  133.             
  134.             if(KeyUp_P==0)                                // 如果加按鍵被下去
  135.             {
  136.                 if(TimeBuff[0]<99)                    // 判斷年份是否小于99
  137.                     TimeBuff[0]++;                        // 是的話就加上1
  138.                 LcdGotoXY(0,2);                            // 光標定位到年份的位置
  139.                 LcdPrintNum(TimeBuff[0]);        // 刷新顯示改變后的年份
  140.                 LcdGotoXY(0,3);                            // 定位光標到年份閃爍
  141.                 DelayMs(300);                                // 延時0.3秒左右
  142.             }
  143.             
  144.             if(KeySet_P==0)
  145.             {
  146.                 break;
  147.             }
  148.         }
  149.         
  150.         LcdGotoXY(0,6);                    // 定位光標到月份閃爍
  151.         DelayMs(10);                        // 延時等待,消除按鍵按下的抖動
  152.         while(!KeySet_P);                // 等待按鍵釋放
  153.         DelayMs(10);                        // 延時等待,消除按鍵松開的抖動
  154.             
  155.         /* 調整月份 */
  156.         while(1)
  157.         {
  158.             if(KeyDown_P==0)                            // 如果減按鍵被下去
  159.             {
  160.                 if(TimeBuff[1]>1)                        // 判斷月份是否大于1        
  161.                     TimeBuff[1]--;                        // 是的話就減去1
  162.                 LcdGotoXY(0,5);                            // 光標定位到月份的位置
  163.                 LcdPrintNum(TimeBuff[1]);        // 刷新顯示改變后的月份
  164.                 LcdGotoXY(0,6);                            // 定位光標到月份閃爍
  165.                 DelayMs(300);                                // 延時0.3秒左右
  166.             }
  167.             
  168.             if(KeyUp_P==0)                                // 如果加按鍵被下去
  169.             {
  170.                 if(TimeBuff[1]<12)                    // 判斷月份是否小于12
  171.                     TimeBuff[1]++;                        // 是的話就加上1
  172.                 LcdGotoXY(0,5);                            // 光標定位到月份的位置
  173.                 LcdPrintNum(TimeBuff[1]);        // 刷新顯示改變后的月份
  174.                 LcdGotoXY(0,6);                            // 定位光標到月份閃爍
  175.                 DelayMs(300);                                // 延時0.3秒左右
  176.             }
  177.             
  178.             if(KeySet_P==0)
  179.             {
  180.                 break;
  181.             }
  182.         }
  183.         
  184.         LcdGotoXY(0,9);                    // 定位光標到日期閃爍
  185.         DelayMs(10);                        // 延時等待,消除按鍵按下的抖動
  186.         while(!KeySet_P);                // 等待按鍵釋放
  187.         DelayMs(10);                        // 延時等待,消除按鍵松開的抖動
  188.         
  189. --------------完整程序見附件-----------------
復制代碼
完整C源碼和proteus仿真.zip (134.86 KB, 售價: 3 E幣)






歡迎光臨 ELEOK (http://www.afoofa.cn/) Powered by Discuz! X5.0