找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3206|回复: 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 单片机教程网

快速回复 返回顶部 返回列表