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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的正玄波和方波輸出設計(源碼+原理圖+proteus仿真)

[復制鏈接]
跳轉到指定樓層
樓主
題目:多路數據采集顯示器設計
用的芯片是:STC90C516RD+,PCF8591
一、基本要求:
1、用DA轉換器輸出一正弦信號,頻率150Hz
2、用AD轉換器周期測量此正弦信號的頻率,在數碼管或LCD上將頻率值顯示出來,精確到0.1Hz
3、同時用IO口輸出一500Hz的方波信號,用另一IO測量,顯示信號參數,
4、設置一功能鍵,切換兩種信號的顯示參數
5、通過鍵盤,可修改方波的頻率。每按一次鍵,頻率步進或后退一定值,頻率范圍100Hz~1500Hz

二、發揮部分:
1、通過鍵盤,可修改正弦波的頻率。每按一次鍵,頻率步進或后退一定值,頻率范圍10Hz~1000Hz
2、顯示器能同步反應參數的變化
3、按鍵時,蜂鳴器發出提示音,表示按鍵有效
顯示格式:
使用LCD1602,參數必須能顯示,并通過按鍵更改顯示不同參數內容

三、protuse仿真運行圖(方波和正玄波)


四、源代碼見附件

單片機源程序如下:
  1. /*-----------------------------------------------
  2.   名稱:LCD1602
  3.   編寫:shifang
  4.   日期:2019-9-3
  5.   修改:無
  6.   內容:通過標準程序動態顯示字符
  7.   引腳定義如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
  8. ------------------------------------------------*/
  9. #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  10. #include<intrins.h>

  11. #define  _Nop()  _nop_()        //定義空指令
  12. bit ack;                      //應答標志位
  13. bit flag_dis=0;

  14. sbit SDA=P2^1;
  15. sbit SCL=P2^0;
  16. #define AddWr 0x90   //寫數據地址
  17. #define AddRd 0x91   //讀數據地址
  18. unsigned char ReadADC(unsigned char Chl);
  19. bit WriteDAC(unsigned char dat);

  20. //--定義全局變量--//
  21. unsigned char code table[] ={"Welcome use: 000 "};
  22. unsigned char code table1[]={"SIN:0000.0Hz FAG "};
  23. unsigned int dis,deg;     //{"D:0 Voltage:0.00"};

  24. sbit RS = P2^4;   //定義端口
  25. sbit RW = P2^5;
  26. sbit EN = P2^6;
  27. sbit out = P2^7;

  28. sbit k1 = P3^5;
  29. sbit k2 = P3^6;
  30. sbit k3 = P3^7;

  31. sbit out2 =P1^7;
  32. sbit buz = P1^2;

  33. unsigned int fh=150,fh2=100;        //初始頻率為150Hz
  34. unsigned int t_10us=0,pinlv,t100us,t100us2;
  35. #define RS_CLR RS=0
  36. #define RS_SET RS=1

  37. #define RW_CLR RW=0
  38. #define RW_SET RW=1

  39. #define EN_CLR EN=0
  40. #define EN_SET EN=1

  41. #define DataPort P0

  42. unsigned char code table2[256] ={
  43.    0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9c, 0x9f,
  44.    0xa2, 0xa5, 0xa8, 0xab, 0xae, 0xb0, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf,
  45.    0xc1, 0xc4, 0xc7, 0xc9, 0xcc, 0xce, 0xd1, 0xd3, 0xd5, 0xd8, 0xda,
  46.    0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xed, 0xef,
  47.    0xf0, 0xf2, 0xf3, 0xf4, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc,
  48.    0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  49.    0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa,
  50.    0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xec,
  51.    0xea, 0xe8, 0xe6, 0xe4, 0xe3, 0xe1, 0xde, 0xdc, 0xda, 0xd8, 0xd6,
  52.    0xd3, 0xd1, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc, 0xb9,
  53.    0xb6, 0xb4, 0xb1, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99,
  54.    0x96, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x83, 0x80, 0x7d, 0x79, 0x76,
  55.    0x73, 0x70, 0x6d, 0x6a, 0x67, 0x64, 0x61, 0x5e, 0x5b, 0x58, 0x55,
  56.    0x52, 0x4f, 0x4c, 0x49, 0x46, 0x43, 0x41, 0x3e, 0x3b, 0x39, 0x36,
  57.    0x33, 0x31, 0x2e, 0x2c, 0x2a, 0x27, 0x25, 0x23, 0x21, 0x1f, 0x1d,
  58.    0x1b, 0x19, 0x17, 0x15, 0x14, 0x12, 0x10, 0x0f, 0x0d, 0x0c, 0x0b,
  59.    0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x01, 0x01,
  60.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  61.    0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
  62.    0x0a, 0x0c, 0x0d, 0x0e, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a,
  63.    0x1c, 0x1e, 0x20, 0x23, 0x25, 0x27, 0x29, 0x2c, 0x2e, 0x30, 0x33,
  64.    0x35, 0x38, 0x3b, 0x3d, 0x40, 0x43, 0x46, 0x48, 0x4b, 0x4e, 0x51,
  65.    0x54, 0x57, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, 0x6f, 0x73,
  66.    0x76, 0x79, 0x7c,
  67. };
  68. /*------------------------------------------------
  69. uS延時函數,含有輸入參數 unsigned char t,無返回值
  70. unsigned char 是定義無符號字符變量,其值的范圍是
  71. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  72. 長度如下 T=tx2+5 uS
  73. ------------------------------------------------*/
  74. void DelayUs2x(unsigned int t)
  75. {   
  76. while(--t);
  77. }
  78. /*------------------------------------------------
  79. mS延時函數,含有輸入參數 unsigned char t,無返回值
  80. unsigned char 是定義無符號字符變量,其值的范圍是
  81. 0~255 這里使用晶振12M,精確延時請使用匯編
  82. ------------------------------------------------*/
  83. void DelayMs(unsigned int t)
  84. {
  85.      
  86. while(t--)
  87. {
  88.      //大致延時1mS
  89.      DelayUs2x(245);
  90.          DelayUs2x(245);
  91. }
  92. }

  93. /*------------------------------------------------
  94.                     啟動總線
  95. ------------------------------------------------*/
  96. void Start_I2c()
  97. {
  98.   SDA=1;   //發送起始條件的數據信號
  99.   _Nop();
  100.   SCL=1;
  101.   _Nop();    //起始條件建立時間大于4.7us,延時
  102.   _Nop();
  103.   _Nop();
  104.   _Nop();   
  105.   SDA=0;     //發送起始信號
  106.   _Nop();    //起始條件鎖定時間大于4μ
  107.   _Nop();
  108.   _Nop();
  109.   _Nop();      
  110.   SCL=0;    //鉗住I2C總線,準備發送或接收數據
  111.   _Nop();
  112.   _Nop();
  113. }
  114. /*------------------------------------------------
  115.                     結束總線
  116. ------------------------------------------------*/
  117. void Stop_I2c()
  118. {
  119.   SDA=0;    //發送結束條件的數據信號
  120.   _Nop();   //發送結束條件的時鐘信號
  121.   SCL=1;    //結束條件建立時間大于4μ
  122. /* _Nop();
  123.   _Nop();
  124.   _Nop();
  125.   _Nop();*/
  126.    DelayUs2x(1);
  127.   SDA=1;    //發送I2C總線結束信號
  128. /*  _Nop();
  129.   _Nop();
  130.   _Nop();*/
  131. }

  132. /*----------------------------------------------------------------
  133.                  字節數據傳送函數               
  134. 函數原型: void  SendByte(unsigned char c);
  135. 功能:  將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
  136.      此狀態位進行操作.(不應答或非應答都使ack=0 假)     
  137.      發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
  138. ------------------------------------------------------------------*/
  139. void  SendByte(unsigned char c)
  140. {
  141. unsigned char BitCnt;

  142. for(BitCnt=0;BitCnt<8;BitCnt++)  //要傳送的數據長度為8位
  143.     {
  144.      if((c<<BitCnt)&0x80)SDA=1;   //判斷發送位
  145.        else  SDA=0;               
  146.      _Nop();
  147.      SCL=1;               //置時鐘線為高,通知被控器開始接收數據位
  148.       DelayUs2x(2);
  149.     /*  _Nop();             //保證時鐘高電平周期大于4μ
  150.       _Nop();
  151.       _Nop();
  152.       _Nop();  */      
  153.      SCL=0;
  154.     }
  155.    
  156.   //  _Nop();
  157.     _Nop();
  158.     SDA=1;               //8位發送完后釋放數據線,準備接收應答位
  159.   //  _Nop();
  160.     _Nop();   
  161.     SCL=1;
  162.     DelayUs2x(1);
  163.    /* _Nop();
  164.     _Nop();
  165.     _Nop();
  166.     if(SDA==1)ack=0;     
  167.        else ack=1;  */      //判斷是否接收到應答信號
  168.     SCL=0;
  169.   //  _Nop();
  170. }

  171. /*----------------------------------------------------------------
  172.                  字節數據傳送函數               
  173. 函數原型: unsigned char  RcvByte();
  174. 功能:  用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
  175.      發完后請用應答函數。  
  176. ------------------------------------------------------------------*/        
  177. unsigned char  RcvByte()
  178. {
  179.   unsigned char retc;
  180.   unsigned char BitCnt;
  181.   
  182.   retc=0;
  183.   SDA=1;             //置數據線為輸入方式
  184.   for(BitCnt=0;BitCnt<8;BitCnt++)
  185.       {
  186.         _Nop();           
  187.         SCL=0;       //置時鐘線為低,準備接收數據位
  188.         DelayUs2x(2);
  189.       /*  _Nop();
  190.         _Nop();      //時鐘低電平周期大于4.7us
  191.         _Nop();
  192.         _Nop();
  193.         _Nop();*/
  194.         SCL=1;       //置時鐘線為高使數據線上數據有效
  195.       //  _Nop();
  196.       //  _Nop();
  197.         retc=retc<<1;
  198.         if(SDA==1)retc=retc+1; //讀數據位,接收的數據位放入retc中
  199.      //   _Nop();
  200.      //   _Nop();
  201.       }
  202.   SCL=0;   
  203.   return(retc);
  204. }

  205. /*----------------------------------------------------------------
  206.                      非應答子函數
  207. 原型:  void NoAck_I2c(void);

  208. ----------------------------------------------------------------*/
  209. void NoAck_I2c(void)
  210. {
  211.   
  212.   SDA=1;
  213.    DelayUs2x(1);
  214. /* _Nop();
  215.   _Nop();
  216.   _Nop();   */   
  217.   SCL=1;
  218.   /*_Nop();
  219.   _Nop();              //時鐘低電平周期大于4μ
  220.   _Nop();
  221.   _Nop(); */
  222.   DelayUs2x(1);
  223.   SCL=0;                //清時鐘線,鉗住I2C總線以便繼續接收
  224. // _Nop();
  225. //_Nop();   
  226. }

  227. /*------------------------------------------------
  228.               寫入命令函數
  229. ------------------------------------------------*/
  230. void LCD_Write_Com(unsigned char com)
  231. {  
  232. // while(LCD_Check_Busy()); //忙則等待
  233. DelayMs(5);
  234. RS_CLR;
  235. RW_CLR;
  236. EN_SET;
  237. DataPort= com;
  238. _nop_();
  239. EN_CLR;
  240. }
  241. /*------------------------------------------------
  242.               寫入數據函數
  243. ------------------------------------------------*/
  244. void LCD_Write_Data(unsigned char Data)
  245. {
  246. //while(LCD_Check_Busy()); //忙則等待
  247. DelayMs(5);
  248. RS_SET;
  249. RW_CLR;
  250. EN_SET;
  251. DataPort= Data;
  252. _nop_();
  253. EN_CLR;
  254. }

  255. /*------------------------------------------------
  256.                 清屏函數
  257. ------------------------------------------------*/
  258. void LCD_Clear(void)
  259. {
  260. LCD_Write_Com(0x01);
  261. DelayMs(5);
  262. }

  263. /*------------------------------------------------
  264.               初始化函數
  265. ------------------------------------------------*/
  266. void LCD_Init(void)
  267. {
  268.   // LCD_Write_Com(0x38);    /*顯示模式設置*/
  269. //  DelayMs(5);
  270. //  LCD_Write_Com(0x38);
  271. //  DelayMs(5);
  272.    LCD_Write_Com(0x38);
  273.    DelayMs(5);
  274.    LCD_Write_Com(0x38);  
  275.    LCD_Write_Com(0x08);    /*顯示關閉*/
  276.    LCD_Write_Com(0x01);    /*顯示清屏*/
  277.    LCD_Write_Com(0x06);    /*顯示光標移動設置*/
  278.    DelayMs(5);
  279.    LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
  280.    }

  281. /*------------------------------------------------
  282.              讀AD轉值程序
  283. 輸入參數 Chl 表示需要轉換的通道,范圍從0-3
  284. 返回值范圍0-255
  285. ------------------------------------------------*/
  286. /*unsigned char ReadADC(unsigned char Chl)
  287. {
  288.    unsigned char Val;
  289.    Start_I2c();               //啟動總線
  290.    SendByte(AddWr);             //發送器件地址
  291.      if(ack==0)return(0);
  292.    SendByte(0x40|Chl);            //發送器件子地址
  293.      if(ack==0)return(0);
  294.    Start_I2c();
  295.    SendByte(AddWr+1);
  296.       if(ack==0)return(0);
  297.    Val=RcvByte();
  298.    NoAck_I2c();                 //發送非應位
  299.    Stop_I2c();                  //結束總線
  300.    t_10us=100;
  301.   return(Val);
  302. }*/

  303. /*------------------------------------------------
  304.                寫入DA轉換數值
  305. 輸入參數:dat 表示需要轉換的DA數值,范圍是0-255
  306. ------------------------------------------------*/
  307. /*bit WriteDAC(unsigned char dat)
  308. {
  309.    Start_I2c();               //啟動總線
  310.    SendByte(AddWr);             //發送器件地址
  311.      if(ack==0)return(0);
  312.    SendByte(0x40);            //發送器件子地址
  313.      if(ack==0)return(0);
  314.    SendByte(dat);             //發送數據
  315.      if(ack==0)return(0);
  316.    Stop_I2c();  
  317. }*/

  318. bit WriteDAC2()
  319. {
  320.    unsigned int numm;
  321.    Start_I2c();               //啟動總線
  322.    SendByte(AddWr);             //發送器件地址
  323.    //  if(ack==0)return(0);
  324.    SendByte(0x40);            //發送器件子地址
  325.    //  if(ack==0)return(0);
  326.         
  327.     for(numm=0;numm<256;numm++)
  328.     {        
  329.        SendByte(table2[numm]);             //發送數據
  330.        DelayUs2x((unsigned int)(1000/fh*3.9)-4);                //150-1000Hz
  331.     }   
  332.    
  333.   //   if(ack==0)return(0);
  334.   // Stop_I2c();  
  335. }

  336. /*void InitTimer0(void)
  337. {
  338.     TMOD = 0x01;
  339.     TH0 = 0x0FF;
  340.     TL0 = 0x0F6;
  341.     EA = 1;
  342.     ET0 = 1;
  343.     TR0 = 0;
  344. }

  345. void Timer0Interrupt(void) interrupt 1
  346. {
  347.     TH0 = 0x0FF;
  348.     TL0 = 0x0F6;
  349.     t_10us++;
  350.     if(t_10us>10000)t_10us=0;
  351. }*/

  352. void InitTimer1(void)
  353. {
  354.     TMOD |= 0x10;
  355.     TH1 = 0xFF;
  356.     TL1 = 0xF6;
  357.     EA = 1;
  358.     ET1 = 1;
  359.     TR1 = 0;
  360. }
  361. void Timer1Interrupt(void) interrupt 3
  362. {
  363.     TH1 = 0xFF;
  364.     TL1 = 0xF6;
  365.     t100us++;
  366.     t100us2++;   
  367.     if(t100us2<10)out2=0;
  368.        else if(t100us2<20)out2=1;
  369.           else t100us2=0;
  370.    
  371.    // if(t100us>10000)
  372.    //   t100us=0;
  373.     if(t100us<(500*5/fh2))out=1;   
  374.       else if(t100us<(500*8/fh2))out=0;  
  375.          else t100us=0;

  376.      // keyscan();            
  377. }

  378. void display()
  379. {
  380. unsigned int shi,ge,bai,qian,wan;
  381.    
  382.       LCD_Write_Com(0x80+0x40);   
  383.       if(flag_dis==1)
  384.       {         
  385.        LCD_Write_Data(table1[13]);      
  386.        LCD_Write_Data(table1[14]);
  387.        LCD_Write_Data(table1[15]);
  388.        pinlv=fh2;         
  389.       }
  390.       if(flag_dis==0)
  391.       {         
  392.        LCD_Write_Data(table1[0]);      
  393.        LCD_Write_Data(table1[1]);
  394.        LCD_Write_Data(table1[2]);
  395.        pinlv=fh;
  396.       }  
  397.        pinlv*=10.0;
  398.        wan=pinlv/10000;
  399.        qian=pinlv%10000/1000;
  400.        bai=pinlv%1000/100;
  401.      //  shi=pinlv%100/10;
  402.      //  ge=pinlv%10;  
  403.       
  404.        LCD_Write_Com(0x8d);   
  405.        if(flag_dis==1)         
  406.           LCD_Write_Data(0x35);
  407.        else LCD_Write_Data(0x30);
  408.          
  409.        LCD_Write_Com(0x80+0x44);
  410.        LCD_Write_Data(0x30+wan);      
  411.        LCD_Write_Data(0x30+qian);      
  412.        LCD_Write_Data(0x30+bai);
  413.      //  LCD_Write_Data(0x30+shi);
  414.     //   LCD_Write_Com(0x80+0x49);   
  415.     //   LCD_Write_Data(0x30+ge);      
  416. }

  417. void keyscan()
  418. {
  419.    TR1 = 0;
  420.       if(k1==0)
  421.       {TR1 = 0;
  422.         DelayMs(10);
  423.          if(k1==0)
  424.          {
  425.             if(flag_dis==0)
  426.             flag_dis=1;
  427.             else flag_dis=0;
  428.           while(!k1){buz=!buz;DelayUs2x(250);}
  429.          }
  430.                display();
  431.       }
  432.       if(k2==0)
  433.       {TR1 = 0;
  434.         DelayMs(10);
  435.          if(k2==0)
  436.          {
  437.             if(flag_dis==0)
  438.             if(fh==10)fh=0;
  439.             if(fh<1000)
  440.             fh+=50;
  441.             if(flag_dis==1)
  442.             if(fh2<1500)
  443.             fh2+=100;            
  444.           while(!k2){buz=!buz;DelayUs2x(250);}  
  445.          }
  446.                display();
  447.       }
  448.       if(k3==0)
  449.       {TR1 = 0;
  450.         DelayMs(10);
  451.          if(k3==0)
  452. ……………………

  453. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
仿真程序.7z (309.04 KB, 下載次數: 90)


評分

參與人數 2黑幣 +55 收起 理由
狂吃不胖沒辦法 + 5
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1077762 發表于 2023-5-16 09:00 | 只看該作者
仿真程序是真的嗎?
回復

使用道具 舉報

板凳
ID:1124521 發表于 2024-6-10 17:10 來自手機 | 只看該作者
2192944381 發表于 2023-5-16 09:00
仿真程序是真的嗎?

真的真的

1C280C05-89AF-4297-A0E9-0C5D5EE0CF48.png (432.72 KB, 下載次數: 15)

1C280C05-89AF-4297-A0E9-0C5D5EE0CF48.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91福利在线观看视频 | 精品欧美乱码久久久久久 | 一级做受毛片免费大片 | 国产欧美在线 | 欧美在线一区二区三区 | 小早川怜子xxxxaⅴ在线 | 亚洲欧美中文日韩在线v日本 | 久久久久久国产 | 欧美1—12sexvideos | av一区二区在线观看 | 国产精品99久久久久久动医院 | 日本黄色片免费在线观看 | 亚洲精品91 | 日本电影韩国电影免费观看 | 日韩在线免费视频 | 国产成人99久久亚洲综合精品 | 亚洲精品视频网站在线观看 | 国产精品无码久久久久 | 九九精品视频在线 | 国户精品久久久久久久久久久不卡 | 欧美一区二区在线播放 | 午夜精品一区二区三区三上悠亚 | 国产精品久久久久aaaa | 在线不卡一区 | 午夜精品影院 | 日韩成人国产 | 国产精品1区2区3区 国产在线观看一区 | 欧美一区二区三区四区在线 | 美女逼网站 | www免费视频 | 精品免费国产一区二区三区四区介绍 | 欧美成视频 | 国产欧美日韩精品在线观看 | 精品国产高清一区二区三区 | 黄色免费av | 精品成人| 久久国产成人精品国产成人亚洲 | 成人av一区二区三区 | 亚洲免费在线 | 中国av在线免费观看 | av在线免费观看网站 |