-
UID:788063
-
- 注册时间2010-01-19
- 最后登录2023-01-06
- 在线时间1385小时
-
-
访问TA的空间加好友用道具
|
今天收拾东西发现了好几片以前买的5毛液晶屏 琢磨琢磨正好自己的紫外线曝光灯没有定时器,用手头单片机做个定时器吧! 单片机用的stc89c52 。用了个8550三极管驱动继电器。继电器hk4100f-dc5v-shc 直接看成品吧,代码后面直接发!! 5毛液晶屏驱动借用了前辈们的达芬奇密码! 纸箱子外面能看到倒计时! 内部三个部分,紫外线灯(3r33恒流),单片机驱动继电器部分,5毛液晶屏 盒子内部,主要给干膜曝光!! 翻垃圾正好照出来一个小洞洞板,就没画板子,自己随想随焊了!! 定时器能够自己设置时间,能够保存!!具体看代码吧!! 代码现学现弄得,第一次写单片机代码,大家担待!! 代码: - #include "STC89C5xRC.H"
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define BIAS 0x52 //0b1000 0101 0010 1/3duty 4com
- #define SYSDIS 0X00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生
- #define SYSEN 0X02 //0b1000 0000 0010 打开系统振荡
- #define LCDOFF 0X04 //0b1000 0000 0100 关LCD偏压
- #define LCDON 0X06 //0b1000 0000 0110 打开LCD偏压
- #define XTAL 0x28 //0b1000 0010 1000 外部接时
- #define RC256 0X30 //0b1000 0011 0000 内部时钟
- #define TONEON 0X12 //0b1000 0001 0010 打开声音输出
- #define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
- #define WDTDIS 0X0A //0b1000 0000 1010 禁止看门
- sbit LCD_DAT=P2^0;
- sbit LCD_WR=P2^1;
- sbit LCD_CS=P2^2;
- sbit jia=P1^0; //加时间
- sbit set=P1^1; //设置
- sbit start=P1^2; //减时间
- sbit jian=P1^3; //减时间
- sbit jidianqi=P2^5; //继电器
- uchar LCDTab[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff};
- uint miao;
- char setzhuangtai;
- void cc(uint addr);
- void xcx(uint addr,uchar dat);
- uchar dcx(uint addr);
- void Q0();
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函数:擦除某一扇区(每个扇区512字节)
- 入口:addr = 某一扇区首地址
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void cc(uint addr)
- {
- // 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)
- ISP_CONTR = 0x81; // 打开 IAP 功能(ISPEN(ISP_CONTR.7)=1:允许编程改变Flash, 设置 Flash 操作等待时间。
- ISP_CMD = 0x03; // 用户可以对"Data Flash/EEPROM区"进行扇区擦除
- ISP_ADDRL = addr; // ISP/IAP操作时的地址寄存器低八位,
- ISP_ADDRH = addr>>8; // ISP/IAP操作时的地址寄存器高八位。
- EA =0;
- ISP_TRIG = 0x46; // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,
- ISP_TRIG = 0xB9; // 再写入B9h,ISP/IAP命令才会生效。
- _nop_();
- Q0(); // 关闭ISP/IAP
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函数:写一字节
- 入口:addr = 扇区单元地址 , dat = 待写入数据
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void xcx(uint addr,uchar dat)
- {
- ISP_CONTR = 0x81;
- ISP_CMD = 0x02; // 用户可以对"Data Flash/EEPROM区"进行字节编程
- ISP_ADDRL = addr;
- ISP_ADDRH = addr>>8;
- ISP_DATA = dat; // 数据进ISP_DATA
- EA = 0;
- ISP_TRIG = 0x46;
- ISP_TRIG = 0xB9;
- _nop_();
- Q0(); // 关闭ISP/IAP
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函数:读一字节
- 入口:addr = 扇区单元地址
- 出口:dat = 读出的数据
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- uchar dcx(uint addr)
- {
- uchar dat;
-
- ISP_CONTR = 0x81;
- ISP_CMD = 0x01; // 用户可以对"Data Flash/EEPROM区"进行字节读
- ISP_ADDRL = addr;
- ISP_ADDRH = addr>>8;
- EA = 0;
- ISP_TRIG = 0x46;
- ISP_TRIG = 0xB9;
- _nop_();
- dat = ISP_DATA; // 取出数据
- Q0(); // 关闭ISP/IAP
- return dat;
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函数:关闭ISP/IAP操作
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void Q0()
- {
- ISP_CONTR = 0; // 关闭IAP功能
- ISP_CMD = 0; // 待机模式,无ISP操作
- ISP_TRIG = 0; // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
- }
- //转换成显示字符
- uchar zhuanhuan(uchar b)
- {
- uchar a;
- switch (b)
- {
- case 0xff:
- a=0x00;
- break;
- case 0:
- a=0xf5;
- break;
- case 1:
- a=0x05;
- break;
- case 2:
- a=0xd3;
- break;
- case 3:
- a=0x97;
- break;
- case 4:
- a=0x27;
- break;
- case 5:
- a=0xb6;
- break;
- case 6:
- a=0xf6;
- break;
- case 7:
- a=0x15;
- break;
- case 8:
- a=0xf7;
- break;
- case 9:
- a=0xb7;
- break;
- }
- return(a);
- }
- //////////////////////////五毛液晶显示////////////////////////////////////
- void Delay10ms() //@24.414MHz
- {
- unsigned char i, j;
- _nop_();
- i = 40;
- j = 145;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay100ms() //@24.414MHz
- {
- unsigned char i, j, k;
- _nop_();
- i = 2;
- j = 140;
- k = 203;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay1000ms() //@24.414MHz
- {
- unsigned char i, j, k;
- _nop_();
- i = 16;
- j = 119;
- k = 23;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
-
-
- void LCDWr_Data(uchar Data,uchar cnt)
- {
- uchar i;
- for (i=0;i<cnt;i++)
- {
- LCD_WR=0;
- LCD_DAT=Data&0x80;
- LCD_WR=1;
- Data<<=1;
- }
- }
- void LCDWrCmd(uchar Cmd)
- {
- LCD_CS=0;
- LCDWr_Data(0x80,4); //写入命令标志100
- LCDWr_Data(Cmd,8); //写入命令数据
- LCD_CS=1;
- }
- void LCDWrAllData(uchar Addr,uchar *p,uchar cnt)
- {
- uchar i;
- LCD_CS=0;
- LCDWr_Data(0xa0,3); //写入数据标志101
- LCDWr_Data(Addr<<2,6); //写入地址数据
- for (i=0;i<cnt;i++)
- {
- LCDWr_Data(*p,8); //写入数据
- p++;
- }
- LCD_CS=1;
- }
- void LCD_Init(void)
- {
- LCD_CS=1;
- LCD_WR=1;
- LCD_DAT=1;
- Delay100ms(); //延时使LCD工作电压稳定
- LCDWrCmd(BIAS);
- LCDWrCmd(RC256); //使用内部振荡
- LCDWrCmd(SYSDIS);
- LCDWrCmd(WDTDIS);
- LCDWrCmd(SYSEN);
- LCDWrCmd(LCDON);
- Delay10ms();
- }
- /////////////////////////wumaojieshu////////////////////////////////
- //计算三位数字
- void disshuzi(uint a)
- {
- char bai,shi,ge;
- uint i;
- bai=a/100;
- LCDTab[4]=zhuanhuan(bai);
- i=a % 100;
- shi=i/10;
- LCDTab[5]=zhuanhuan(shi);
- ge=i % 10;
- LCDTab[6]=zhuanhuan(ge);
- }
- //开始按键部分设置
- void key() //按键控制函数
- {
- if (set==0)
- {
- Delay10ms();
- if (set==0&&setzhuangtai==0) //进入设置
- {
- miao = dcx(0x2002); //读取定时时间
- setzhuangtai=1;
- jidianqi=1;
- }
- }
- if (jia==0)
- {
- Delay10ms();
- if (jia==0&&setzhuangtai==1) //设置增加时间
- {
- miao++;
- }
- }
- if (jian==0)
- {
- Delay10ms();
- if (jian==0&&setzhuangtai==1) //设置增加时间
- {
- miao--;
- }
- }
- if (start==0)
- Delay10ms();
- if (start==0&&setzhuangtai==1) //退出设置。
- {
- cc(0x2000); // 擦除第1个扇区(2000h~21FFh)
- xcx(0x2002,miao); // 对EEPROM区2002h写入6
- setzhuangtai=0;
- jidianqi=0;
- }
- }
- //开始主进程
- void main()
- {
- jia=1;
- set=1;
- jian=1;
- start=1;
- jidianqi=1;
- setzhuangtai=1;
- //setzhuangtai=0;
- LCD_Init(); //初始化lcd
- Delay100ms(); //延时等待初始化
- miao = dcx(0x2002); //读取定时时间
- if (miao==0) {
- miao=100;
- cc(0x2000); // 擦除第1个扇区(2000h~21FFh)
- xcx(0x2002,100); // 对EEPROM区2002h写入6
- } //测试定时初始
- LCDTab[0]=zhuanhuan(0xff); //初始
- LCDTab[1]=zhuanhuan(0xff); //初始
- LCDTab[2]=zhuanhuan(0xff); //初始
- LCDTab[3]=zhuanhuan(0xff); //初始
- LCDTab[4]=zhuanhuan(0xff); //初始
- LCDTab[5]=zhuanhuan(0xff); //初始
- LCDTab[6]=zhuanhuan(0xff); //初始
- while(1)
- {
- key();
- disshuzi(miao); //显示秒
- LCDWrAllData(0,LCDTab,16); //显示lcd
- if (miao>0)
- {
- if (setzhuangtai==0)
- {
- miao--; //自减
- Delay1000ms(); //延时
- } else
- {
- Delay100ms();
- }
- } else {
- jidianqi=1;
- Delay100ms();
- }
- }
- }
|