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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于STC15w單片機系列 自帶的AD轉換程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:499397 發表于 2020-2-15 16:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
15W系列是目前51單片機里面可用資源較多的處理器。一般的設計都可以用,本次分享下利用單片機自帶的AD轉換座一個數字電壓表。顯示用的LCD1602

單片機源程序如下:
  1. #include<15w.H>
  2. #include<math.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include<intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. typedef unsigned int WORD;

  9. #define ADC_POWER   0x80            //ADC電源控制位
  10. #define ADC_FLAG    0x10            //ADC完成標志
  11. #define ADC_START   0x08            //ADC起始控制位
  12. #define ADC_SPEEDLL 0x00            //540個時鐘
  13. #define ADC_SPEEDL  0x20            //360個時鐘
  14. #define ADC_SPEEDH  0x40            //180個時鐘
  15. #define ADC_SPEEDHH 0x60            //90個時鐘
  16. unsigned char ch = 0;                        //ADC通道號

  17. int time;
  18. int time1;
  19. int time2;
  20. float p;

  21. sbit RS = P5^5;   //定義端口
  22. sbit RW = P5^4;
  23. sbit EN = P5^3;
  24. sbit pwm=P2^7;
  25. sbit key1 = P2^0;
  26. sbit key2=P2^1;
  27. sbit led=P5^1;
  28. unsigned char ti[]={'0','1',0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
  29. /*------------------------------------------------
  30. uS延時函數,含有輸入參數 unsigned char t,無返回值
  31. unsigned char 是定義無符號字符變量,其值的范圍是
  32. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  33. 長度如下 T=tx2+5 uS
  34. ------------------------------------------------*/
  35. void DelayUs2x(unsigned char t)
  36. {   
  37. while(--t);
  38. }
  39. /*------------------------------------------------
  40. mS延時函數,含有輸入參數 unsigned char t,無返回值
  41. unsigned char 是定義無符號字符變量,其值的范圍是
  42. 0~255 這里使用晶振12M,精確延時請使用匯編
  43. ------------------------------------------------*/
  44. void DelayMs(unsigned char t)
  45. {
  46.      
  47. while(t--)
  48. {
  49.      //大致延時1mS
  50.      DelayUs2x(245);
  51.          DelayUs2x(245);
  52. }
  53. }
  54. /*------------------------------------------------
  55.               判忙函數
  56. ------------------------------------------------*/
  57. bit LCD_Check_Busy(void)
  58. {
  59. P4= 0xFF;
  60. RS=0;
  61. RW=1;
  62. EN=0;
  63. _nop_();
  64. EN=1;
  65. return (bit)(P4 & 0x80);
  66. }
  67. /*------------------------------------------------
  68.               寫入命令函數
  69. ------------------------------------------------*/
  70. void LCD_Write_Com(unsigned char com)
  71. {  
  72. while(LCD_Check_Busy()); //忙則等待
  73. RS=0;
  74. RW=0;
  75. EN=1;
  76. P4= com;
  77. _nop_();
  78. EN=0;
  79. }
  80. /*------------------------------------------------
  81.               寫入數據函數
  82. ------------------------------------------------*/
  83. void LCD_Write_Data(unsigned char Data)
  84. {
  85. while(LCD_Check_Busy()); //忙則等待
  86. RS=1;
  87. RW=0;
  88. EN=1;
  89. P4= Data;
  90. _nop_();
  91. EN=0;
  92. }

  93. /*------------------------------------------------
  94.                 清屏函數
  95. ------------------------------------------------*/
  96. void LCD_Clear(void)
  97. {
  98. LCD_Write_Com(0x01);
  99. DelayMs(5);
  100. }
  101. /*------------------------------------------------
  102.               寫入字符串函數
  103. ------------------------------------------------*/
  104. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  105. {     
  106. if (y == 0)
  107.         {     
  108.          LCD_Write_Com(0x80 + x);     //表示第一行
  109.         }
  110. else
  111.         {      
  112.         LCD_Write_Com(0xC0 + x);      //表示第二行
  113.         }        
  114. while (*s)
  115.         {     
  116. LCD_Write_Data( *s);     
  117. s ++;     
  118.         }
  119. }
  120. /*------------------------------------------------
  121.               寫入字符函數
  122. ------------------------------------------------*/
  123. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  124. {     
  125. if (y == 0)
  126.         {     
  127.         LCD_Write_Com(0x80 + x);     
  128.         }   
  129. else
  130.         {     
  131.         LCD_Write_Com(0xC0 + x);     
  132.         }        
  133. LCD_Write_Data( Data);  
  134. }
  135. /*------------------------------------------------
  136.               初始化函數
  137. ------------------------------------------------*/
  138. void LCD_Init(void)
  139. {
  140.    LCD_Write_Com(0x38);    /*顯示模式設置*/
  141.    DelayMs(5);
  142.    LCD_Write_Com(0x38);
  143.    DelayMs(5);
  144.    LCD_Write_Com(0x38);
  145.    DelayMs(5);
  146.    LCD_Write_Com(0x38);  
  147.    LCD_Write_Com(0x08);    /*顯示關閉*/
  148.    LCD_Write_Com(0x01);    /*顯示清屏*/
  149.    LCD_Write_Com(0x06);    /*顯示光標移動設置*/
  150.    DelayMs(5);
  151.    LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
  152.    }








  153. void display(uint temp)                        //顯示程序
  154. {
  155.    int A1,A2,A3;
  156.    A1=temp/100;
  157.    A2=temp%100/10;
  158.    A3=temp%100%10/1;
  159.    
  160.             LCD_Write_Char(4,0,ti[A1]);
  161.          LCD_Write_Char(5,0,ti[A2]);
  162.          LCD_Write_Char(6,0,'.');
  163.          LCD_Write_Char(7,0,ti[A3]);
  164.          LCD_Write_Char(8,0,'V');


  165.    }
  166. /*----------------------------
  167. 軟件延時
  168. ----------------------------*/
  169. void Delay(WORD n)
  170. {
  171.     WORD x;

  172.     while (n--)
  173.     {
  174.         x = 5000;
  175.         while (x--);
  176.     }
  177. }
  178. /*----------------------------
  179. 初始化ADC
  180. ----------------------------*/
  181. void InitADC()
  182. {
  183.     P1ASF = 0x01;                   //設置P1口為AD口
  184.     ADC_RES = 0;                    //清除結果寄存器
  185.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  186.     Delay(2);                       //ADC上電并延時
  187. }

  188. void Timer0Init(void)                //200微秒@11.0592MHz
  189. {
  190.         AUXR |= 0x80;                //定時器時鐘1T模式
  191.         TMOD &= 0xF0;                //設置定時器模式
  192.         TL0 = 0x5C;                //設置定時初值
  193.         TH0 = 0xF7;                //設置定時初值
  194.         TF0 = 0;                //清除TF0標志
  195.         TR0 = 1;                //定時器0開始計時
  196.         ET0=1;
  197.         EA=1;

  198. }


  199.   

  200. void main()                                       
  201. {
  202.         float i,j;
  203.     P0M0 = 0x00;
  204.     P0M1 = 0x00;
  205.     P1M0 = 0x00;
  206.     P1M1 = 0x00;
  207.     P2M0 = 0x00;
  208.     P2M1 = 0x00;
  209.     P3M0 = 0x00;
  210.     P3M1 = 0x00;
  211.     P4M0 = 0x00;
  212.     P4M1 = 0x00;
  213.     P5M0 = 0x00;
  214.     P5M1 = 0x00;

  215.     LCD_Init();
  216.     LCD_Clear();//清屏
  217.     InitADC();                      //初始化ADC
  218.     IE = 0xa0;                      //使能ADC中斷
  219.            Timer0Init();
  220.        
  221.        
  222.          
  223.   while(1){

  224.            i=p*5;
  225.          j=((i/256)*10);
  226.     display(j);       
  227.         DelayMs(500);  


  228.   }


  229. }
  230. /*----------------------------
  231. ADC中斷服務程序
  232. ----------------------------*/
  233. void adc_isr() interrupt 5 using 1
  234. {
  235.     ADC_CONTR &= !ADC_FLAG;         //清除ADC中斷標志


  236.      p=ADC_RES  ;       //讀取高8位結果并發送到串口

  237. //    SendData(ADC_LOW2);           //顯示低2位結果
  238.    
  239.     ch = 0;           //切換到下一個通道
  240.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  241. }


  242. void tm0_isr() interrupt 1
  243. {

  244.     time++;
  245.         time1++;
  246.         time2++;
  247.         if(time1>100)
  248.         time1=0;
  249.         if(time1>50)
  250.         pwm=1;
  251.         else
  252.         pwm=0;






  253.         if(time>5000)
  254. {        time=0;
  255.         led=~led ;  }
  256. }
復制代碼

所有資料51hei提供下載:
15wAD轉換.rar (57.32 KB, 下載次數: 82)


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

使用道具 舉報

沙發
ID:385168 發表于 2020-2-21 04:23 | 只看該作者
下載學習學習,感謝樓主分享程序。
回復

使用道具 舉報

板凳
ID:686739 發表于 2020-2-21 13:07 來自手機 | 只看該作者
謝謝分享
回復

使用道具 舉報

地板
ID:7781 發表于 2021-4-29 15:06 | 只看該作者
具體用的哪款單片機芯片呢?
回復

使用道具 舉報

5#
ID:65237 發表于 2021-4-29 20:48 | 只看該作者
樓主如果單片電源5V,AD只在5V以內 ,如要能測量30V以內的電壓程序應該怎樣改 請指點下
回復

使用道具 舉報

6#
ID:852236 發表于 2021-5-1 10:53 | 只看該作者
電阻分壓,我也想試試
回復

使用道具 舉報

7#
ID:840797 發表于 2021-5-2 20:20 | 只看該作者
我是小白:電阻分壓,改變TEMP的比率好像就可以改變測量范圍。不知對否。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线免费观看视频黄 | 久久久久久久综合 | 亚洲精品久久久久中文字幕二区 | 久久青青 | 欧美白人做受xxxx视频 | 亚洲巨乳自拍在线视频 | 国产精品一级 | 伊人伊成久久人综合网站 | 99免费精品视频 | www.久久99| 国产91丝袜 | 看片地址 | 欧美电影免费网站 | 欧美在线视频网 | 久操亚洲 | 日本三级电影免费观看 | 国产线视频精品免费观看视频 | 国产你懂的在线观看 | 久久精品成人一区 | 欧美久久久网站 | 午夜影院污 | 超碰精品在线 | 欧美一区二区三区久久精品 | 亚洲欧美国产精品一区二区 | 中文字幕在线观看 | 麻豆久久久9性大片 | 精品日韩在线观看 | 国产精品99视频 | 国产在线视频一区 | 可以免费观看的av | 日日夜夜精品免费视频 | 欧美成年网站 | 久久久久成人精品亚洲国产 | 在线播放中文字幕 | 久久国产日本 | 国产国拍亚洲精品av | 成人网视频 | 久久久久久免费毛片精品 | 国产91综合 | 国产精品久久精品 | 九九九视频精品 |