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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機控制信號發生器源程序(正弦波、方波)Gerber文件

[復制鏈接]
跳轉到指定樓層
樓主
信號發生器,有Keil程序和Gerber打板。

單片機型號:STC15W4K32S4
數字編碼器EC11作為控制波形、頻率、占空比的開關
液晶1602A作為顯示信息


Gerber文件下載(無PCB): 51單片機信號發生器機.7z (3.33 MB, 下載次數: 63)

單片機源程序如下:
  1. Note:
  2.         2020-05-06 Update
  3.         1. Fix an error in main funciton, cause the EC11 Encoder rotate disorder.
  4.         2. Fix an error of interface display during switch frequency.

  5.         2020-05-24 Update
  6.         1. Fix precision of PWM frequency
  7.         2. Fix the information error in interface
  8.         
  9.         波形發生器
  10.         作者:老劉愛搗鼓
  11.         版本:V0.3.1
  12.         單片機型號:STC15W4K32S4 @24MHz
  13.         B站視頻教程:https://www.bilibili.com/video/BV12k4y197Qu
  14.         老劉愛搗鼓(全網同名)期待您的關注!

  15.         規格:
  16.         輸出:單通道
  17.         方波:1Hz~4MHz
  18.         正弦波:1Hz-10kHz
  19.         波幅:約等于VCC,5V左右
  20.         帶載能力:無帶載能力
  21.         顯示屏:LCD1602
  22.         控制:EC11編碼器

  23.         界面:
  24.         左下角顯示波形圖標(方波/正弦波)和輸出狀態(On/OFF)
  25.         F:頻率
  26.         D:方波占空比
  27.         CD:時鐘分頻系數(For information only)
  28.         P:用于生成正弦波的PWM頻率(For information only)
  29.         Pt:用于生成正弦波的點數(For information only)

  30.         操作:
  31.         單擊編碼器:方波界面下,切換頻率和占空比
  32.         雙擊編碼器:開啟或關閉波形輸出
  33.         長按編碼器:切換方波界面/正弦波界面/電壓顯示界面
  34.         旋轉編碼器:調節參數

  35.         2020-05-06 更新
  36.         1. 修正main函數循環中會引起編碼器旋轉混亂的錯誤
  37.            將main函數中while循環中的Update_Flag=0;放到前面清零,放在后面會在編碼器高速旋轉時,多次觸發中斷而Update_Flag在最后被清零則無法正確更新LCD
  38.         2. 修正在切換頻率時,界面的顯示錯誤

  39.         2020-05-24 Update
  40.         1. 修正PWM頻率精度
  41.         2. 修正界面信息的顯示錯誤
  42. */

  43. #include <reg51.h>
  44. #include <intrins.h>
  45. #include "lcd1602.h"
  46. #include "wave.h"
  47. #include "settings.h"
  48. #include "delay.h"
  49. #include "config_stc.h"
  50. //#include "uart.h"
  51. //#include "stdio.h"

  52. #ifndef uint8
  53. #define uint8 unsigned char
  54. #endif

  55. #ifndef int8
  56. #define int8 char
  57. #endif

  58. #ifndef uint16
  59. #define uint16 unsigned int
  60. #endif

  61. #ifndef uint32
  62. #define uint32 unsigned long int
  63. #endif

  64. #define TIMER_0 1 //定時器0中斷序號
  65. #define INT_1 2          //編碼器旋轉 觸發外部中斷
  66. #define INT_0 0          //編碼器按下 觸發外部中斷

  67. uint8 Timer0_Count;
  68. bit Update_Flag = 1;

  69. void main(void)
  70. {
  71.         //LCD Pin
  72.         P1M1 &= 0x00; //設置P1口為準雙向
  73.         P1M0 &= 0x00; //設置P1口為準雙向
  74.         P0M1 &= 0x00; //設置P0口為準雙向
  75.         P0M0 &= 0x00; //設置P0口為準雙向

  76.         //信號輸出Pin
  77.         PWM3 = 0;           //設置PWM3 P4.5低電平
  78.         PWM4 = 0;           //設置PWM4 P4.4低電平
  79.         P4M1 |= 0x30;  //設置P4.4(PWM4_2),4.5(PWM3_2)為高阻
  80.         P4M0 &= ~0x30; //設置P4.4(PWM4_2),4.5(PWM3_2)為高阻

  81.         /* 編碼器旋轉中斷
  82.            Interrupt for Encoder Rotation */
  83.         IT1 = 0; //外部中斷1觸發方式,上升沿和下降沿
  84.         PX1 = 1; //外部中斷1高優先級
  85.         EX1 = 1; //開啟外部中斷1

  86.         /* 編碼器按鍵中斷
  87.            Interrupt for Encoder Click */
  88.         IT0 = 1; //外部中斷0觸發方式,下降沿
  89.         PX0 = 1; //外部中斷0高優先級
  90.         EX0 = 1; //開啟外部中斷0

  91.         /* 定時器0,用于更新電壓信息計時
  92.            Timer 0 for updating the information of VCC*/
  93.         TMOD &= 0xF0;  //設置定時器0模式 16位自動重載,在Keil中debug的話,請注意,這種設置是8051的舊13位模式
  94.         AUXR &= ~0x80; //定時器0時鐘12T模式
  95.         TL0 = 0xC0;           //設置定時初值 24MHz 20ms
  96.         TH0 = 0x63;           //設置定時初值 24MHz 20ms
  97.         ET0 = 1;           //允許T0溢出中斷

  98.         /* 定時器1,用于生成小于50Hz的PWM
  99.            Timer 1 for generate the PWM when frequency less than 50Hz*/
  100.         TMOD &= 0x0F;  //工作模式,0: 16位自動重裝
  101.         AUXR &= ~0x40; //12T
  102.         ET1 = 1;           //允許中斷

  103.         EA = 1; //開總中斷

  104.         //UartInit();
  105.         //UartInit_interrupt();
  106.         PWM_Hz_Pre = PWM_Hz;
  107.         Wave_Shape_Pre = Wave_Shape;
  108.         Get_PWM_Duty_Limit();
  109.         if (PWM_Duty > PWM_Max_Duty)
  110.                 PWM_Duty = PWM_Max_Duty;
  111.         else if (PWM_Duty < PWM_Min_Duty)
  112.                 PWM_Duty = PWM_Min_Duty;
  113.         Lcd_Init();
  114.         while (1)
  115.         {
  116.                 if (Update_Flag)
  117.                 {
  118.                         /*        Update_Flag要馬上清零,如果放在Update_LCD后面,會造成假如Update_LCD的過程中再次觸發編碼器旋轉中斷的話,
  119.                                 在執行完Update_LCD后,在中斷中置位的Update_Flag卻被清零了,造成LCD沒刷新,輸出和顯示的不一致。
  120.                                 另一種方法是在執行Update_LCD前把中斷關掉,執行完再打開中斷, 但如果這里面的函數執行時間比較長,會產生旋轉觸發不及時,使用感受卡頓。
  121.                                 關中斷來避免重復觸發是有好處的,可以避免在函數執行過程中多次觸發將參數修改掉,
  122.                                 函數執行過程中參數被修改,可能會造成計算結果混亂,嚴重時會造成溢出,甚至單片機復位死機。        */
  123.                         Update_Flag = 0;
  124.                         Wave_OFF();
  125.                         if (Wave_Shape_Pre != Wave_Shape)
  126.                         {
  127.                                 Wave_Shape_Pre = Wave_Shape;
  128.                                 if (Wave_Shape == 0)
  129.                                 {
  130.                                         EX1 = 0; //關閉外部中斷1(編碼器旋轉)
  131.                                         TF0 = 0; //清除TF0標志
  132.                                         TR0 = 1; //定時器0開始計時 (定時器0為VCC更新計時)
  133.                                 }
  134.                                 else if (Wave_Shape == 1)
  135.                                 {
  136.                                         PWM_Hz = PWM_Hz_Pre;
  137.                                         EX1 = 1; //開啟外部中斷1(編碼器旋轉)
  138.                                         TR0 = 0; //關閉定時器0 (定時器0為VCC更新計時)
  139.                                         TF0 = 0; //清除TF0標志
  140.                                 }

  141.                                 else if (Wave_Shape == 2)
  142.                                 {
  143.                                         PWM_Hz_Pre = PWM_Hz;
  144.                                 }
  145.                         }
  146.                         if (Wave_Shape == 1) //方波
  147.                         {
  148.                                 Set_PWMCKS_PS();
  149.                                 Set_PWM_Cycle();
  150.                                 Set_PWM_Width();
  151.                         }
  152.                         else if (Wave_Shape == 2) //正弦波
  153.                         {
  154.                                 Set_Sin_Table_Times();
  155.                                 Set_PWMCKS_PS();
  156.                                 Set_PWM_Cycle();
  157.                         }

  158.                         Update_LCD();
  159.                         //EX1 = 0;
  160.                         Set_Wave_Shape();

  161.                         //IE1=0;
  162.                         //EX1 = 1;
  163.                 }
  164.         }
  165. }

  166. /* 編碼器旋轉響應函數
  167.    Encoder Rotate */
  168. void Scan_EC11(void)
  169. {
  170.         /* 正轉
  171.            Rotate clockwise */
  172.         if ((EC11_A != EC11_B))
  173.         {

  174.                 Change_Val(1);
  175.         }
  176.         /* 反轉
  177.            Rotate anticlockwise*/
  178.         else if ((EC11_A == EC11_B))
  179.         {
  180.                 Change_Val(0);
  181.         }
  182. }

  183. /* 編碼器旋轉中斷
  184.    Interrupt for Encoder rotation */
  185. void INT1_interrupt(void) interrupt INT_1
  186. {
  187.         Delay1ms();
  188.         Scan_EC11();
  189.         Update_Flag = 1;
  190.         //Delay50ms();
  191.         IE1 = 0;
  192. }

  193. /* 編碼器點擊中斷
  194.    Interrupt for Encoder click */
  195. void INT0_interrupt(void) interrupt INT_0
  196. {
  197.         Delay5ms();
  198.         if (!EC11_KEY)
  199.         {
  200.                 /* 長按
  201.                    Long Press */
  202.                 if (Delay500ms_long_click())
  203.                 {
  204.                         Wave_Shape++;
  205.                         if (Wave_Shape > WAVE_NUM)
  206.                                 Wave_Shape = 0;
  207.                         if (Wave_Shape == 2)
  208.                                 Options = 1;
  209.                         WAVE_ON = 0;
  210.                         Clear_LCD_Flag = 1;
  211.                 }
  212.                 /* 雙擊
  213.                    Double click */
  214.                 else if (Delay200ms_double_click())
  215.                 {
  216.                         if (Wave_Shape > 0)
  217.                         {
  218.                                 WAVE_ON = ~WAVE_ON;
  219.                         }
  220.                 }
  221.                 /* 單擊
  222.                    Single click */
  223.                 else
  224.                 {
  225.                         if (Wave_Shape == 1)
  226.                                 Options = ~Options;
  227.                 }
  228.                 Update_Flag = 1;
  229.         }
  230.         Delay5ms();
  231.         IE0 = 0;
  232. }

  233. /* 更新電壓信息計時中斷
  234.    Timer interrupt for update voltage information */
  235. void TIMER0_interrupt() interrupt TIMER_0
  236. {
  237.         if (++Timer0_Count > 200) //200x20=4000ms
  238.         {
  239.                 Timer0_Count = 0;
  240.                 Update_Flag = 1;
  241.         }
  242. }

復制代碼

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:813018 發表于 2020-8-20 19:44 | 只看該作者
有沒有hen編程源碼
回復

使用道具 舉報

板凳
ID:759755 發表于 2020-12-25 09:21 | 只看該作者
有配套原理圖嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一二三 | 91看片官网 | 国产精品一区二区av | 亚洲欧洲日韩 | 国产亚洲一区二区三区 | 久久精品亚洲欧美日韩久久 | 成人在线视频免费观看 | 日韩一区二区三区精品 | 日韩av免费在线观看 | 日韩视频在线免费观看 | 亚洲视频免费 | 精品视频在线播放 | 精品视频一区二区三区在线观看 | 久久久国产精品网站 | 日本a视频 | 国产成人高清 | 成人黄色电影在线播放 | 亚洲国产成人精品久久久国产成人一区 | 日韩毛片在线视频 | 免费成人高清在线视频 | 国产一区二区久久 | 久久久999成人 | 天天看天天干 | 日韩免费视频一区二区 | 亚洲成人免费观看 | 久久免费精品 | 久草资源在线视频 | 97人人草 | 成人在线精品视频 | 亚洲成人精品在线观看 | 精品久久久久一区二区国产 | 亚洲91精品 | 国产精品一二三区 | 欧美亚洲一区二区三区 | 亚洲三级在线观看 | 一级免费毛片 | 综合五月 | 波多野结衣一区二区三区在线观看 | 日韩在线免费 | 国产欧美在线播放 | 精品久久久久久久人人人人传媒 |