切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 2687阅读
  • 8回复

[工仪]5毛液晶加stc89c52制作个定时曝光 [复制链接]

上一主题 下一主题
离线tianwu_feng
 

发帖
671
M币
26
专家
12
粉丝
115
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-01-06
今天收拾东西发现了好几片以前买的5毛液晶屏
琢磨琢磨正好自己的紫外线曝光灯没有定时器,用手头单片机做个定时器吧!
单片机用的stc89c52 。用了个8550三极管驱动继电器。继电器hk4100f-dc5v-shc
直接看成品吧,代码后面直接发!!
5毛液晶屏驱动借用了前辈们的达芬奇密码!


纸箱子外面能看到倒计时!


内部三个部分,紫外线灯(3r33恒流),单片机驱动继电器部分,5毛液晶屏


盒子内部,主要给干膜曝光!!
翻垃圾正好照出来一个小洞洞板,就没画板子,自己随想随焊了!!
定时器能够自己设置时间,能够保存!!具体看代码吧!!
代码现学现弄得,第一次写单片机代码,大家担待!!

代码:
  1. #include "STC89C5xRC.H"
  2. #include "intrins.h"  
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define BIAS 0x52    //0b1000 0101 0010 1/3duty 4com
  6. #define SYSDIS 0X00  //0b1000 0000 0000 关振系统荡器和LCD偏压发生
  7. #define SYSEN 0X02   //0b1000 0000 0010  打开系统振荡
  8. #define LCDOFF 0X04  //0b1000 0000 0100 关LCD偏压
  9. #define LCDON 0X06   //0b1000 0000 0110  打开LCD偏压
  10. #define XTAL 0x28    //0b1000 0010 1000  外部接时
  11. #define RC256 0X30   //0b1000 0011 0000  内部时钟
  12. #define TONEON 0X12  //0b1000 0001 0010 打开声音输出
  13. #define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
  14. #define WDTDIS 0X0A  //0b1000 0000 1010  禁止看门
  15. sbit LCD_DAT=P2^0;
  16. sbit LCD_WR=P2^1;
  17. sbit LCD_CS=P2^2;
  18. sbit jia=P1^0;     //加时间
  19. sbit set=P1^1;    //设置
  20. sbit start=P1^2;    //减时间
  21. sbit jian=P1^3;    //减时间
  22. sbit jidianqi=P2^5;    //继电器
  23. uchar LCDTab[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  24. uint miao;
  25. char setzhuangtai;
  26. void  cc(uint addr);
  27. void  xcx(uint addr,uchar dat);
  28. uchar dcx(uint addr);
  29. void  Q0();
  30. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  31. 函数:擦除某一扇区(每个扇区512字节)
  32. 入口:addr = 某一扇区首地址              
  33. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  34. void cc(uint addr)
  35. {    
  36.                               // 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
  37.     ISP_CONTR = 0x81;          // 打开 IAP 功能(ISPEN(ISP_CONTR.7)=1:允许编程改变Flash, 设置 Flash 操作等待时间。
  38.     ISP_CMD   = 0x03;          // 用户可以对"Data Flash/EEPROM区"进行扇区擦除
  39.     ISP_ADDRL = addr;         // ISP/IAP操作时的地址寄存器低八位,
  40.     ISP_ADDRH = addr>>8;      // ISP/IAP操作时的地址寄存器高八位。
  41.     EA =0;  
  42.     ISP_TRIG = 0x46;          // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,
  43.     ISP_TRIG = 0xB9;          // 再写入B9h,ISP/IAP命令才会生效。
  44.     _nop_();
  45.     Q0();                      // 关闭ISP/IAP
  46. }
  47. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  48. 函数:写一字节
  49. 入口:addr = 扇区单元地址 , dat = 待写入数据
  50. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  51. void xcx(uint addr,uchar dat)
  52. {
  53.     ISP_CONTR = 0x81;          
  54.     ISP_CMD   = 0x02;          // 用户可以对"Data Flash/EEPROM区"进行字节编程
  55.     ISP_ADDRL = addr;        
  56.     ISP_ADDRH = addr>>8;      
  57.     ISP_DATA  = dat;          // 数据进ISP_DATA
  58.     EA = 0;
  59.     ISP_TRIG = 0x46;          
  60.     ISP_TRIG = 0xB9;          
  61.     _nop_();
  62.     Q0();                      // 关闭ISP/IAP
  63. }
  64. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  65. 函数:读一字节
  66. 入口:addr = 扇区单元地址
  67. 出口:dat  = 读出的数据
  68. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  69. uchar dcx(uint addr)
  70. {  
  71.     uchar dat;
  72.     
  73.     ISP_CONTR = 0x81;          
  74.     ISP_CMD   = 0x01;         // 用户可以对"Data Flash/EEPROM区"进行字节读
  75.     ISP_ADDRL = addr;        
  76.     ISP_ADDRH = addr>>8;      
  77.     EA = 0;
  78.     ISP_TRIG = 0x46;          
  79.     ISP_TRIG = 0xB9;          
  80.     _nop_();
  81.     dat = ISP_DATA;              // 取出数据
  82.     Q0();                      // 关闭ISP/IAP              
  83.     return dat;
  84. }
  85. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  86. 函数:关闭ISP/IAP操作
  87. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  88. void Q0()
  89. {
  90.     ISP_CONTR = 0;            // 关闭IAP功能
  91.     ISP_CMD   = 0;            // 待机模式,无ISP操作
  92.     ISP_TRIG  = 0;            // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
  93. }
  94. //转换成显示字符
  95. uchar zhuanhuan(uchar b)
  96. {
  97.     uchar a;
  98.     switch (b)    
  99.     {
  100.      case 0xff:
  101.         a=0x00;
  102.         break;
  103.      case 0:
  104.         a=0xf5;
  105.         break;
  106.      case 1:
  107.         a=0x05;
  108.         break;
  109.      case 2:
  110.         a=0xd3;
  111.         break;
  112.      case 3:
  113.         a=0x97;
  114.         break;
  115.      case 4:
  116.         a=0x27;
  117.         break;
  118.      case 5:
  119.         a=0xb6;
  120.         break;
  121.      case 6:
  122.         a=0xf6;
  123.         break;
  124.      case 7:
  125.         a=0x15;
  126.         break;
  127.      case 8:
  128.         a=0xf7;
  129.         break;
  130.      case 9:
  131.         a=0xb7;
  132.         break;
  133.     }
  134.     return(a);
  135. }
  136. //////////////////////////五毛液晶显示////////////////////////////////////
  137. void Delay10ms()        //@24.414MHz
  138. {
  139.     unsigned char i, j;
  140.     _nop_();
  141.     i = 40;
  142.     j = 145;
  143.     do
  144.     {
  145.         while (--j);
  146.     } while (--i);
  147. }
  148. void Delay100ms()        //@24.414MHz
  149. {
  150.     unsigned char i, j, k;
  151.     _nop_();
  152.     i = 2;
  153.     j = 140;
  154.     k = 203;
  155.     do
  156.     {
  157.         do
  158.         {
  159.             while (--k);
  160.         } while (--j);
  161.     } while (--i);
  162. }
  163. void Delay1000ms()        //@24.414MHz
  164. {
  165.     unsigned char i, j, k;
  166.     _nop_();
  167.     i = 16;
  168.     j = 119;
  169.     k = 23;
  170.     do
  171.     {
  172.         do
  173.         {
  174.             while (--k);
  175.         } while (--j);
  176.     } while (--i);
  177. }
  178.     
  179.                     
  180. void LCDWr_Data(uchar Data,uchar cnt)
  181. {
  182. uchar i;
  183. for (i=0;i<cnt;i++)
  184.       {
  185.        LCD_WR=0;
  186.        LCD_DAT=Data&0x80;
  187.        LCD_WR=1;
  188.        Data<<=1;
  189.      }
  190. }                
  191. void LCDWrCmd(uchar Cmd)
  192. {
  193. LCD_CS=0;
  194. LCDWr_Data(0x80,4); //写入命令标志100
  195. LCDWr_Data(Cmd,8); //写入命令数据
  196. LCD_CS=1;
  197. }
  198. void LCDWrAllData(uchar Addr,uchar *p,uchar cnt)
  199. {
  200. uchar i;
  201. LCD_CS=0;
  202. LCDWr_Data(0xa0,3); //写入数据标志101
  203. LCDWr_Data(Addr<<2,6); //写入地址数据
  204. for (i=0;i<cnt;i++)
  205.       {
  206.         LCDWr_Data(*p,8); //写入数据
  207.         p++;
  208.        }
  209. LCD_CS=1;
  210. }
  211. void LCD_Init(void)
  212. {
  213. LCD_CS=1;
  214. LCD_WR=1;
  215. LCD_DAT=1;
  216. Delay100ms(); //延时使LCD工作电压稳定
  217. LCDWrCmd(BIAS);
  218. LCDWrCmd(RC256); //使用内部振荡
  219. LCDWrCmd(SYSDIS);
  220. LCDWrCmd(WDTDIS);
  221. LCDWrCmd(SYSEN);
  222. LCDWrCmd(LCDON);
  223. Delay10ms();
  224. }
  225. /////////////////////////wumaojieshu////////////////////////////////
  226. //计算三位数字
  227. void disshuzi(uint a)
  228. {
  229.     char bai,shi,ge;
  230.     uint i;
  231.     bai=a/100;
  232.     LCDTab[4]=zhuanhuan(bai);
  233.     i=a % 100;
  234.     shi=i/10;
  235.     LCDTab[5]=zhuanhuan(shi);
  236.     ge=i % 10;
  237.     LCDTab[6]=zhuanhuan(ge);
  238. }
  239. //开始按键部分设置
  240. void key() //按键控制函数
  241. {
  242.     if (set==0)
  243.         {
  244.             Delay10ms();
  245.             if (set==0&&setzhuangtai==0) //进入设置
  246.             {
  247.                miao = dcx(0x2002);    //读取定时时间
  248.                setzhuangtai=1;
  249.                jidianqi=1;
  250.             }
  251.         }
  252.      if (jia==0)
  253.         {
  254.             Delay10ms();
  255.             if (jia==0&&setzhuangtai==1) //设置增加时间
  256.             {
  257.                miao++;      
  258.             }
  259.         }
  260.      if (jian==0)
  261.         {
  262.             Delay10ms();
  263.             if (jian==0&&setzhuangtai==1) //设置增加时间
  264.             {
  265.                miao--;      
  266.             }
  267.         }
  268.        if (start==0)
  269.             Delay10ms();
  270.             if (start==0&&setzhuangtai==1)  //退出设置。
  271.             {
  272.                cc(0x2000);          // 擦除第1个扇区(2000h~21FFh)
  273.                xcx(0x2002,miao);      // 对EEPROM区2002h写入6
  274.                setzhuangtai=0;
  275.                jidianqi=0;
  276.             }
  277. }
  278. //开始主进程
  279. void main()
  280. {
  281.     jia=1;
  282.     set=1;
  283.     jian=1;
  284.     start=1;
  285.     jidianqi=1;
  286.     setzhuangtai=1;
  287.     //setzhuangtai=0;
  288.     LCD_Init();        //初始化lcd
  289.     Delay100ms();    //延时等待初始化
  290.     miao = dcx(0x2002);    //读取定时时间
  291.     if (miao==0) {
  292.     miao=100;
  293.     cc(0x2000);          // 擦除第1个扇区(2000h~21FFh)
  294.     xcx(0x2002,100);      // 对EEPROM区2002h写入6
  295.     }        //测试定时初始
  296.     LCDTab[0]=zhuanhuan(0xff);       //初始
  297.     LCDTab[1]=zhuanhuan(0xff);       //初始
  298.     LCDTab[2]=zhuanhuan(0xff);       //初始
  299.     LCDTab[3]=zhuanhuan(0xff);       //初始
  300.     LCDTab[4]=zhuanhuan(0xff);       //初始
  301.        LCDTab[5]=zhuanhuan(0xff);       //初始
  302.     LCDTab[6]=zhuanhuan(0xff);       //初始
  303.     while(1)
  304.     {
  305.         key();
  306.         disshuzi(miao);  //显示秒
  307.         LCDWrAllData(0,LCDTab,16); //显示lcd
  308.         if (miao>0)
  309.         {        
  310.         if (setzhuangtai==0)
  311.         {
  312.         miao--;    //自减
  313.         Delay1000ms();    //延时
  314.         } else
  315.         {
  316.         Delay100ms();
  317.         }
  318.         } else {
  319.         jidianqi=1;
  320.         Delay100ms();
  321.         }
  322.     }
  323. }




本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共6条打赏M币+39专家+1
离线wwl836470

发帖
10416
M币
2138
专家
20
粉丝
141
只看该作者 1楼 发表于: 2018-01-06
请登录后查看
离线wyl

发帖
1560
M币
4363
专家
0
粉丝
26
只看该作者 2楼 发表于: 2018-01-06
请登录后查看
离线牧野小可

发帖
32
M币
1837
专家
0
粉丝
7
只看该作者 3楼 发表于: 2018-01-06
请登录后查看
离线zeze10000

发帖
2858
M币
8559
专家
35
粉丝
112
只看该作者 4楼 发表于: 2018-01-06
请登录后查看
离线tianwu_feng

发帖
671
M币
26
专家
12
粉丝
115
只看该作者 5楼 发表于: 2018-01-06
回 zeze10000 的帖子
请登录后查看
离线aojieage

发帖
124
M币
141
专家
2
粉丝
14
只看该作者 6楼 发表于: 2018-01-06
请登录后查看
离线温力口

发帖
60313
M币
51283
专家
569
粉丝
908
只看该作者 7楼 发表于: 2018-01-07
请登录后查看
离线robinwong

发帖
261
M币
1732
专家
9
粉丝
29
只看该作者 8楼 发表于: 2018-12-03
请登录后查看
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个