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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3866|回復: 1
收起左側

MSP403單片機+TLC5615+ADC0808恒流源Proteus仿真程序設計

[復制鏈接]
ID:511094 發表于 2020-4-27 13:07 | 顯示全部樓層 |閱讀模式
51hei.png 1587963963(1).jpg 1587963942(1).jpg 1587963989(1).jpg

單片機源程序如下:
  1. /******************************************************************
  2. * 實驗說明:
  3. *     通設置系統主時鐘(MCLK=8Mhz ) 、輔助時鐘(ACLK=8Mhz )、
  4. *      子系統時鐘(SMCLK=8Mhz )
  5. ******************************************************************/

  6. #include <MSP430x24x.h>
  7. #include <string.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int

  10. /**************定義接口************************/
  11. #define LCDIO     P1OUT
  12. #define LCD1602_RS_1  P2OUT|=1  
  13. #define LCD1602_RS_0  P2OUT&=~1
  14. #define LCD1602_RW_1  P2OUT|=2
  15. #define LCD1602_RW_0  P2OUT&=~2
  16. #define LCD1602_EN_1   P2OUT|=4
  17. #define LCD1602_EN_0   P2OUT&=~4

  18. #define PWM_1   P2OUT|=8
  19. #define PWM_0   P2OUT&=~8

  20. /**************定義函數************************/
  21. void LCD_write_command(unsigned char command);//寫入指令函數
  22. void LCD_write_dat( unsigned char dat);//寫入數據函數
  23. void LCD_set_xy( unsigned char x, unsigned char y );//設置顯示位置函數
  24. void LCD_dsp_char( unsigned char x,unsigned char y, char dat);//顯示一個字符函數
  25. void LCD_dsp_string(unsigned char X,unsigned char Y,const char *s);//顯示字符串函數
  26. void LCD_init(void);//初始化函數
  27. void delay_nms(unsigned int n);//延時函數

  28. void TCL5615_DAC(unsigned int Data);
  29. /********************************************/

  30. //變量定義
  31. unsigned char Disbuf[10],flag;

  32. unsigned int DAC_num = 5;


  33. //ADC采集函數
  34. void RefreshDis0(unsigned int Data0)
  35. {
  36.     Disbuf[0] = 0x30 + Data0/100%10;
  37.     Disbuf[1] = '.';
  38.     Disbuf[2] = 0x30 + Data0/10%10;
  39.     Disbuf[3] = 0x30 + Data0%10;
  40.     Disbuf[4] = 'V';
  41. }
  42. //ADC采集函數
  43. void RefreshDis1(unsigned int Data1)
  44. {
  45.     Disbuf[5] = 0x30 + Data1/100%10;
  46.     Disbuf[6] = '.';
  47.     Disbuf[7] = 0x30 + Data1/10%10;
  48.     Disbuf[8] = 0x30 + Data1%10;
  49.     Disbuf[9] = 'A';
  50. }

  51. void P25_Onclick( void )
  52. {
  53.     DAC_num = 5;
  54.     TCL5615_DAC( DAC_num );                      //205 對應1.0V    410  對應2.0V   5---20mA
  55.       
  56. }

  57. void P26_Onclick( void )
  58. {
  59.   //20mA
  60.    DAC_num = DAC_num + 10;
  61.    if( DAC_num > 420 )
  62.    {
  63.      DAC_num = 420;
  64.    }
  65.     TCL5615_DAC( DAC_num );                      //205 對應1.0V    410  對應2.0V   5---20mA
  66.       
  67. }

  68. void P27_Onclick( void )
  69. {
  70.    DAC_num = DAC_num - 5;
  71.    if( DAC_num < 5 )
  72.    {
  73.      DAC_num = 5;
  74.    }
  75.     TCL5615_DAC( DAC_num );                      //205 對應1.0V    410  對應2.0V   5---20mA
  76.       
  77. }

  78. //電壓顯示函數
  79. void Display( void )
  80. {
  81.     LCD_write_command( 0x80 );
  82.     LCD_write_dat('V');
  83.     LCD_write_dat(':');
  84.     LCD_write_dat( Disbuf[0] );
  85.     LCD_write_dat( Disbuf[1] );
  86.     LCD_write_dat( Disbuf[2] );
  87.     LCD_write_dat( Disbuf[3] );
  88.     LCD_write_dat( Disbuf[4] );
  89.     LCD_write_dat( ' ' );
  90.     LCD_write_dat( ' ' );
  91.     LCD_write_dat('I');
  92.     LCD_write_dat(':');
  93.     LCD_write_dat( Disbuf[5] );
  94.     LCD_write_dat( Disbuf[6] );
  95.     LCD_write_dat( Disbuf[7] );
  96.     LCD_write_dat( Disbuf[8] );
  97.     LCD_write_dat( Disbuf[9] );
  98. }


  99. void Display_Set( void )
  100. {
  101.    LCD_write_command( 0x80 + 0x40 );
  102.    LCD_write_dat( 'S' );
  103.    LCD_write_dat( 'e' );
  104.    LCD_write_dat( 't' );
  105.    LCD_write_dat( ':' );
  106.    LCD_write_dat( ' ' );
  107. }

  108. /*******延時函數************/
  109. void delayms(uint t)
  110. {
  111.     uint i;
  112.     while(t--)
  113.       for(i=1330;i>0;i--);//進過參數的調整
  114. }

  115. /*******檢查忙函數*************/
  116. void LCD_check_busy()      //實踐證明,在我的LCD1602上,檢查忙指令通過率極低,以
  117. {                                          //至于不能正常使用LCD。因此我沒有再用檢查忙函數。而使

  118.         P1DIR=0x00;
  119.         LCDIO=0xff;
  120.         LCD1602_RS_0;                 //要用200次循環便能完成。   
  121.         LCD1602_RW_1;
  122.         LCD1602_EN_1;
  123.         while(P1IN&0x80);
  124.         LCD1602_EN_0;
  125.         P1OUT=0x00;
  126.         P1DIR=0xFF;
  127. }
  128. /******************************/

  129. /**************寫指令函數********************************/  
  130. void LCD_write_command(unsigned char command)
  131. {
  132.         
  133.         LCD1602_RS_0;   
  134.         LCDIO=command;
  135.         LCD1602_EN_1;
  136.         
  137.         LCD1602_EN_0;
  138.         delayms(1);
  139.   
  140. }
  141. /***************************************************/
  142. /****************寫數據函數************************/
  143. void LCD_write_dat( unsigned char dat)
  144. {
  145.       LCD1602_RS_1;
  146.       LCDIO=dat;
  147.       LCD1602_EN_1;
  148.       
  149.       LCD1602_EN_0;
  150.       delayms(1);
  151.       LCD1602_RS_0;


  152. }
  153. /****************************************************/
  154. /***************設置顯示位置**************************/
  155. void LCD_set_xy( unsigned char x, unsigned char y )
  156. {
  157.         unsigned char address;
  158.         if (y == 1)
  159.              address = 0x80+x;
  160.         else if (y == 2)
  161.         {
  162.                address=0x80+0x40+x;
  163.                
  164.         }
  165.         LCD_write_command(address);
  166. }
  167. /***************************************************/
  168. /****************顯示一個字符**********************/
  169. void LCD_dsp_char( unsigned char x,unsigned char y, char dat)
  170. {
  171.         LCD_set_xy( x, y );
  172.         LCD_write_dat(dat);
  173. }
  174. /**********************************************/
  175. /***************顯示字符串函數***************/
  176. void LCD_dsp_string(unsigned char X,unsigned char Y,const char *s)
  177. {
  178.        uchar len,List;
  179.        len=strlen(s);
  180.        LCD_set_xy( X, Y );
  181.        for(List=0;List<len;List++)
  182.        LCD_write_dat(s[List]);
  183.       
  184. }
  185. /***********************************************/
  186. /********** 延時**********************/
  187. void delay_nms(unsigned int n)      
  188. {
  189.        unsigned int i=0,j=0;
  190.        for (i=n;i>0;i--)
  191.        for (j=0;j<1;j++);  
  192. }
  193. /**************************************/
  194. /************初始化函數****************/
  195. void LCD_init(void)
  196. {
  197.       LCD1602_RW_0;
  198.       LCD1602_EN_0;
  199.       //CLEARSCREEN;//clear screen
  200.       LCD_write_command(0x38);//set 8 bit data transmission mode
  201.       delayms(1);
  202.       LCD_write_command(0x38);//set 8 bit data transmission mode
  203.       delayms(1);
  204.       LCD_write_command(0x38);//set 8 bit data transmission mode
  205.       delayms(1);
  206.       LCD_write_command(0x06);//open display (enable lcd display)
  207.       delayms(1);
  208.       LCD_write_command(0x0C);//set lcd first display address
  209.       delayms(1);
  210.       LCD_write_command(0x01);//clear screen
  211.       delayms(1);
  212.       LCD_dsp_string(1,1,"  LCD TEST   ");//在第一行第一列顯示"LCD TEST"
  213.       LCD_dsp_string(1,2,"  SUCCSEEE!  ");//在第一行第一列顯示"LCD TEST"
  214.       delayms(500);
  215.       LCD_write_command(0x01);//clear screen
  216.       delayms(1);
  217. }
  218. /****************************************************/



  219. //ADC

  220. #define ADCST0          P5OUT &= ~BIT4
  221. #define ADCST1         P5OUT |= BIT4
  222. #define ADCALE0         P5OUT &= ~BIT5
  223. #define ADCALE1         P5OUT |= BIT5
  224. #define ADCEOC0         P5OUT &= ~BIT6
  225. #define ADCEOC1         P5OUT |= BIT6
  226. #define ADCOE0          P5OUT &= ~BIT7
  227. #define ADCOE1          P5OUT |= BIT7  
  228. #define ADC_Channel0          P5OUT &= ~BIT0
  229. #define ADC_Channel1          P5OUT |= BIT0
  230. unsigned int  ADC1;
  231. void ADC_START(void)
  232. {
  233.   ADCALE1;
  234.   ADCST1;
  235.   delayms(1);
  236.    ADCALE0;
  237.   ADCST0;
  238.    delayms(1);
  239. }

  240. char ADC_READ()
  241. {
  242.   uchar data;
  243.    data=0x00;
  244.    delayms(1);
  245.    ADCOE1;
  246.   ADC_START();
  247.    delayms(5);
  248.   data=P4IN;
  249.    ADCOE0;
  250.   return data;
  251. }

  252. // DAC

  253. //=============================================================================
  254. #define SET_DIN   do{P3OUT |= BIT0;}while(0)      //串行數據輸入
  255. #define CLR_DIN   do{P3OUT &= ~(BIT0);}while(0)      //串行數據輸入
  256. #define SET_SCLK  do{P3OUT |= BIT1;}while(0)     //串行時鐘輸入
  257. #define CLR_SCLK  do{P3OUT &= ~(BIT1);}while(0)     //串行時鐘輸入
  258. #define SET_CS    do{P3OUT |= BIT2;}while(0)      //低電平有效
  259. #define CLR_CS    do{P3OUT &= ~(BIT2);}while(0)      //低電平有效
  260. //=============================================================================

  261. /*****************************************軟件延時******************************/
  262. #define CPU_F ((double)16000000)
  263. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  264. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  265. /*******************************************************************************/

  266. void TCL5615_DAC(unsigned int Data)
  267. {
  268.   unsigned char i;
  269.   Data <<= 6;     //移除高6位,int型數據有16位,該DA是10位
  270.   CLR_SCLK;    //在片選有效前,時鐘信號要為低
  271.   CLR_CS;        //片選有效

  272.   
  273.   for(i=0;i<12;i++)       //每次轉換需要10個時鐘下降沿
  274.   {
  275.     if(Data&0x8000)     //取最高位數據,模擬串行數據
  276.     {
  277.       SET_DIN;
  278.       CLR_SCLK;
  279.       SET_SCLK;
  280.     }
  281.     else
  282.     {
  283.       CLR_DIN;           //數據在時鐘上升沿到來前準備好
  284.       CLR_SCLK;
  285.       SET_SCLK;
  286.     }
  287.     Data <<= 1;          //數據左移,為下一次取數據做準備
  288.     CLR_SCLK;
  289.   }
  290.   
  291.   SET_CS;                    //片選失效
  292. delayms(1);
  293. }





  294. void main(void)
  295. {
  296.    
  297.     WDTCTL=WDTPW + WDTHOLD; // 關閉看門狗
  298.     P1DIR=0xFF;            // 設置方向
  299.     P1SEL=0;            // 設置為普通I/O 口
  300.    
  301.     P2DIR=0x0F;            // 設置方向
  302.    // P2SEL=0;            // 設置為普通I/O 口
  303.    
  304.     P3DIR=0xFF;            // 設置方向
  305.     //-----配合機械按鍵,啟用內部上拉電阻-----
  306.     P2REN |= BIT5+BIT6+BIT7;                     //啟用P3.5內部上下拉電阻
  307.     P2OUT |= BIT5+BIT6+BIT7;                     //將電阻設置為上拉
  308.     //-----配置P3.5中斷參數-----
  309.     P2DIR &= ~BIT5+BIT6+BIT7;                    // P3.5設為輸入(可省略)
  310.     P2IES |= BIT5+BIT6+BIT7;                     // P3.5設為下降沿中斷
  311.     P2IE  |= BIT5+BIT6+BIT7;                    // 允許P3.5中斷
  312.    
  313.    
  314.     P1OUT=0x00;
  315.    

  316.    
  317.     P5SEL = 0x00;
  318.     P5DIR |= BIT0+BIT4+BIT5+BIT6;
  319.    
  320.    
  321.     delayms(200);   
  322.     LCD_init();         //LCD1602初始化
  323.    
  324.    
  325.     /****設置AD寄存器****/
  326.     ADC12CTL0=ADC12ON+SHT0_2;//打開AD轉換內核,參考電壓3.3V
  327.     ADC12CTL1=SHP;
  328.     ADC12IE=0X01;//使能中斷允許
  329.     ADC12CTL0|=ENC;
  330.     P6SEL|=0x01;//P6.0電壓輸入
  331.     P6DIR = 0xFE;
  332.     flag=0;
  333.     ADC12CTL0|=ADC12SC;//啟動ADC轉換器
  334.     _BIS_SR(LPM0_bits+ GIE);//進入低功耗睡眠模式
  335.    
  336.     while(1)
  337.     {
  338.       ADC1=ADC_READ();
  339.       RefreshDis1(ADC1*2);
  340.        Display();
  341.        Display_Set();
  342.      
  343.       if(flag == 1)
  344.        {
  345.           ADC12CTL0|=ADC12SC;//啟動ADC轉換器
  346.           flag=0;
  347.   
  348.         }
  349.       //  _BIS_SR(LPM0_bits+ GIE);//進入低功耗睡眠模式  
  350.     }  
  351. }

  352. /****ADC12中斷服務****/
  353. #pragma vector=ADC12_VECTOR
  354. __interrupt void ADC12_ISR(void)
  355. {   
  356.    RefreshDis0(ADC12MEM0/8);

  357.    flag=1;
  358.    LPM0_EXIT;
  359. }

  360. /*
  361. * 名       稱:P2_IODect()
  362. * 功       能:判斷具體引發中斷的IO,并調用相應IO的中斷事件處理函數
  363. * 說       明:該函數兼容所有8個IO的檢測,請根據實際輸入IO激活“檢測代碼”。
  364. */
  365. void P2_IODect()
  366. {
  367.     unsigned int Push_Key=0;
  368.     //-----排除輸出IO的干擾后,鎖定唯一被觸發的中斷標志位-----
  369.     Push_Key=P2IFG&(~P2DIR);
  370.     //-----延時一段時間,避開機械抖動區域-----
  371.      delayms(5);                  //消抖延時
  372.     //----判斷按鍵狀態是否與延時前一致-----
  373.     if((P2IN&Push_Key)==0)                      //如果該次按鍵確實有效
  374.     {
  375.         //----判斷具體哪個IO被按下,調用該IO的事件處理函數-----
  376.         switch(Push_Key)
  377.         {
  378.                case BIT5:     P25_Onclick();      break;
  379.                case BIT6:     P26_Onclick();      break;
  380.                case BIT7:     P27_Onclick();      break;
  381.             default:                              break;      //任何情況下均加上default
  382.         }
  383.     }
  384. }

  385. #pragma vector = PORT2_VECTOR
  386. __interrupt void PORT2_ISR(void)
  387. {
  388.     //-----啟用Port2事件檢測函數-----
  389.     P2_IODect();                                //檢測通過,則會調用事件處理函數
  390.     P2IFG=0;                                    //退出中斷前必須手動清除IO口中斷標志
  391. }
復制代碼
51hei.png
所有資料51hei提供下載:
恒流源.zip (370.56 KB, 下載次數: 95)

評分

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

查看全部評分

回復

使用道具 舉報

ID:713204 發表于 2021-3-10 21:14 | 顯示全部樓層
請問proteus用的是那個版本呀?我的打開時總是提示DSP.exe已停止工作,是不是我的版本太低了(proteus8)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久成人精品视频 | 永久看片 | 四虎影院在线观看免费视频 | 在线观看亚洲欧美 | 亚洲成人一区二区 | 精品国产91乱码一区二区三区 | 亚洲精品电影网在线观看 | 国产区视频在线观看 | 成人综合在线视频 | 欧美日韩一区精品 | 国产欧美三区 | 一区二区三区视频 | 亚洲 欧美 另类 综合 偷拍 | 超碰日韩| 午夜天堂精品久久久久 | 精品久久久久一区二区国产 | 超碰最新在线 | 1区2区3区视频 | 久久国产精品亚洲 | 天堂免费 | 欧美天堂在线 | 久久国产一区 | 自拍在线 | 国产精品九九九 | com.国产| 精品乱码一区二区三四区视频 | 亚洲日本一区二区 | 欧美一级淫片免费视频黄 | 国产精品久久久久无码av | 国产农村一级国产农村 | 欧美成年人视频在线观看 | 国产区在线观看 | 五月天婷婷综合 | 男女羞羞免费视频 | 在线亚洲一区二区 | 色综合久久久 | 中国三级黄色录像 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 午夜精品影院 | 亚洲欧美久久 | 久久99精品久久久久久秒播九色 |