【简要说明】 一、板子尺寸:长54mmX宽72mmX高18mm
二、主要器件:单片机、数码管、继电器
三、工作电压:有12V和24两种可供选择
四、板子功耗:小于300mA
GYJ-0057_宽电压可编程数显延时模块电路原理图如下:
pcb:
Altium Designer画的单路数显延时模块宽电压原理图和PCB图如下:(51hei附件中可下载工程文件)
模拟量0到5上限下限单片机源程序如下:
- #include<STC12C2052AD.h> //库文件
- #include<intrins.h>
- #define uchar unsigned char //宏定义字符型变量
- #define uint unsigned int //宏定义整型变量
- /****************************模拟量开始*********************************************/
- /*声明 SFR 相关 与 的 IAP*/
- sfr IAP_DATA = 0xE2;
- sfr IAP_ADDRH = 0xE3;
- sfr IAP_ADDRL = 0xE4;
- sfr IAP_CMD = 0xE5;
- sfr IAP_TRIG = 0xE6;
- sfr IAP_CONTR = 0xE7;
- #define ADC_POWER 0x80 //ADC 电源控制位
- #define ADC_FLAG 0x10 //ADC 转换结束标志位
- #define ADC_START 0x08 //ADC 开始转换控制位
- #define ADC_SPEEDLL 0x00 //210 个时钟周期转换一次
- #define ADC_SPEEDL 0x20 //420 个时钟周期转换一次
- #define ADC_SPEEDH 0x40 //630 个时钟周期转换一次
- #define ADC_SPEEDHH 0x60 //840 个时钟周期转换一次
- /******************************模拟量结束*******************************************/
- /********************************************************************
- 定义 ISP/IAP/EEPROM 命令
- *********************************************************************/
- #define CMD_IDLE 0jm
- #define CMD_READ 1
- #define CMD_PROGRAM 2
- #define CMD_ERASE 3
- #define ENABLE_IAP 0x83//SYSCLK<12MH
- #define IAP_ADDRESS 0x0000 //存储地址
- void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
- uchar IapReadByte(uint addr);//读数据
- void IapProgramByte(uint addr, uchar dat);//写数据
- void IapEraseSector(uint addr);//擦除数据
- sbit P10=P1^0;//数码管段
- sbit P11=P1^1;//数码管段
- sbit P12=P1^2;//数码管段
- sbit P13=P1^3;//数码管段
- sbit P14=P1^4;//数码管段
- sbit P15=P1^5;//数码管段
- sbit P16=P1^6;//数码管段
- sbit P32=P3^2;//数码管位
- sbit P33=P3^3;//数码管位
- sbit P35=P3^5;//数码管位
- sbit AIN1=P1^7;//AD信号输入
- sbit key1=P3^0;//按键输入
- sbit key2=P3^1;//按键输入
- sbit OUT=P3^7; //继电器输出
- static uchar presstime=0;//用于延时
- uint tcnt1=0;//用于刷新数码管
- uint bainum1,shinum1,genum1;//数码管上显示
- uint bainum11=0,shinum11=0,genum11=0,shinum12=0,genum12=0;//用于传到数码管上显示
- uint kf0=1,if0=0;//按键用的标志位
- uint kt0=0;//按键用的标志位
- uint keynum=0;//数码管的位
- uint datas=0;
- bit flag_eeprom1=1;//掉电存储的标志位
- uint inum1=0;//触发端子用的计数
- uchar inum11=0,inum12=0;//掉电存储
- uint ad=0,ad1=0;
- code uchar seg7code[13]={0x84,0xf6,0x8a,0xa2,0xf0,0xa1,0x81,0xb6,0x80,0xa0,0x6f,0x3e,0x72}; //显示段码 数码管字跟
- extern void p31s();//将p3口的235置为1
- uint GetADCResult(uchar px);
- uint meanval1,meanval2;//平均值
- void InitADC();
- void keycan();
- void keyflag();//按键结束调用
- void displaynum();//将数字传到数码管上显示
- void saveeepro();
- void timer0(void)interrupt 1 {//定时器0
- //500等于1秒
- TL0 = 0xCD; //重新设置定时器0时间为2ms
- TH0 = 0xF8; //重新设置定时器0的初始值
- tcnt1++;//用于刷新数码管
- presstime++;
- if (if0==0){
- meanval1++;
- if(meanval1==50){
- meanval2=GetADCResult(7)/5;
- meanval1=0;
- }
- }
- switch(tcnt1){//数码管部分
- case 1: p31s(); P1=seg7code[bainum1];P32=0;break;
- case 2: p31s(); P1=~seg7code[shinum1];if(keynum==1 || keynum==3 || keynum==0){P33=0;}break;
- case 3: p31s(); P1=~seg7code[genum1]; if(keynum==2 || keynum==4 || keynum==0){P35=0;}break;
- default: tcnt1=0; p31s(); break;
- }
- }//定时器0结束
- void displaynum(){//将数字传到数码管上显示
- if (if0==0){//当if0==0时num1三个数码管进行显示
- AIN1=1;
- ad=meanval2;
- if((ad<inum11)||(ad>inum12)){OUT=0;}else{OUT=1;}
- genum1=ad%10;//个位
- shinum1=ad/10%10;//十位
- bainum1=10;//百
- }else{
- if(keynum<3){
- bainum1=11;
- shinum1=shinum11;
- genum1=genum11;
- inum11=shinum11*10+genum11; //将num1三个数码管的值付给inum
- }else{
- bainum1=12;
- shinum1=shinum12;
- genum1=genum12;
- inum12=shinum12*10+genum12; //将num1三个数码管的值付给inum
-
- }
- }
- }
- void timer0_1init(void){//定时配置
- TMOD=0x11;//将定时器0,1都设置为模式1
- TL0 = 0xCD;//设置定时器0时间为2ms
- TH0 = 0xF8;//设置定时器0的初始值
- TR0=1;//开启定时器0
- TR1=1;//开启定时器1
- EA=1;//开总中断
- ET0=1;//开定时器0的中断
- }
- void main(){
- P1M0=0X00;//强推挽输出
- P1M1=0X7F;//强推挽输出
- AIN1=1;
- InitADC(); //AD转换初始化
- timer0_1init(); //定时器配置
- inum11= IapReadByte(0x01);//读取存储的值
- inum12= IapReadByte(0x02);
- // inum1=inum11*100+inum12;
- shinum11=inum11/10%10;
- genum11=inum11%10;
- shinum12=inum12/10%10;
- genum12=inum12%10;
- while(1){
- keycan();
- }
- }
- void keycan(){//按键
- if(keynum==0){//当按键值等于0的时候调用显示
- displaynum();
- }
- if(key1==0){//当按键1按下
- if(kf0){//当标志位kf0=1的时候进行
- if(presstime>50){//当时间值大于一百的时候
- kf0=0;//标志位kf0=0
- kt0=1;//标志位kt0=0
- if0=1;
- presstime=0;//时间清零,重新进行
- keynum++;//数码管的位
- if(keynum==5){//当位到7则置位0
- keynum=0;if0=0;
- }
- }
- }
- }else{//当按键松开
- keyflag();displaynum();
- }//按键1结束
- if(key2==0){if(kf0){if(presstime>50){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉电存储的标志位改为1,进行存值操作
- switch(keynum){
- case 0:if(if0==1){if0=0;}else{if0=1;}break;
- case 1:shinum11++;if(shinum11>9){shinum11=0;}break;
- case 2:genum11++;if(genum11>9){genum11=0;}break;
- case 3:shinum12++;if(shinum12>9){shinum12=0;}break;
- case 4:genum12++;if(genum12>9){genum12=0;}break;
- default:break;
- }
- }}}else{keyflag();displaynum();
- if(bainum11==1){shinum11=0;genum11=0;}
- if((flag_eeprom1==1))//加掉电存储,必需加到这,不然有一些小问题
- { flag_eeprom1=0;
- saveeepro();//掉电存储
- }
- }//松开按键进行显示
- }
- void saveeepro(){//掉电存储
- inum11=shinum11*10+genum11; //将num1三个数码管的值付给inum
- inum12=shinum12*10+genum12; //将num1三个数码管的值付给inum
- // inum11=inum1/100;//把int型的值拆分到char型
- // inum12=inum1%100;
- IapEraseSector(0); //擦除扇区
- IapProgramByte(0x01,inum11);//写入数据
- IapProgramByte(0x02,inum12);//写入数据
- // IapProgramByte(0x03,inum13);//写入数据
- // IapProgramByte(0x04,inum14);//写入数据
- }
- void p31s(){//将p3口的235置为1
- P32=1;P33=1;P35=1;
- }
- void keyflag(){//按键结束调用,按键的建议使用,这样可以减小code,但是触发的不建议
- if(kt0){//当标志位kt0=1的时候进行
- if(presstime>50){//当时间值大于一百的时候
- kf0=1;//标志位kf0=1
- kt0=0;//标志位kt0=0
- presstime=0;//时间清零,重新进行
- }
- }
- }
- // AD转换初始化程序
- void InitADC(){
- // P1 = P1M0 = P1M1 = 0xff; //设置P1口为开漏模式,使用AD功能
- ADC_DATA = 0; //AD数据寄存器清空
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打开AD电源,转换周期210
- _nop_(); //延时
- }
- //AD转换控制程序
- uint GetADCResult(uchar px){ //转换输出的数据 (PX为通道口)
- uint t=0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//开始转换
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
- ADC_CONTR &= ~ADC_FLAG; //关闭AD转换
- t=(ADC_DATA<<2)|ADC_LOW2;
- return ADC_DATA; //返回数据
- }
- void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
- IAP_CONTR = 0; //
- IAP_CMD = 0; //
- IAP_TRIG = 0; //
- IAP_ADDRH = 0x80; //
- IAP_ADDRL = 0; //
- }
- uchar IapReadByte(uint addr){//读数据
- uchar dat;
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_READ;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_TRIG = 0x46;
- IAP_TRIG = 0xb9;
- _nop_();
- dat = IAP_DATA;
- IapIdle();
- return dat;
- }
- void IapProgramByte(uint addr, uchar dat){//写数据
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_PROGRAM;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_DATA = dat;
- IAP_TRIG = 0x46;
- IAP_TRIG = 0xb9;
- _nop_();
- IapIdle();
- }
- void IapEraseSector(uint addr){//擦除数据
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_ERASE;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
57板周期内倒计时(喂鱼)单片机源程序如下:
全部资料51hei下载地址:
GYJ-0057_宽电压可编程数显延时模块发货资料.rar
(1.21 MB, 下载次数: 25)
一代产品资料.rar
(1.7 MB, 下载次数: 23)
|