Keil代码下载:
测试 - 实物 - 增加OLED.7z
(402.3 KB, 下载次数: 0)
- /*******************EEPROM记录大于255的数*****************
- *硬件平台:STC89C52RC
- *开发环境:KEIL
- *功能:由于24c02是每个存储地址只对应8个bit的存储空间,即一个
- 存储单元所存储的数据最大为255,该例程介绍了一种当所记忆
- 数据大于255(而小于65536)的存储方法。即用两个存储单元来
- 存储一个数据。
- *********************************************************/
- #include "reg52.h"
- #include "intrins.h"
- #include "mcp4725.h"
- #include "24cxx.h"
- #include "ADC0832.h"
- #include "DS18B20.h"
- #include "OLED.h"
- #include <stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define valdata 5000//计算值
- #define key 5//按钮定时值更改改变消抖时间(单位t*2ms)
- /**
- 595侧 芯片侧
- 11 SCK 数据输入时钟线 SHCP Clock SPI2_SCK PB3
- 12 RCK 输出存储锁存时钟线 STCP Latch SPI2_NSS PA15
- 13 OE 输出使能 接地 OE PD7
- 14 SI 数据线 DS1 DATA SPI2_MOSI PB5
- **/
- /*
- 16 VCC 电源 2V-6V
- 15 QA 并行输出 QB QC....QH
- 14 SI/DS DATA 串行数据输入
- 13 OE_ 输出使能 PWM控制亮度
- 12 RCK/STCP CS 输出到锁存器时钟
- 11 SCK/SHCP CLK DATA输入时钟
- 10 SCLR/MR 低电平清零 接VCC
- 9 SQH/Q7S 串行数据输出 接下一个595
- */
- sbit ds=P3^4;
- sbit sh_cp=P3^6;
- sbit st_cp=P3^5;
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit rtcc=P1^6;
- sbit k1=P1^0; //设置加
- sbit k2=P1^1; //加
- sbit k3=P1^2; //减
- sbit k4=P1^3; //设置减/退出
- sbit k5=P1^4; //确认保存
- sbit led=P1^7; //状态灯
- sbit rst=P1^6; //清除24cxx内部存储的数据谨慎操作
- sbit EC11_A = P2^2; //声明编码器A脚IO
- sbit EC11_B = P2^3; //声明编码器B脚IO
- //变量
- bit EC11_A_Now = 1; //编码器A脚稳定值
- bit EC11_B_Now = 1; //编码器B脚稳定值
- signed int EC11_A_Code = 1; //EC11编码器正转一格键值
- signed int EC11_B_Code = -1; //EC11编码器反转一格键值
- bit flag1s; //1s定时标志
- //uchar time=0; //系统定时 0-255
- uchar num1;
- uchar num2;
- uchar num3;
- uchar num4;
- uchar num5;
- uchar num6;
- uchar num7;
- uchar num8;
- uchar num9;
- uchar num10;
- uchar num11;
- uchar num12;
- uchar num13;
- uchar num14;
- uchar num15;
- uchar num16; //计算 0-255
- unsigned short volt1=0,volt2=0; //adc0832转换
- bit writedat=0; //写24C08 的标志
- unsigned short Val; //mcp4725输出变量 0-65535
- uchar fhz=0; //MCP4725输出频率
- uint set_voltage; //设定值
- uchar digit4,digit3,digit2,digit1; //设定值千百十个位
- uchar mode=0;//模式 0-255
- unsigned short mode0=0;//主显示0 0-65535
- unsigned short mode1=0;//菜单显示1 0-65535
- unsigned short mode2=0;//菜单显示2 0-65535
- unsigned short mode3=0;//菜单显示3 0-65535
- unsigned short mode4=0;//菜单显示4 0-65535
- unsigned short mode5=0;//菜单显示5 0-65535
- unsigned short mode6=0;//菜单显示6 0-65535
- unsigned short mode7=0;//菜单显示7 0-65535
- unsigned short mode8=0;//菜单显示8 0-65535
- unsigned short ADC0;//菜单显示5 0-65535
- unsigned short ADC1;//菜单显示6 0-65535
- unsigned short ADC2;//菜单显示7 0-65535
- unsigned short ADC3;//菜单显示8 0-65535
- uchar h,m,s;//系统运行时间累计
- int duqu; //计算温度18b20温度显示
- uint count1; //按键延时计数器标志位
- /*********十进值与BCD码之间互换**********/
- uchar dectobcd(uchar);//十进值转bcd码
- uchar bcdtodec(uchar);//bcd码转十进值
- uchar hour,minute,second;//时分秒变量
- unsigned short i=0;
- uchar dis_buf[]={0,0,0,0,0,0,0,0};//显示缓存
- uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴数码管位码
- //uchar code wela[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//共阳数码管位码
- uchar code table[]=
- {
- 0x3F,//'0'0
- 0x06,//'1'1
- 0x5B,//'2'2
- 0x4F,//'3'3
- 0x66,//'4'4
- 0x6D,//'5'5
- 0x7D,//'6'6
- 0x07,//'7'7
- 0x7F,//'8'8
- 0x6F,//'9'9
- 0x77,//'A'10
- 0x5F,//'a'11
- 0x7F,//'B'12
- 0x7C,//'b'13
- 0x39,//'C'14
- 0x58,//'c'15
- 0x3F,//'D'16
- 0x5E,//'d'17
- 0x79,//'E'18
- 0x7B,//'e'19
- 0x71,//'F'20
- 0x71,//'f'21
- 0x7D,//'G'22
- 0x6F,//'g'23
- 0x76,//'H'24
- 0x74,//'h'25
- 0x06,//'I'26
- 0x04,//'i'27
- 0x1E,//'J'28
- 0x1E,//'j'29
- 0x38,//'L'30
- 0x06,//'l'31
- 0x37,//'N'32
- 0x54,//'n'33
- 0x3F,//'O'34
- 0x5C,//'o'35
- 0x73,//'P'36
- 0x73,//'p'37
- 0x67,//'Q'38
- 0x67,//'q'39
- 0x77,//'R'40
- 0x50,//'r'41
- 0x6D,//'S'42
- 0x6D,//'s'43
- 0x31,//'T'44
- 0x78,//'t'45
- 0x3E,//'U'46
- 0x1C,//'u'47
- 0x6E,//'Y'48
- 0x6E,//'y'49
- 0x5B,//'Z'50
- 0x5B,//'z'51
- 0x40,//'-'52
- 0x08,//'_'53
- 0x80, //'.'54
- 0x00 //' '55
- };
- //共阴数码管编码无小数点
- void delay1(uint z) //延时为 1ms
- {
- uchar x,x1;
- for(;z>0;z--)
- {
- for(x=0;x<114;x++)
- {for(x1=0;x1<1;x1++);}
- }
- }
- //单片机时钟周期:11.0592MHz 以时钟T2作为波特率发生器 //9600bps
- void SerialInit(){
- PCON &= 0x7F; //波特率不倍速 SMOD=0
- SCON = 0x50; //方式1,8位数据,可变波特率,接收允许
- T2CON = 0x34;
- RCAP2H = 0xFF;
- RCAP2L = 0xDC;
- TH2 = 0xFF;
- TL2 = 0xDC;
- EA=1; //总中断打开,采用查询法时不用打开中断
- ES=1; //串口中断开关,采用查询法时不用打开中断
- }
- //定时器
- void Timer0Init() //11.0592Mhz定时1ms
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- //TH0=0XFC; //给定时器赋初值,定时1ms
- //TL0=0X18;
- TH0=(65536-2000)/256; //2ms
- TL0=(65536-2000)%256; //2ms
- ET0=1; //打开定时器0中断允许
- EA=1; //打开总中断
- TR0=1;//打开定时器
- }
- //串口发送一个字节:
- void SendByte(unsigned char sbyte)
- {
- SBUF=sbyte; //发送数据
- while(!TI); //等待发送完成
- TI=0; //清零发送标志位
- }
- //串口发送一个字符串:
- void SendString(unsigned char *pstr) //定义指针
- {
- while(*pstr!='\0') //字符串是否发完
- {
- SendByte(*pstr);//发送字符串数据
- pstr++; //指向下一个字符
- }
- }
- //串口中断函数:
- void SerialPortInte(void) interrupt 4 //采用串口中断法收发数据
- {
- unsigned char rbyte;
- if(RI){ //RI=1,判定为串口接收到了数据,RI要清零,
- RI=0;
- rbyte=SBUF;
- if(rbyte==0x0A){
- SendString("换行");
- if(mode<17)
- mode++;
- }else if(rbyte==0x0D){
- SendString("回车");
- if(mode>0)
- mode--;
- }else{
- SendByte(rbyte);
- }
- }
- }
- //595处理开始
- void rck(void)
- {
- st_cp=1; //拉高
- st_cp=0; //拉低
- }
- void shift(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- ds=dat&0x80;//提取最高位
- sh_cp=1; //上升沿
- sh_cp=0; //下降沿
- dat<<=1;
- }
- }
- void DisplayScan()
- {
- static uchar i=0;
- shift(wei[i ]);//送位码
- [i ] shift(dis_buf[i ]);//送段码
- [i ][i ] rck();//锁存
- [i ][i ] i=++i%8;//循环扫描计数
- [i ][i ]}
- [i ][i ]//595处理结束
- [i ][i ]
- void run_time()//时钟走动函数定义
- {
- //从1307中读出时间
- second=ds1307_read_date(0xd0,1);//返回函数r值秒
- minute=ds1307_read_date(0xd0,2);
- hour=ds1307_read_date(0xd0,0);
- //将读出的时间转换成十进值
- second=bcdtodec(second);
- minute=bcdtodec(minute);
- hour=bcdtodec(hour);
- //更新串口发送时间
- }
- uchar dectobcd(uchar dec)//十进值到BCD码
- {
- uchar a,b,c;
- a=dec;
- b=0;
- while(a>=10)
- {
- a=a-10;
- b=b+16;
- c=a+b;
- dec=c;
- }
- return dec;
- }
- uchar bcdtodec(uchar bcd)//bcd码转十进值
- {
- uchar a,b,c;
- a=bcd;
- b=0;
- while(a>=16)
- {
- a=a-16;
- b=b+10;
- c=a+b;
- bcd=c;
- }
- return bcd;
- }
- //EC11开始
- /**********************EC11动作函数**********************/
- void EC11_Action(signed char num)
- {
- if(mode==17)
- {
- mode0 += num; //演示变量 加减 编码器正旋+1反旋减1
- }
- else if(mode==0)
- {
- fhz += num;
- }
- else if(mode==1)
- {
- mode1 += num;
- }
- else if(mode==2)
- {
- mode2 += num;
- }
- else if(mode==3)
- {
- mode3 += num;
- }
- else if(mode==4)
- {
- mode4 += num;
- }
- else if(mode==5)
- {
- mode5 += num;
- }
- else if(mode==6)
- {
- mode6 += num;
- }
- else if(mode==7)
- {
- mode7 += num;
- }
- else if(mode==8)
- {
- mode8 += num;
- }
- }
- /**********************EC11驱动函数**********************/
- void EC11_Driver() //放大循环里面
- {
- static bit turn_R; //检测EC11正转标志位
- static bit turn_L; //检测EC11反转标志位
- static bit turn_on; //检测EC11动作标志位
- static bit turn_on_last; //备份EC11上一次动作值
- /**********************EC11状态分析**********************/
- if(EC11_A_Now&&!EC11_B_Now) //正转状态
- {
- turn_R = 1; //正转标志
- }
- else if(!EC11_A_Now&&EC11_B_Now) //反转状态
- {
- turn_L = 1; //反转标志
- }
- else if(!EC11_A_Now&&!EC11_B_Now) //旋转状态
- {
- turn_on = 1; //旋转标记
- }
- else //起始状态 编码器未旋转
- { //或旋转到起始状态
- turn_on = 0; //旋转标志复位
- turn_R = 0; //正转标志复位
- turn_L = 0; //反转标志复位
- }
- /**********************EC11状态处理**********************/
- if(turn_R) //判定为正转状态 进行正转处理
- {
- if(turn_on != turn_on_last) //如果编码器转动
- {
- if(turn_on_last == 0) //如果编码器上次值为0
- { //则该当前值为1
- EC11_Action(EC11_A_Code); //执行动作函数 传送正转值
- }
- }
- turn_on_last = turn_on; //更新编码器状态
- }
- else if(turn_L) //判定为正转状态 反转处理
- {
- if(turn_on != turn_on_last) //如果编码器转动
- {
- if(turn_on_last == 0) //如果编码器上次值为0
- { //则该当前值为1
- EC11_Action(EC11_B_Code); //执行动作函数 传送反转值
- }
- }
- turn_on_last = turn_on; //更新编码器状态
- }
- else //不旋转时复位
- {
- turn_on_last = 0; //编码器最后动作状态复位
- }
- }
- /******************EC11_IO状态扫描及消抖*******************/
- void EC11_Scan() //放2ms定时器里面
- {
- static unsigned char EC11_A_Buf; //声明静态缓存变量
- static unsigned char EC11_B_Buf; //声明静态缓存变量
- EC11_A_Buf = ((EC11_A_Buf << 1) & 0x05) | EC11_A; //将编码器IO状态送入缓存 //可更改速度
- EC11_B_Buf = ((EC11_B_Buf << 1) & 0x05) | EC11_B; //连续三次都为0则判定为0 //可更改速度
- if(EC11_A_Buf == 0x00) //编码器A引脚电平判定
- EC11_A_Now = 0;
- else //否则
- EC11_A_Now = 1;
- if(EC11_B_Buf == 0x00) //编码器B引脚电平判定
- EC11_B_Now = 0;
- else //否则
- EC11_B_Now = 1;
- }
- //EC11结束
- void read_ds18b20_temp() //放2ms定时器里面扫描
- {
- static unsigned char ls,hs,i;
- switch(i)
- {
- case 0: init_ds18b20(); break;
- case 1: Write_DS18B20(0xcc); break;
- case 2: Write_DS18B20(0x44); break;
- case 94: init_ds18b20(); break;
- case 95: Write_DS18B20(0xcc); break;
- case 96: Write_DS18B20(0xbe); break;
- case 97: ls=Read_DS18B20(); break;
- case 98: hs=Read_DS18B20(); break;
- case 99: duqu=((hs<<8)|ls)/1.6*10; break;//保留2位小数
- //case 99: duqu=((hs<<4)&0xf0)|((ls>>4)&0x0f)*100; break;
- }
- i=++i%100;
- }
- void KEY() //按键
- {
- // uchar kk; //按键 0-255
- // if(mode<9) mode=0;
- {
- if(!k1) //设置加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k1) //再次判断按键是否按下
- {
- i=0;
- if(mode<17)
- mode+=1;
- SendString("mode+1"); //输出文本
- SendByte('1'); //输出HEX 0x31
- set_voltage=(unsigned int)mode; //强制转换uint输出
- OLED_P8x16Str(0,2,35); //M
- OLED_P8x16Str(8,2,37); //O
- OLED_P8x16Str(16,2,26); //D
- OLED_P8x16Str(24,2,27); //E
- OLED_P8x16Str(32,2,10); //:
- Display2(); //更新输出
- // writedat=1; //写入24C08 的标志;
- // printf("设置加:%u\r\n",(unsigned int)mode); //强制转换成int数发送
- }
- }
- }
- if(!k4 ) //设置减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k4) //再次判断按键是否按下
- {
- i=0;
- if(mode>0)
- mode-=1;
- SendString("mode-1");
- set_voltage=(unsigned int)mode; //强制转换uint输出
- Display2(); //更新输出
- // writedat=1; //写入24C08 的标志;
- // printf("设置减:%u\r\n",(unsigned int)mode); //强制转换成int数发送
- }
- }
- }
- if(!k5) //确认
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k5) //再次判断按键是否按下
- {
- writedat=1; //写入24C08 的标志;
- mode=0;
- // printf("保存eeprom成功\r\n");
- }
- }
- }
- if(mode==1)//模式1
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(mode1<65535) // 小于65535
- mode1++; //自加一次
- SendString("mode1+");
- set_voltage=mode1; //强制转换uint输出
- OLED_P8x16Str(0,4,35); //M
- OLED_P8x16Str(8,4,37); //O
- OLED_P8x16Str(16,4,26); //D
- OLED_P8x16Str(24,4,27); //E
- OLED_P8x16Str(32,4,1); //1
- OLED_P8x16Str(40,4,10); //:
- Display3(); //更新输出
- // printf("mode1:%d\r\n",mode1);
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(mode1>0) //判断大于1
- mode1--; //自减一次
- SendString("mode1-");
- // printf("mode1:%d\r\n",mode1);
- }
- }
- }
- }
- if(mode==2)//模式2
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(mode2<65535) // 小于65535
- mode2++; //自加一次
- // printf("mode2:%d\r\n",mode2);
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(mode2>0) //判断大于1
- mode2--; //自减一次
- // printf("mode2:%d\r\n",mode2);
- }
- }
- }
- }
- if(mode==3)//模式3
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(mode3<65535) // 小于65535
- mode3++; //自加一次
- // printf("mode3:%d\r\n",mode3);
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(mode3>0) //判断大于1
- mode3--; //自减一次
- // printf("mode3:%d\r\n",mode3);
- }
- }
- }
- }
- if(mode==4)//模式4
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(mode4<65535) // 小于65535
- mode4++; //自加一次
- // printf("mode4:%d\r\n",mode4);
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(mode4>0) //判断大于1
- mode4--; //自减一次
- // printf("mode4:%d\r\n",mode4);
- }
- }
- }
- }
- if(mode==5)//模式5
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(mode5<65535) // 小于65535
- mode5++; //自加一次
- // printf("mode5:%d\r\n",mode5);
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(mode5>0) //判断大于1
- mode5--; //自减一次
- // printf("mode5:%d\r\n",mode5);
- }
- }
- }
- }
- if(mode==6)//模式6
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(mode6<65535) // 小于65535
- mode6++; //自加一次
- // printf("mode6:%d\r\n",mode6);
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(mode6>0) //判断大于1
- mode6--; //自减一次
- // printf("mode6:%d\r\n",mode6);
- }
- }
- }
- }
- if(mode==7)//模式7
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(mode7<65535) // 小于65535
- mode7++; //自加一次
- // printf("mode7:%d\r\n",mode7);
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(mode7>0) //判断大于1
- mode7--; //自减一次
- // printf("mode7:%d\r\n",mode7);
- }
- }
- }
- }
- if(mode==8)//模式8
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(mode8<65535) // 小于65535
- mode8++; //自加一次
- // printf("mode8:%d\r\n",mode8);
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(mode8>0) //判断大于1
- mode8--; //自减一次
- // printf("mode8:%d\r\n",mode8);
- }
- }
- }
- }
- //////开始执行
- if(mode==0) //模式0
- {
- if(!k2) //加
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k2) //再次判断按键是否按下
- {
- if(fhz<mode1) // 判断fhz小于mpde1
- fhz++; //自加一次
- Val=valdata/mode1*fhz; //基准数5000/频率上限*设置运行频率=输出
- MCP4725_WriteData(Val); //写电压单位V
- // printf("频率:%uHz\n",(unsigned int)fhz); //打印频率 //强制转换成int数发送
- // printf("输出电压:%dMv\r\n",Val); //打印MCP4725电压
- }
- }
- }
- if(!k3) //减
- {
- if(count1==key) //消除抖动计数5次大约10ms
- {
- if(!k3) //再次判断按键是否按下
- {
- if(fhz>0) //判断大于0
- fhz--; //自减一次
- Val=valdata/mode1*fhz; //基准数5000/频率上限*设置运行频率=输出
- MCP4725_WriteData(Val); //写电压单位V
- // printf("频率:%uHz\n",(unsigned int)fhz); //打印频率 //强制转换成int数发送
- // printf("输出电压:%dMv\r\n",Val); //打印MCP4725电压
- }
- }
- }
- }
- if(mode==9)//模式9
- {
- if(i==100) //开启
- {
- i=0;
- volt1=ADC(1);//测量通道1
- volt1=volt1*500/127;
- volt2=ADC(2);//测量通道2
- volt2=volt2*500/127;
- /*
- SendString("table[volt1/100]+0x30");
- SendString(".");
- SendString("table[volt1%100/10]+0x30");
- SendString("table[volt1%10]+0x30");
- SendString("V");
- SendString("\r\n");
- SendString("table[volt2/100]+0x30");
- SendString(".");
- SendString("table[volt2%100/10]+0x30");
- SendString("table[volt2%10]+0x30");
- SendString("V");
- SendString("\r\n");
- */
- // printf("CH1:%gV\n",(float)volt1/100); //打印0832CH1电压//强制转换成float数发送使用%g不打印多的0
- // printf("CH2:%gV\r\n",(float)volt2/100); //打印0832CH2电压//强制转换成float数发送使用%g不打印多的0
- }
- }
- if(mode==10)//模式10
- {
- if(i==500) //开启
- {
- // duqu=ds18b20_readTemp(); //读18b20温度值
- //duqu=rd_temperature_f();//调用DS18B20温度采集程序:浮点数
- // duqu=duqu*0.0625*100+0.5;
- //duqu=duqu*100; //取1位小数
- //wendu=(unsigned int)x; //转换为整形数值,由数码管显示
- set_voltage=duqu; //温度输出
- Display1();
- if(duqu<0)
- {
- duqu=~duqu+1;
- duqu+=1;
- //duqu=duqu*0.0625*100+0.5;
- dis_buf[1]=table[52];
- }
- else //if(kaiqi==1)
- {
- //duqu=duqu*0.0625*100+0.5;
- dis_buf[1]=table[55];
- }
- i=0;
- }
- }
- /*
- if(mode==11)//模式11
- {
- if(i==100) //开启
- {
- i=0;
- run_time(); //时钟走动函数定义
- //printf("xtsz.t15.txt=\"%d:%d:%d\"\xff\xff\xff",(unsigned int)hour,(unsigned int)minute,(unsigned int)second); //打印小时
- // printf("时间:%d-%d-%d\r\n",(unsigned int)hour,(unsigned int)minute,(unsigned int)second); //打印
- }
- }
- */
- if(mode==12)//模式12
- {
- if(i==100) //开启
- {
- i=0;
- ADC0 = ADS1115_Read(0)*1000; //通道0
- // printf("ADS1115通道1:");
- // printf("%gmv\n",(float)ADC0/1000); //打印//强制转换成float数发送使用%g不打印多的0
- }
- }
- if(mode==13)//模式13
- {
- if(i==100) //开启
- {
- i=0;
- ADC1 = ADS1115_Read(1)*1000; //通道1
- // printf("ADS1115通道2:");
- // printf("%gmv\n",(float)ADC1/1000); //打印//强制转换成float数发送使用%g不打印多的0
- }
- }
- if(mode==14)//模式14
- {
- if(i==100) //开启
- {
- i=0;
- ADC2 = ADS1115_Read(2)*1000; //通道2
- // printf("ADS1115通道3:");
- // printf("%gmv\n",(float)ADC2/1000); //打印//强制转换成float数发送使用%g不打印多的0
- }
- }
- if(mode==15)//模式15
- {
- if(i==100) //开启
- {
- i=0;
- //ADC3 = (unsigned int)(ADS1115_Read(3)*1000); //通道3
- ADC3 = ADS1115_Read(3)*1000; //通道3
- // printf("ADS1115通道4:");
- // printf("%gmv\n",(float)ADC3/1000); //打印//强制转换成float数发送使用%g不打印多的0
- }
- }
- if(k1 && k2 && k3 && k4 && k5 )
- {
- // kk=0;
- count1=0; //计数清零
- }
- }
- if(writedat==1) //写入24C08 的标志;
- {
- writedat=0; //清除写入24C08 的标志;
- num1=(uchar)(mode1/256);
- num2=(uchar)(mode1%256); //num1和num2是将up的0-65535计算成两个255分别存储的变量
- num3=(uchar)(mode2/256);
- num4=(uchar)(mode2%256); //num3和num4是将down的0-65535计算成两个255分别存储的变量
- num5=(uchar)(mode3/256);
- num6=(uchar)(mode3%256); //num5和num6是将up的0-65535计算成两个255分别存储的变量
- num7=(uchar)(mode4/256);
- num8=(uchar)(mode4%256); //num7和num8是将down的0-65535计算成两个255分别存储的变量
- num9=(uchar)(mode5/256);
- num10=(uchar)(mode5%256); //num9和num10是将up的0-65535计算成两个255分别存储的变量
- num11=(uchar)(mode6/256);
- num12=(uchar)(mode6%256); //num11和num12是将down的0-65535计算成两个255分别存储的变量
- num13=(uchar)(mode7/256);
- num14=(uchar)(mode7%256); //num13和num14是将up的0-65535计算成两个255分别存储的变量
- num15=(uchar)(mode8/256);
- num16=(uchar)(mode8%256); //num15和num16是将down的0-65535计算成两个255分别存储的变量
- write(0xa0,0x01,num1); //地址1写入0-255
- delay1(10);
- write(0xa0,0x02,num2); //地址2写入0-255
- delay1(10);
- write(0xa0,0x03,num3); //地址3写入0-255
- delay1(10);
- write(0xa0,0x04,num4); //地址4写入0-255
- delay1(10);
- write(0xa0,0x05,num5); //地址5写入0-255
- delay1(10);
- write(0xa0,0x06,num6); //地址6写入0-255
- delay1(10);
- write(0xa0,0x07,num7); //地址7写入0-255
- delay1(10);
- write(0xa0,0x08,num8); //地址8写入0-255
- delay1(10);
- write(0xa0,0x09,num9); //地址9写入0-255
- delay1(10);
- write(0xa0,0x10,num10); //地址10写入0-255
- delay1(10);
- write(0xa0,0x11,num11); //地址11写入0-255
- delay1(10);
- write(0xa0,0x12,num12); //地址12写入0-255
- delay1(10);
- write(0xa0,0x13,num13); //地址13写入0-255
- delay1(10);
- write(0xa0,0x14,num14); //地址14写入0-255
- delay1(10);
- write(0xa0,0x15,num15); //地址15写入0-255
- delay1(10);
- write(0xa0,0x16,num16); //地址16写入0-255
- delay1(10);
- }
- switch(mode) //模式
- {
- case 0: //主显示
- {
- if(flag1s) //1s定时标志
- {
- dis_buf[0]=table[46];//显示千万位
- dis_buf[1]=table[Val/1000]+0x80;//显示百万位 +0x80就是显示有小数点
- dis_buf[2]=table[Val%1000/100];//显示十万位
- dis_buf[3]=table[Val%100/10];//显示万位
- dis_buf[4]=table[Val%10];//显示千位
- dis_buf[5]=table[20];//显示百位
- dis_buf[6]=table[fhz/10];//显示十位
- dis_buf[7]=table[fhz%10];//显示个位
- }
- else
- {
- dis_buf[6]=table[55];//显示十位
- dis_buf[7]=table[55];//显示个位
- }
- } break;
- case 1: //菜单1
- {
- dis_buf[0]=table[36];//显示千万位
- dis_buf[1]=table[1];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[mode1/10000];//显示万位
- dis_buf[4]=table[mode1%10000/1000];//显示千位
- dis_buf[5]=table[mode1%1000/100];//显示百位
- dis_buf[6]=table[mode1%100/10];//显示十位
- dis_buf[7]=table[mode1%10]; //显示个位
- }break;
- case 2: //菜单2
- {
- dis_buf[0]=table[36];//显示千万位
- dis_buf[1]=table[2];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[mode2/10000];//显示万位
- dis_buf[4]=table[mode2%10000/1000];//显示千位
- dis_buf[5]=table[mode2%1000/100];//显示百位
- dis_buf[6]=table[mode2%100/10];//显示十位
- dis_buf[7]=table[mode2%10]; //显示个位
- }break;
- case 3: //菜单3
- {
- dis_buf[0]=table[36];//显示千万位
- dis_buf[1]=table[3];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[mode3/10000];//显示万位
- dis_buf[4]=table[mode3%10000/1000];//显示千位
- dis_buf[5]=table[mode3%1000/100];//显示百位
- dis_buf[6]=table[mode3%100/10];//显示十位
- dis_buf[7]=table[mode3%10]; //显示个位
- }break;
- case 4: //菜单4
- {
- dis_buf[0]=table[36];//显示千万位
- dis_buf[1]=table[4];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[mode4/10000];//显示万位
- dis_buf[4]=table[mode4%10000/1000];//显示千位
- dis_buf[5]=table[mode4%1000/100];//显示百位
- dis_buf[6]=table[mode4%100/10];//显示十位
- dis_buf[7]=table[mode4%10]; //显示个位
- }break;
- case 5: //菜单5
- {
- dis_buf[0]=table[36];//显示千万位
- dis_buf[1]=table[5];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[mode5/10000];//显示万位
- dis_buf[4]=table[mode5%10000/1000];//显示千位
- dis_buf[5]=table[mode5%1000/100];//显示百位
- dis_buf[6]=table[mode5%100/10];//显示十位
- dis_buf[7]=table[mode5%10]; //显示个位
- }break;
- case 6: //菜单6
- {
- dis_buf[0]=table[36];//显示千万位
- dis_buf[1]=table[6];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[mode6/10000];//显示万位
- dis_buf[4]=table[mode6%10000/1000];//显示千位
- dis_buf[5]=table[mode6%1000/100];//显示百位
- dis_buf[6]=table[mode6%100/10];//显示十位
- dis_buf[7]=table[mode6%10]; //显示个位
- }break;
- case 7: //菜单7
- {
- dis_buf[0]=table[36];//显示千万位
- dis_buf[1]=table[7];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[mode7/10000];//显示万位
- dis_buf[4]=table[mode7%10000/1000];//显示千位
- dis_buf[5]=table[mode7%1000/100];//显示百位
- dis_buf[6]=table[mode7%100/10];//显示十位
- dis_buf[7]=table[mode7%10]; //显示个位
- }break;
- case 8: //菜单8
- {
- dis_buf[0]=table[36];//显示千万位
- dis_buf[1]=table[8];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[mode8/10000];//显示万位
- dis_buf[4]=table[mode8%10000/1000];//显示千位
- dis_buf[5]=table[mode8%1000/100];//显示百位
- dis_buf[6]=table[mode8%100/10];//显示十位
- dis_buf[7]=table[mode8%10]; //显示个位
- }break;
- case 9: //菜单9
- {
- dis_buf[0]=table[volt1/100]+0x80;//显示千万位
- dis_buf[1]=table[volt1%100/10];//显示百万位
- dis_buf[2]=table[volt1%10];//显示十万位
- dis_buf[3]=table[46];//显示万位
- dis_buf[4]=table[volt2/100]+0x80;//显示千位
- dis_buf[5]=table[volt2%100/10];//显示百位
- dis_buf[6]=table[volt2%10];//显示十位
- dis_buf[7]=table[46]; //显示个位
- }break;
- case 10: //菜单10
- {
- dis_buf[0]=table[55];//显示千万位
- // dis_buf[1]=table[55];//显示百万位
- dis_buf[2]=table[duqu/10000];//显示十万位
- dis_buf[3]=table[duqu%10000/1000];//显示万位
- dis_buf[4]=table[duqu%1000/100]+0x80;//显示千位
- dis_buf[5]=table[duqu%100/10];//显示百位
- dis_buf[6]=table[duqu%10];//显示十位
- dis_buf[7]=table[15]; //显示个位
- }break;
- case 11: //菜单11
- {
- dis_buf[0]=table[hour/10];//显示千万位
- dis_buf[1]=table[hour%10];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[minute/10];//显示万位
- dis_buf[4]=table[minute%10];//显示千位
- dis_buf[5]=table[52];//显示百位
- dis_buf[6]=table[second/10];//显示十位
- dis_buf[7]=table[second%10]; //显示个位
- }break;
- case 12: //菜单12
- {
- dis_buf[0]=table[36]; //显示千万位
- dis_buf[1]=table[1]; //显示百万位
- dis_buf[2]=table[2]; //显示十万
- dis_buf[3]=table[52]; //显示万位
- dis_buf[4]=table[ADC0/1000]+0x80; //显示千位
- dis_buf[5]=table[ADC0%1000/100]; //显示百位
- dis_buf[6]=table[ADC0%100/10]; // 显示十位
- dis_buf[7]=table[ADC0%10]; //显示个位
- }break;
- case 13: //菜单13
- {
- dis_buf[0]=table[36]; //显示千万位
- dis_buf[1]=table[1]; //显示百万位
- dis_buf[2]=table[3]; //显示十万
- dis_buf[3]=table[52]; //显示万位
- dis_buf[4]=table[ADC1/1000]+0x80; //显示千位
- dis_buf[5]=table[ADC1%1000/100]; //显示百位
- dis_buf[6]=table[ADC1%100/10]; // 显示十位
- dis_buf[7]=table[ADC1%10]; //显示个位
- }break;
- case 14: //菜单14
- {
- dis_buf[0]=table[36]; //显示千万位
- dis_buf[1]=table[1]; //显示百万位
- dis_buf[2]=table[4]; //显示十万
- dis_buf[3]=table[52]; //显示万位
- dis_buf[4]=table[ADC2/1000]+0x80; //显示千位
- dis_buf[5]=table[ADC2%1000/100]; //显示百位
- dis_buf[6]=table[ADC2%100/10]; // 显示十位
- dis_buf[7]=table[ADC2%10]; //显示个位
- }break;
- case 15: //菜单15
- {
- dis_buf[0]=table[36]; //显示千万位
- dis_buf[1]=table[1]; //显示百万位
- dis_buf[2]=table[5]; //显示十万
- dis_buf[3]=table[52]; //显示万位
- dis_buf[4]=table[ADC3/1000]+0x80; //显示千位
- dis_buf[5]=table[ADC3%1000/100]; //显示百位
- dis_buf[6]=table[ADC3%100/10]; // 显示十位
- dis_buf[7]=table[ADC3%10]; //显示个位
- }break;
- case 16: //菜单12
- {
- dis_buf[0]=table[h/10];//显示千万位
- dis_buf[1]=table[h%10];//显示百万位
- dis_buf[2]=table[52];//显示十万位
- dis_buf[3]=table[m/10];//显示万位
- dis_buf[4]=table[m%10];//显示千位
- dis_buf[5]=table[52];//显示百位
- dis_buf[6]=table[s/10];//显示十位
- dis_buf[7]=table[s%10]; //显示个位
- }break;
- case 17: //菜单17
- {
- dis_buf[0]=table[18];//显示千万位
- dis_buf[1]=table[14];//显示百万位
- //dis_buf[2]=table[7]+0x80;//显示十万位
- dis_buf[3]=table[mode0/10000];//显示万位
- dis_buf[4]=table[mode0%10000/1000];//显示千位
- dis_buf[5]=table[mode0%1000/100];//显示百位
- dis_buf[6]=table[mode0%100/10];//显示十位
- dis_buf[7]=table[mode0%10]; //显示个位
- }break;
- } //default: 如果表达式的值和以上的case后面的值都没有匹配上,那么就执行这里的代码。
- }
- void display595out() //595数码管输出
- {
- //display595();
- DisplayScan();
- }
- void duqu24cxx()
- {
- if(rst==1) //判断如果等于高电平那么就执行读取数据,如果不是那么就不读取数据同时存储的数据会清零
- {
- num1 = read(0xa0,0x01,0xa1); //地址1读出0-255
- delay1(10); //适当延时
- num2 = read(0xa0,0x02,0xa1); //地址2读出0-255
- delay1(10); //适当延时
- num3 = read(0xa0,0x03,0xa1); //地址3读出0-255
- delay1(10); //适当延时
- num4 = read(0xa0,0x04,0xa1); //地址4读出0-255
- delay1(10); //适当延时
- num5 = read(0xa0,0x05,0xa1); //地址5读出0-255
- delay1(10); //适当延时
- num6 = read(0xa0,0x06,0xa1); //地址6读出0-255
- delay1(10); //适当延时
- num7 = read(0xa0,0x07,0xa1); //地址7读出0-255
- delay1(10); //适当延时
- num8 = read(0xa0,0x08,0xa1); //地址8读出0-255
- delay1(10); //适当延时
- num9 = read(0xa0,0x09,0xa1); //地址9读出0-255
- delay1(10); //适当延时
- num10 = read(0xa0,0x10,0xa1); //地址10读出0-255
- delay1(10); //适当延时
- num11 = read(0xa0,0x11,0xa1); //地址11读出0-255
- delay1(10); //适当延时
- num12 = read(0xa0,0x12,0xa1); //地址12读出0-255
- delay1(10); //适当延时
- num13 = read(0xa0,0x13,0xa1); //地址13读出0-255
- delay1(10); //适当延时
- num14 = read(0xa0,0x14,0xa1); //地址14读出0-255
- delay1(10); //适当延时
- num15 = read(0xa0,0x15,0xa1); //地址15读出0-255
- delay1(10); //适当延时
- num16 = read(0xa0,0x16,0xa1); //地址16读出0-255
- delay1(10); //适当延时
- mode1 = num1*256 + num2; //计算还原成0-65535
- mode2 = num3*256 + num4; //计算还原成0-65535
- mode3 = num5*256 + num6; //计算还原成0-65535
- mode4 = num7*256 + num8; //计算还原成0-65535
- mode5 = num9*256 + num10; //计算还原成0-65535
- mode6 = num11*256 + num12; //计算还原成0-65535
- mode7 = num13*256 + num14; //计算还原成0-65535
- mode8 = num15*256 + num16; //计算还原成0-65535
- }
- else if(rst==0)
- {
- num1=(uchar)(mode1/256);
- num2=(uchar)(mode1%256); //num1和num2是将up的0-65535计算成两个255分别存储的变量
- num3=(uchar)(mode2/256);
- num4=(uchar)(mode2%256); //num3和num4是将down的0-65535计算成两个255分别存储的变量
- num5=(uchar)(mode3/256);
- num6=(uchar)(mode3%256); //num5和num6是将up的0-65535计算成两个255分别存储的变量
- num7=(uchar)(mode4/256);
- num8=(uchar)(mode4%256); //num7和num8是将down的0-65535计算成两个255分别存储的变量
- num9=(uchar)(mode5/256);
- num10=(uchar)(mode5%256); //num9和num10是将up的0-65535计算成两个255分别存储的变量
- num11=(uchar)(mode6/256);
- num12=(uchar)(mode6%256); //num11和num12是将down的0-65535计算成两个255分别存储的变量
- num13=(uchar)(mode7/256);
- num14=(uchar)(mode7%256); //num13和num14是将up的0-65535计算成两个255分别存储的变量
- num15=(uchar)(mode8/256);
- num16=(uchar)(mode8%256); //num15和num16是将down的0-65535计算成两个255分别存储的变量
- write(0xa0,0x01,num1); //地址1写入0-255
- delay1(10);
- write(0xa0,0x02,num2); //地址2写入0-255
- delay1(10);
- write(0xa0,0x03,num3); //地址3写入0-255
- delay1(10);
- write(0xa0,0x04,num4); //地址4写入0-255
- delay1(10);
- write(0xa0,0x05,num5); //地址5写入0-255
- delay1(10);
- write(0xa0,0x06,num6); //地址6写入0-255
- delay1(10);
- write(0xa0,0x07,num7); //地址7写入0-255
- delay1(10);
- write(0xa0,0x08,num8); //地址8写入0-255
- delay1(10);
- write(0xa0,0x09,num9); //地址9写入0-255
- delay1(10);
- write(0xa0,0x10,num10); //地址10写入0-255
- delay1(10);
- write(0xa0,0x11,num11); //地址11写入0-255
- delay1(10);
- write(0xa0,0x12,num12); //地址12写入0-255
- delay1(10);
- write(0xa0,0x13,num13); //地址13写入0-255
- delay1(10);
- write(0xa0,0x14,num14); //地址14写入0-255
- delay1(10);
- write(0xa0,0x15,num15); //地址15写入0-255
- delay1(10);
- write(0xa0,0x16,num16); //地址16写入0-255
- delay1(10);
- }
- }
- void ds1307duqu()
- {
- /*
- //初始化写入数码管的时分秒
- second=55;
- minute=59;
- hour=01;
- b_second=dectobcd(second);
- b_minute=dectobcd(minute);
- b_hour=dectobcd(hour);
- //将所调的时间向时钟写入
- write_1307(0xd0,0,b_hour);
- write_1307(0xd0,2,b_minute);
- write_1307(0xd0,1,b_second);
- //初始化ds1307
- write_1307(0xd0,0x07,0x10);//初始化1307的控制字,使其SOUT引脚输出1Hz的方波。
- //初始化1307的时间/*
- write_1307(0xd0,6,0x07);
- write_1307(0xd0,5,0x11);
- write_1307(0xd0,4,0x24);
- write_1307(0xd0,3,0x04);
- write_1307(0xd0,2,0x00);
- write_1307(0xd0,1,0x00);
- write_1307(0xd0,0,0x00);
- */
- /* //初始化写入数码管的时分秒
- second=55;
- minute=59;
- hour=01;
- b_second=dectobcd(second);
- b_minute=dectobcd(minute);
- b_hour=dectobcd(hour);
- //将所调的时间向时钟写入
- ds1307_write_date(0xd0,0,b_hour);
- ds1307_write_date(0xd0,2,b_minute);
- ds1307_write_date(0xd0,1,b_second);
- */
- /*
- //初始化ds1307
- ds1307_write_date(0xd0,0x07,0x10);//初始化1307的控制字,使其SOUT引脚输出1Hz的方波。
- //初始化1307的时间/*
- ds1307_write_date(0xd0,6,0x07);
- ds1307_write_date(0xd0,5,0x11);
- ds1307_write_date(0xd0,4,0x24);
- ds1307_write_date(0xd0,3,0x04);
- ds1307_write_date(0xd0,2,0x23); //
- ds1307_write_date(0xd0,1,0x55); //
- ds1307_write_date(0xd0,0,0x00); //
- */
- }
- void init() //初始化
- {
- MCP4725_WriteData(0);//掉电不保存数据
- duqu24cxx(); //读出24cxx存储的数据
- ds1307duqu();//写入DS1307数据
- Timer0Init(); //定时器初始化
- SerialInit(); //串口初始化
- OLED_Init();
- OLED_CLS();
- // OLED_P32x64Str(0,0,2); //
- OLED_hzStr(0,0,2); //数
- OLED_hzStr(16,0,3); //字
- OLED_hzStr(32,0,0); //电
- OLED_hzStr(48,0,1); //压
- OLED_hzStr(64,0,4); //源
- OLED_P8x16Str(80,0,13); //
- OLED_P8x16Str(88,0,0); //
- OLED_P8x16Str(96,0,0); //
- OLED_P8x16Str(104,0,0); //
- OLED_P8x16Str(112,0,0); //
- OLED_P8x16Str(120,0,49); //
- Display1(); //更新输出
- set_voltage=(unsigned int)mode; //强制转换uint输出
- OLED_P8x16Str(0,2,35); //M
- OLED_P8x16Str(8,2,37); //O
- OLED_P8x16Str(16,2,26); //D
- OLED_P8x16Str(24,2,27); //E
- OLED_P8x16Str(32,2,10); //:
- Display2(); //更新输出
- // OLED_hzStr(96,4,7); //实
- // OLED_hzStr(112,4,8); //际
- // OLED_hzStr(96,6,5); //设
- // OLED_hzStr(112,6,6); //定
- }
- void main()
- {
- init();
- // printf("初始化完成...\r\n"); //初始化完成后串口发出
- SendString("初始化完成...\r\n");//初始化完成后串口发出
- while(1)
- {
- //display595out(); //595数码管显示
- KEY(); //按键处理
- EC11_Driver(); //EC11编码器驱动函数
- }
- }
- //定时器中断
- void time0() interrupt 1 //初始值大概2毫秒
- {
- static uint tcount;
- static uint tcount2;
- //TH0=(65536-2000)/256;//2ms
- //TL0=(65536-2000)%256;//2ms
- TH0=(65536-1920)/256;//2ms
- TL0=(65536-1920)%256;//2ms
- tcount++;
- count1++;
- tcount2++;
- i++;
- if(tcount==500)
- {
- tcount=0;
- s++;
- if(s==60)
- {
- s=0;
- m++;
- if(m==60)
- {
- m=0;
- h++;
- if(h==24)
- {
- h=0;
- }
- }
- }
- run_time(); //时钟走动函数定义
- led=~led; //状态灯1秒一次
- }
- if(tcount2==250)
- {
- flag1s=!flag1s; //1s定时标志
- tcount2=0;
- }
- display595out(); //595数码管显示
- EC11_Scan(); //EC11编码器扫描
- read_ds18b20_temp(); //ds18b20温度读取
- }
复制代码
|