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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3442|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:714407 發(fā)表于 2020-7-24 13:54 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
信號發(fā)生器,有Keil程序和Gerber打板。

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


Gerber文件下載(無PCB): 51單片機信號發(fā)生器機.7z (3.33 MB, 下載次數(shù): 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.         波形發(fā)生器
  10.         作者:老劉愛搗鼓
  11.         版本:V0.3.1
  12.         單片機型號:STC15W4K32S4 @24MHz
  13.         B站視頻教程:https://www.bilibili.com/video/BV12k4y197Qu
  14.         老劉愛搗鼓(全網(wǎng)同名)期待您的關(guān)注!

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

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

  30.         操作:
  31.         單擊編碼器:方波界面下,切換頻率和占空比
  32.         雙擊編碼器:開啟或關(guān)閉波形輸出
  33.         長按編碼器:切換方波界面/正弦波界面/電壓顯示界面
  34.         旋轉(zhuǎn)編碼器:調(diào)節(jié)參數(shù)

  35.         2020-05-06 更新
  36.         1. 修正main函數(shù)循環(huán)中會引起編碼器旋轉(zhuǎn)混亂的錯誤
  37.            將main函數(shù)中while循環(huán)中的Update_Flag=0;放到前面清零,放在后面會在編碼器高速旋轉(zhuǎn)時,多次觸發(fā)中斷而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          //編碼器旋轉(zhuǎn) 觸發(fā)外部中斷
  66. #define INT_0 0          //編碼器按下 觸發(fā)外部中斷

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

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

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

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

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

  91.         /* 定時器0,用于更新電壓信息計時
  92.            Timer 0 for updating the information of VCC*/
  93.         TMOD &= 0xF0;  //設(shè)置定時器0模式 16位自動重載,在Keil中debug的話,請注意,這種設(shè)置是8051的舊13位模式
  94.         AUXR &= ~0x80; //定時器0時鐘12T模式
  95.         TL0 = 0xC0;           //設(shè)置定時初值 24MHz 20ms
  96.         TH0 = 0x63;           //設(shè)置定時初值 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的過程中再次觸發(fā)編碼器旋轉(zhuǎn)中斷的話,
  119.                                 在執(zhí)行完Update_LCD后,在中斷中置位的Update_Flag卻被清零了,造成LCD沒刷新,輸出和顯示的不一致。
  120.                                 另一種方法是在執(zhí)行Update_LCD前把中斷關(guān)掉,執(zhí)行完再打開中斷, 但如果這里面的函數(shù)執(zhí)行時間比較長,會產(chǎn)生旋轉(zhuǎn)觸發(fā)不及時,使用感受卡頓。
  121.                                 關(guān)中斷來避免重復(fù)觸發(fā)是有好處的,可以避免在函數(shù)執(zhí)行過程中多次觸發(fā)將參數(shù)修改掉,
  122.                                 函數(shù)執(zhí)行過程中參數(shù)被修改,可能會造成計算結(jié)果混亂,嚴(yán)重時會造成溢出,甚至單片機復(fù)位死機。        */
  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; //關(guān)閉外部中斷1(編碼器旋轉(zhuǎn))
  131.                                         TF0 = 0; //清除TF0標(biāo)志
  132.                                         TR0 = 1; //定時器0開始計時 (定時器0為VCC更新計時)
  133.                                 }
  134.                                 else if (Wave_Shape == 1)
  135.                                 {
  136.                                         PWM_Hz = PWM_Hz_Pre;
  137.                                         EX1 = 1; //開啟外部中斷1(編碼器旋轉(zhuǎn))
  138.                                         TR0 = 0; //關(guān)閉定時器0 (定時器0為VCC更新計時)
  139.                                         TF0 = 0; //清除TF0標(biāo)志
  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. /* 編碼器旋轉(zhuǎn)響應(yīng)函數(shù)
  167.    Encoder Rotate */
  168. void Scan_EC11(void)
  169. {
  170.         /* 正轉(zhuǎn)
  171.            Rotate clockwise */
  172.         if ((EC11_A != EC11_B))
  173.         {

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

  183. /* 編碼器旋轉(zhuǎn)中斷
  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. }

復(fù)制代碼

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产999精品久久久久久 | 欧美一区二区在线观看 | 日韩电影中文字幕 | 成人超碰 | 久久精品久久久 | 又黄又爽的网站 | 婷婷午夜天 | 日韩成人性视频 | 欧美成人一区二区 | 精品久久久久久一区二区 | 日本精品裸体写真集在线观看 | 国产成人精品综合 | 日韩中文字幕视频 | 91麻豆精品国产91久久久资源速度 | 国产福利视频 | 亚洲美女av网站 | 能看的av | 在线观看免费观看在线91 | 亚洲精品中文字幕av | 国产一级片在线播放 | 国产精品久久国产精品久久 | 亚洲淫视频| 国产精品永久免费观看 | 羞羞视频网站在线观看 | 羞羞视频在线免费 | www.日韩欧美 | 亚洲成网站 | 99在线免费观看视频 | 亚洲一区二区三区在线播放 | 亚洲精品久久久9婷婷中文字幕 | 久久精品 | 日本小电影在线 | 午夜国产羞羞视频免费网站 | 国产精品久久久久久久久久久久久 | 在线国产小视频 | 美女福利视频网站 | 中文字幕精品一区二区三区精品 | 欧美激情综合色综合啪啪五月 | 久久国产亚洲 | 日韩精品视频网 | 狠狠干av |