找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5473|回复: 0
打印 上一主题 下一主题
收起左侧

全自动绕线机程序

[复制链接]
跳转到指定楼层
楼主
ID:76127 发表于 2015-4-5 00:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该程序主要运用了键盘扫描技术和EEROM存储器编程,做到把键盘值输入到存储器中,不怕掉电。基于WICN单片机开发板设计。
主程序


  1. //--------------------- 半自动绕线机程序 ----------------------

  2. //-----------------芯片STC89C52RC 晶振11.0592M ----------------

  3. //---------------------计数值范围1~22圈-----------------------

  4. #include<reg52.h>

  5. #include"24c01.c"

  6. #include"stopgo.c"

  7. #include"jishuan.c"

  8. #include"lcd1602.c"

  9. #include"startgo.c"

  10. //-------------------------------------------------------------

  11. #define uchar unsigned char

  12. #define uint  unsigned int

  13. //-------------------------------------------------------------



  14. sbit  K1=P0^0;       //数字输入键个位数

  15. sbit  K2=P0^1;       //数字输入键十位数

  16. sbit  K3=P0^2;       //输入功能并以IIC存入AT24C01中保存

  17. sbit  K4=P0^3;       //确认存入数据键

  18. sbit  K5=P0^4;    //停止键

  19. sbit  beep=P3^3;

  20. sbit    CLK=P1^2;       //光电感应脉冲(用该开关模仿)

  21. sbit  LE_LED=P3^4;

  22. sbit  LED=P1^5;

  23. //-------------------------------------------------------------

  24. //-------------------------------------------------------------

  25. uchar tablee[2];



  26. //------按键延时-----------------------------------------------

  27. void delayx(uint i)

  28. {

  29.        uint w;

  30.        for(w=0;w<i;w++);

  31. }

  32. //-------------------------------------------------------------

  33. void start_ggo(uchar b)  //打线执行程序

  34. {

  35.        uchar d=0;

  36.        uchar n=0;     

  37.        while(n<=b)

  38.     {

  39.               LCD1602(n);     //显示

  40.               if(!CLK)

  41.               {

  42.               delayx(500);

  43.               while(CLK==0);

  44.               n++;

  45.               LED=0;

  46.               beep=0;

  47.               delayx(10000);

  48.               LED=1;

  49.               beep=1;

  50.               }

  51.        }   

  52. }

  53. //------------------------------------------------------------

  54. //-------------------------------------------------------------

  55. //------------------数据键盘按键扫描---------------------------

  56. void main()

  57. {

  58.        uchar h,f;

  59.        uchar e=30;

  60.        uchar id0=0;

  61.        uchar id1=0;

  62.        LE_LED=0;

  63.        while(1)

  64.        {

  65.               if(!K1)        //P0.0      K1=3

  66.               {

  67.                 delayx(500);

  68.                 while(K1==0);

  69.              beep=0;

  70.                 delayx(5000);

  71.                 beep=1;

  72.                 tablee[0]=3;

  73.                 if(id0==1)

  74.                 {

  75.                     tablee[1]=3;

  76.                      id0=0;

  77.                 }

  78.                  id0++;

  79.                  if(id0==2)id0=0;

  80.               }

  81.               //--------------------

  82.               if(!K2)           //P0.1    K2=5

  83.               {

  84.                 delayx(500);

  85.                 while(K1==0);

  86.              beep=0;

  87.                 delayx(5000);

  88.                 beep=1;

  89.                 tablee[1]=5;

  90.                 if(id1==1)

  91.                 {

  92.                     tablee[0]=5;

  93.                      id0=0;

  94.                 }

  95.                 id1++;

  96.                 if(id1==2)id1=0;

  97.               }

  98.               //===========================================================

  99.                if(!K3)//确认输入到AT24C01中

  100.                {

  101.                     delayx(500);

  102.                   while(K3==0);       //P0.2

  103.                      beep=0;

  104.                      delayx(5000);

  105.                      beep=1;

  106.                      jishuan(tablee[0],tablee[1]);

  107.                   f=jishuan_ok();

  108.                   init();                //24c01初始化

  109.                   W_AT24C01(e,f);//写数据到AT24C01中,0x30是器件地址内存单元

  110.                }

  111.                if(!K4)//启动机器打线 P0.3

  112.                {

  113.                   delayx(500);

  114.                   while(K4==0);

  115.                      beep=0;

  116.                      delayx(5000);

  117.                      beep=1;

  118.                   init();               //24c01初始化

  119.                   h=R_AT24C01(e); //读AT24C01中0x30的数据

  120.                   LCD1602(h);     //显示

  121.                   //start_go(h);    //启动执行打线功能并计数

  122.                      start_ggo(h);



  123.                   if(!K5)           //如果停机键按下则执行停机功能

  124.                   stop_go();

  125.                }   

  126.        }

  127. }





  128. //---IIC AT24C01存储器读写操作程序-----------

  129. #include <reg52.h>

  130. #define uchar unsigned char

  131. sbit SDA=P3^6;

  132. sbit SCL=P3^7;

  133. ///------------------------------------------

  134. void delay()

  135. { ; ; }

  136. ///////////////////////

  137. void start()//起始信号

  138. {

  139.        SDA=1;

  140.        delay();

  141.        SCL=1;

  142.        delay();

  143.        SDA=0;

  144.        delay();

  145. }

  146. ///////////////////////

  147. void stop()//终止信号

  148. {

  149.        SDA=0;

  150.        delay();

  151.        SCL=1;

  152.        delay();

  153.        SDA=1;

  154.        delay();

  155. }

  156. //////////////////////////////////////////////////

  157. //////////////////////////////////////////////////

  158. void respons()//应答信号,等待或者发送一个应答信号

  159. {

  160.        uchar i;

  161.        SCL=1;

  162.        delay();

  163.        while((SDA==1)&&(i<250))i++;

  164.        SCL=0;

  165.        delay();

  166. }

  167. /*************************************************/

  168. void init()//初始化

  169. {

  170.        SDA=1;

  171.        SCL=1;

  172. }

  173. //////////////////////////////////////////////////

  174. void write_byte(uchar date)//写一字节

  175. {

  176.        uchar i;

  177.        SCL=0;

  178.        for(i=0;i<8;i++)

  179.        {

  180.               date=date<<1;

  181.               SDA=CY;

  182.               SCL=1;

  183.               delay();

  184.               SCL=0;

  185.               delay();

  186.        }

  187. }

  188. //------------------------------------------------                                          

  189. uchar read_byte()//读数据(也就是接收从器件传来的数据)

  190. {

  191.        uchar i,k;

  192.        for(i=0;i<8;i++)

  193.        {

  194.               SCL=1;

  195.               delay();

  196.               k=(k<<1)|SDA;

  197.               SCL=0;

  198.               delay();

  199.        }

  200.               return k;

  201. }

  202. //////////////////////////////////////////////////

  203. //=============AT24C01写操作=====================//

  204. void W_AT24C01(uchar address,uchar date)//写数据

  205. {

  206.        start();

  207.        write_byte(0xa0);  //器件地址

  208.        respons();

  209.        write_byte(address);//器件内存地址 address

  210.     respons();

  211.        write_byte(date);//数据     date

  212.        respons();

  213.        stop();

  214. }

  215. //////////////////////////////////////////////////

  216. //==============AT24C01读操作====================//

  217. uchar R_AT24C01(uchar address)

  218. {

  219.        uchar date;

  220.        start();

  221.        write_byte(0xa0);//写器件地址和写指令0XA0=10100000B最后一个零表示写,低电平有效

  222.        respons();

  223.        write_byte(address);////器件内存地址address

  224.        respons();

  225.        start();

  226.        write_byte(0xa1);//写器件地址和读指令0XA1=10100001B,最后一个1表示读,高电平有效

  227.        respons();

  228.        date=read_byte();

  229.        stop();

  230.        return date;

  231. }







  232. //------------------LCD1602显示程序(模块)--------------------

  233. #include <reg52.h>

  234. #define uchar unsigned char

  235. ///////////////LCD1602/////////////

  236. sbit RS=P0^5;

  237. sbit RW=P0^6;

  238. sbit YE=P0^7;

  239. /////////////////////////////////////////////////////////////

  240. uchar code table[]={0xc0,0xf9,0xa4,0xb0,//0,1,2,3

  241.                                    0x99,0x92,0x82,0xf8,//4,5,6,7

  242.                                    0x80,0x90,0xfe};//8,9,.,段码表

  243. /////////////////////////////////////////////////////////////

  244. uchar code table1[] ={"0123456789. -"};

  245. uchar code table2[] ={"Temperature"};

  246. uchar code table3[] ={"  123333  "};

  247. /////////////////////////////////////////////////////////////

  248. void delayy(unsigned int us)

  249. {

  250.        while(us--);

  251. }

  252. ////////////////////////////////////////////

  253. void delay2()

  254.               {

  255.                      RS=0;

  256.                      RW=0;

  257.                      YE=0;

  258.                      delayy(5);

  259.                      YE=1;

  260.               }

  261. /******************************LCD1602液晶显示****************************/

  262. void LCD1602(uchar dd)//dd是整数

  263. {

  264.                      uchar e,f,i,nem;

  265.                      e=dd/10;

  266.                      f=dd%10;

  267. //////////////////////////////////////LCD屏初始化

  268.                      P2=0x01;       //清屏

  269.                      delay2();

  270.                      P2=0x38;       //显示设定两行

  271.                      delay2();

  272.                      P2=0x0f;  //打开显示和光标

  273.                      delay2();

  274.                      P2=0x06;  //光标右移

  275.                      delay2();

  276.                      P2=0x80;  //光标回到第一行的开头

  277.                      delay2();

  278. //////////////////////////////////////////

  279.        for(nem=0;nem<11;nem++)////////////温度英文字显示

  280.          {

  281.                      P2=table2[nem];

  282.                      RS=1;

  283.                      RW=0;

  284.                      YE=0;

  285.                    delay2();

  286.             }

  287. ////////////////////////

  288.                      P2=table1[e];

  289.                      RS=1;

  290.                      RW=0;

  291.                      YE=0;

  292.                      P2=0x06;  //光标右移显示整数十位

  293.                      delay2();

  294. ////////////////////////

  295.                      P2=table1[f];

  296.                      RS=1;

  297.                      RW=0;

  298.                      YE=0;

  299.                      P2=0x06;  //光标右移显示整数个位

  300.                      delay2();

  301. /////////////////////////////////////////////////

  302.                      P2=0xc0;//换行显示

  303.                      delay2();

  304.               for(i=0;i<16;i++)

  305.           {        

  306.                      P2=0xc0;

  307.                      delay2();

  308.                      P2=table3[i];

  309.                      RS=1;

  310.                      RW=0;

  311.                      YE=0;

  312.              }

  313. }







  314. //-----------数据计算程序--------------

  315. #define uchar unsigned char

  316. static uchar j=0;

  317. ///----------------------------------------------------

  318. void jishuan(uchar i,uchar e) //i为十位,e为个位

  319. {

  320.   j=((i*10)+e);

  321. }

  322. ///-----------------------------------------------------

  323. uchar jishuan_ok()

  324. {

  325.   return (j);

  326. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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