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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

AD,PWM,測速,1602液晶,電位器控制電機轉速測量速度

[復制鏈接]
跳轉到指定樓層
樓主
ID:99624 發表于 2015-12-22 23:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
分享我的一個成功的項目源碼:

  1. #include<reg52.h>//51單片機頭文件
  2. #define uchar unsigned char//宏定義
  3. #define uint unsigned int
  4. //uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數碼管段碼
  5. //uchar code smg_we[]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1f};//數碼管位碼
  6. uchar code digit[]={"0123456789"};//定義字符數組數字
  7. uchar disp[8];//存儲拆開的數
  8. uint cnt;//中斷次數
  9. uchar v;//電機0速度
  10. uchar date,num,CYCLE,PWM_ON;
  11. sbit sda=P2^0;
  12. sbit scl=P2^1;
  13. uchar flag;        //計滿1秒鐘標志位
  14. uint i;
  15. char j,k=5;
  16. /////////
  17. sbit PWM=P1^0; //pwm輸出口
  18. sbit rs=P2^6;//數據命令選擇
  19. sbit rw=P2^5;//讀寫控制信號
  20. sbit e=P2^7;//使能信號
  21. ///////////////
  22. void delay1()                //微秒延時
  23. {;;}
  24. /////
  25. void start()                //I2C開始信號
  26. {
  27.   sda=1;
  28.      delay1();
  29.    scl=1;
  30.      delay1();
  31.    sda=0;
  32.         delay1();  
  33. }
  34. void stop()              //I2C停止信號
  35. {
  36.   sda=0;
  37.      delay1();
  38.    scl=1;
  39.      delay1();
  40.    sda=1;
  41.      delay1();
  42. }
  43. void respons()                //I2C應答信號
  44. {
  45.         uchar i;
  46.         scl=1;
  47.         delay1();
  48.         while((sda==1)&&(i<250))i++;
  49.         scl=0;
  50.         delay1();
  51. }
  52. void writebyte(uchar date)                //I2C寫信號
  53. {
  54.         uchar i,temp;
  55.         temp=date;
  56.         for(i=0;i<8;i++)
  57.         {
  58.                 temp=temp<<1;
  59.                 scl=0;
  60.                 delay1();
  61.                 sda=CY;
  62.                 delay1();
  63.                 scl=1;
  64.                 delay1();       
  65.         }
  66.         scl=0;
  67.         delay1();
  68.         sda=1;
  69.         delay1();
  70. }
  71. uchar readbyte()                //I2C讀信號
  72. {
  73.         uchar i,k;
  74.         scl=0;
  75.         delay1();
  76.         sda=1;
  77.         for(i=0;i<8;i++)
  78.         {
  79.                 scl=1;
  80.                 delay1();
  81.                 k=(k<<1)|sda;               
  82.                 scl=0;
  83.                 delay1();
  84.         }

  85.         return k;
  86. }
  87. void init1()                        //初始化
  88. {
  89.         scl=1;
  90.         delay1();
  91.         sda=1;
  92.         delay1();
  93. }
  94. uchar read_ad(uchar channel)                //讀取ad轉換結果
  95. {
  96.         uchar num;
  97.         start();
  98.         writebyte(0x90);
  99.         respons();
  100.         writebyte(0x40|channel);
  101.         respons();
  102.         start();
  103.         writebyte(0x91);
  104.         respons();
  105.         num=readbyte();
  106.         stop();       
  107.         return num;
  108. }

  109. /////

  110. void delay_50us(uint t)//50us延時函數
  111. {
  112. uchar j;
  113. for(;t>0;t--)
  114.     for(j=19;j>0;j--);
  115. }
  116. void write_com(uchar com)//寫地址
  117. {
  118. e=0;
  119. rs=0;
  120. rw=0;
  121. P0=com;
  122. delay_50us(10);
  123. e=1;
  124. delay_50us(10);
  125. e=0;
  126. }
  127. ///////
  128. void write_data(uchar dat)// 寫數據
  129. {
  130. e=0;
  131. rs=1;
  132. rw=0;
  133. P0=dat;
  134. delay_50us(10);
  135. e=1;
  136. delay_50us(10);
  137. e=0;
  138. }
  139. //////
  140. void init(void)//液晶初始化
  141. {
  142.   delay_50us(300);
  143.   write_com(0x38);
  144.   delay_50us(100);
  145.   write_com(0x38);
  146.   delay_50us(100);
  147.   write_com(0x38);
  148.   write_com(0x38);
  149.   write_com(0x08);
  150.   write_com(0x01);
  151.   write_com(0x06);
  152.   write_com(0x0c);
  153. }
  154. /////////////
  155. void writeaddress(uchar x)//指定字符的實際地址
  156. {

  157.   write_com(x|0x80);//顯示位置的確定方法規定為“80h+地址碼x“
  158. }
  159. //////////
  160. void display_sym(void)//顯示速度提示符
  161. {
  162. writeaddress(0x00);//寫顯示地址第一行第一列
  163. write_data('v');//寫數據v
  164. write_data('=');//寫數據=
  165. }
  166. //////
  167. void dispose()//
  168. {
  169. disp[0]=v/1000;
  170. disp[1]=(v%1000)/100;
  171. disp[2]=(v/100)/10;
  172. disp[3]=v%10;
  173. }
  174. /////////////
  175. void display_val(void)
  176. {
  177. writeaddress(0x02);//寫顯示地址,第一行第三列
  178.   write_data(digit[disp[0]]);//千
  179.   write_data(digit[disp[1]]);//百
  180.   write_data(digit[disp[2]]);//時
  181.   write_data(digit[disp[3]]);//個
  182. }   
  183. ////////
  184. void display_uint(void)//顯示速度單位
  185. {
  186.   writeaddress(0x06);//第1行第7列
  187.   write_data('r');//千
  188.   write_data('/');//百
  189.   write_data('m');//時
  190.   write_data('i');//個
  191.   write_data('n');//個
  192. }
  193. void initial()//初始化
  194. {
  195. TMOD=0x51; //定時器T1工作與計數器模式1,定時器T0工作于計數器模式1
  196. RCAP2H=(65536-50000)/256;
  197. RCAP2L=(65536-50000)%256;
  198. TH0=(65536-1000)/256;
  199. TL0=(65536-1000)%256;
  200. ET0=1;
  201. TR0=1;
  202. ET2=1;
  203. TR2=1;
  204. EA=1;

  205. }
  206. ///////
  207. void main()
  208. {

  209. init();
  210. init1();
  211. v=0;
  212. CYCLE = 100;
  213. initial();
  214. cnt=0;
  215. display_sym();
  216. display_uint();
  217. while(1)
  218. {
  219. num=num=read_ad(0);
  220. PWM_ON=num;
  221. TR1=1;
  222. TH1=0;
  223. TL1=0;
  224. flag=0;        // 時間還未滿1分鐘
  225. while(flag==0);        // 時間未滿等待
  226. v=(TH1*256+TL1)*60/20;        // 計算速度,每周產生20個脈沖
  227. dispose();
  228. display_val();
  229. }
  230. }
  231. //////
  232. void time2() interrupt 5//定時器T2中斷服務程序
  233. {
  234. TF2=0;
  235. cnt++;
  236. if(cnt==20)
  237. {
  238. flag=1;
  239. cnt=0;
  240. }
  241. }
  242. //////
  243. void tim(void) interrupt 1 using 1
  244. {
  245. static unsigned char count; //
  246. TH0=(65536-1000)/256;
  247. TL0=(65536-1000)%256;//定時1mS

  248. if (count==PWM_ON)
  249.     {
  250.      PWM = 1; //燈滅
  251.     }
  252.   count++;
  253. if(count == CYCLE)
  254.     {
  255.     count=0;
  256.         if(PWM_ON!=0) //如果左右時間是0 保持原來狀態
  257.           PWM = 0;//燈亮

  258.     }
  259.         }
復制代碼



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

使用道具 舉報

沙發
ID:330988 發表于 2018-5-16 15:41 | 只看該作者
沒有圖嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩中文字幕在线 | 另类在线 | 日韩欧美一区二区三区免费观看 | 婷婷综合在线 | 欧美一区二区在线视频 | 狠狠操狠狠操 | 一本久久a久久精品亚洲 | 欧美日韩国产精品一区二区 | 黄色av大片 | 国产一级视频在线 | 午夜色婷婷 | 91视频观看 | 国产福利资源 | 91精品国产一区二区三区 | 国产精品一区二区三区四区 | 欧美老少妇一级特黄一片 | www.久久.com | 日韩在线一区二区三区 | 亚洲国产精品久久久 | 天天操夜夜操 | 狠狠干影院| 97天天干| 91国产视频在线 | 免费观看黄色一级片 | 日本一区二区三区在线观看 | 欧美男人天堂 | 亚洲色图在线观看 | 91久久精品国产免费一区 | 亚洲福利| 久久国产精品久久国产精品 | 国产91久久精品一区二区 | 国产不卡视频在线 | 夜夜精品浪潮av一区二区三区 | 羞视频在线观看 | 国产精品一区网站 | 美女张开腿露出尿口 | 日日碰狠狠躁久久躁96avv | 国产精品久久久久久久久久软件 | 伊色综合久久之综合久久 | a在线视频观看 | 久久精品性视频 |