单片机源程序如下:
- #include<STC15F2K60S2.H>
- #include<iic.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit S7=P3^0;
- sbit S6=P3^1;
- sbit S5=P3^2;
- sbit S4=P3^3;
- u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc6,0xff};//- C ff
- u8 mode=1;//mode运行模式切换
- u8 change=0;//change切换选择对象
- u16 count=0,time_g=700;//count用于定时,time_g时间间隔
- u8 Vaout=0;//电压
- u16 time=0,time2=0;//0.8秒闪烁计时
- u16 shan_time=0,shan_time2=0;
- u16 bright_count=0;//bright_count用于PWM计时
- u8 bright=10,lamp=0;//bright亮度 ,lamp亮度选择
- bit flat=0;//1 开启PWM , 0 关闭PWM
- bit twinkle=0;//0.8秒闪烁
- bit start=0;//启动LED标志位
- bit Bright_flat=0;//亮度调节标志位
- static u8 mode1_time=0,mode2_time=0,mode3_time=0,mode4_time=0;
- //EEPROM AT24C02有256个字节,所以最大值为255,故缩小10倍
- void Smg(u8 wei,u8 duan);
- void Delayms(u16 ms);
- void Timer0Init();
- void Key_Scan();//独立按键
- void LED_Disply();//运行模式
- void Set_Disply();//设置状态
- void Bright_Display();//亮度调节
- void Tiem_interval();//时间间隔,优化所加
- void Init()//初始化
- {
- P2 = (P2 & 0X1f) | 0x80;//打开LED锁存
- P0 = 0xff; //初始化
- P2 = P2 & 0X1f; //恢复锁存,避免影响其他位
-
- P2 = (P2 & 0X1f) | 0xa0;//打开蜂鸣器、继电器锁存
- P0 = 0x00;
- P2 = P2 & 0X1f;////恢复锁存,避免影响其他位
-
- P2 = (P2 & 0X1f) | 0xc0;//打开位选锁存
- P0 = 0x00;
- P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
-
- P2 = (P2 & 0X1f) | 0xe0;//打开段选锁存
- P0 = 0xff;
- P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
- }
- ////////////////////////////////////////////////////////
- void main()
- {
- // IIC_Write(0x00,00);
- // IIC_Write(0x01,00);
- // IIC_Write(0x02,00);
- // IIC_Write(0x03,00);
-
- Init();
- Timer0Init();
- mode1_time=IIC_Read(0x00);
- mode2_time=IIC_Read(0x01);
- mode3_time=IIC_Read(0x02);
- mode4_time=IIC_Read(0x03);
- ADC_Init(0x03);//滑动变阻器
- while(1)
- {
- Key_Scan(); //独立按键
- Set_Disply(); //设置状态
- if(start==1)LED_Disply();//打开LED
- }
- }
- void Key_Scan()//独立按键
- {
- if(S7==0)//LED启动/停止
- {
- Delayms(5);
- if(S7==0)
- {
- start=~start;
- }while(!S7);
- }
- //////////////////////////
- if(S6==0)//设置状态
- {
- Delayms(5);
- if(S6==0)
- {
- change++;
- if(change==3) change=0;
- }while(!S6);
- }
- ////////////////////////////
- if(S5==0)//加
- {
- Delayms(5);
- if(S5==0)
- {
- if(change==1)//LED运行模式
- {
- mode++;
- if(mode>=4)mode=4;
- }
- if(change==2)//时间间隔
- {
- time_g=time_g+10;
- if(time_g>=120)time_g=120;
-
- if(mode==1)
- {
- mode1_time=time_g;
- IIC_Write(0x00,mode1_time);//写入EEPROM
- }else if(mode==2)
- {
- mode2_time=time_g;
- IIC_Write(0x01,mode2_time);//写入EEPROM
- }else if(mode==3)
- {
- mode3_time=time_g;
- IIC_Write(0x02,mode3_time); //写入EEPROM
- }else if(mode==4)
- {
- mode4_time=time_g;
- IIC_Write(0x03,mode4_time);//写入EEPROM
- }
- }
- }while(!S5);
- }
- /////////////////////////////////////////////
- if(S4==0)//减/亮度调节
- {
- Delayms(5);
- if(S4==0)
- {
- if(change==1)//运行模式
- {
- mode--;
- if(mode==1)mode=1;
- }
- if(change==2)//时间间隔
- {
- time_g=time_g-10;
- if(time_g<=40)time_g=40;
-
- if(mode==1)
- {
- mode1_time=time_g;
- IIC_Write(0x00,mode1_time);
- }else if(mode==2)
- {
- mode2_time=time_g;
- IIC_Write(0x01,mode2_time);
- }else if(mode==3)
- {
- mode3_time=time_g;
- IIC_Write(0x02,mode3_time);
- }else if(mode==4)
- {
- mode4_time=time_g;
- IIC_Write(0x03,mode4_time);
- }
- }
- //**************************************************
- if(change==0)//非“设置”状态下
- {
- Bright_Display();//亮度调节
- }
- //////////////////////////////////////////////////
- }
- if(change==1|change==2)
- while(!S4);
- }
- }
- void Set_Disply()//设置状态
- {
- if(change==0)//数码管熄灭
- {
- }else if(change==1)
- {
- if(mode==1)
- {
- time_g=mode1_time;
- }else if(mode==2)
- {
- time_g=mode2_time;
- }else if(mode==3)
- {
- time_g=mode3_time;
- }else if(mode==4)
- {
- time_g=mode4_time;
- }
- Smg(0,10);
- Smg(2,10);
- Smg(4,time_g/100);
- Smg(5,time_g%100/10);
- Smg(6,time_g%100%10);
- Smg(7,0);
- if(twinkle==1)//0.8s闪烁
- Smg(1,mode);
- if(twinkle==0)//0.8s闪烁
- Smg(1,12);
- //*************************************************************
- }else if(change==2)
- {
- Smg(0,10);
- Smg(1,mode);//运行模式
- Smg(2,10);
- if(twinkle==1)//0.8s闪烁
- {
- Smg(4,time_g/100);
- Smg(5,time_g%100/10);
- Smg(6,time_g%100%10);
- Smg(7,0);
- }
- if(twinkle==0)//0.8s闪烁
- {
- Smg(4,12);//
- Smg(5,12);//
- Smg(6,12);//
- Smg(7,12);//
- }
- }
- }
- void Timer0Init()
- {
- TMOD=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。0000 0001
- TL0=(65535-1000)%256;//给定时器赋初值,定时1ms
- TH0=(65535-1000)/256;
- TR0=1;///打开定时器0中断允许
- ET0=1;//打开定时器中断
- EA=1;//打开总中断
- }
- void Bright_Display()//亮度调节
- {
- Vaout=ADC_Read();
- lamp=0.02*Vaout;//将0-255转换成显示0-5 5/255=0.02
- // if(lamp==5)flat=0;//关闭定时
-
- if(lamp==0)lamp=1;
- if(lamp==5)lamp=4;
- Smg(6,10);
- Smg(7,lamp);
- switch(lamp)
- {
- case 1:
- flat=1;//打开定时
- bright=2;
- break;
- case 2:
- flat=1;//打开定时
- bright=4;
- break;
- case 3:
- flat=1;//打开定时
- bright=6;
- break;
- case 4:
- flat=1;//打开定时
- bright=9;
- break;
- }
- }
- void LED_Disply()//运行模式
- {
- //一定要将模式放到定时器中断中的PWM里来运行并调节亮度,否则会与数码管冲突
-
- if(mode==1)//模式1
- {
- P2=(P2&0X1F)|0X80;
- P0=0XFE<<shan_time;
- P2=P2&0X1F;
- }else if(mode==2)//模式2
- {
- P2=(P2&0X1F)|0X80;
- P0=~(0XFE<<shan_time);
- P2=P2&0X1F;
- }else if(mode==3)//模式3
- {
- P2=(P2&0X1F)|0X80;
- P0=~((0X80>>shan_time2)|(0X01<<shan_time2));
- P2=P2&0X1F;
- }else if(mode==4)//模式4
- {
- P2=(P2&0X1F)|0X80;
- P0=~((0X08>>shan_time2)|(0X10<<shan_time2));
- P2=P2&0X1F;
- }
- }
- void Timer() interrupt 1
- {
- TL0=(65535-1000)%256;///1ms
- TH0=(65535-1000)/256;
- count++;
- time++;
- time2++;
- ////////////PWM调节亮度//////////////////////////////////
- if(flat==1)//关闭PWM定时
- {
- bright_count++;
- }else{
- bright_count=0;
- }
- if(bright_count==bright)//PWM
- {
- P2 = (P2 & 0X1f) | 0x80;
- P0 = 0xff;
- P2 = P2 & 0X1f;
- }else if(bright_count==10)//1ms*10=10
- {
- LED_Disply(); //运行模式
- bright_count=0;
- }
- /////////////流转间隔////////////////////////////
- if(mode==1)
- {
- if(count==mode1_time*10) Tiem_interval();////EEPROM AT24C02有256个字节,所以最大值为255,扩大10倍 10*120=1200
- }else if(mode==2)
- {
- if(count==mode2_time*10) Tiem_interval();
- }else if(mode==3)
- {
- if(count==mode3_time*10) Tiem_interval();
- }else if(mode==4)
- {
- if(count==mode4_time*10) Tiem_interval();
- }
- //************** 闪烁时间**********************************
- if(time==800)twinkle=1;
- if(time2==1600)
- {
- twinkle=0;
- time=0;
- time2=0;
- }
- }
- void Tiem_interval()//时间间隔
- {
- shan_time++;
- shan_time2++;
- if(shan_time==8)
- {
- shan_time=0;
- }
- if(shan_time2==4)
- {
- shan_time2=0;
- }
- count=0;
- }
- void Smg(u8 wei,u8 duan)
- {
- P2 = (P2 & 0X1f) | 0xe0;//消隐
- P0=0XFF;
- P2 = P2 & 0X1f;
-
- P2 = (P2 & 0X1f) | 0xc0;//位选
- P0 = 0x01<<wei;
- P2 = P2 & 0X1f;
-
- P2 = (P2 & 0X1f) | 0xe0;//段选
- P0=smgduan[duan];
- Delayms(3);//***********延时够
- P0=0XFF;
- P2 = P2 & 0X1f;
-
- P2 = (P2 & 0X1f) | 0xe0;//消隐
- P0=0XFF;
- P2 = P2 & 0X1f;
- }
- void Delayms(u16 ms)
- {
- int i,j;
- for(i=0;i<ms;i++)
- for(j=845;j>0;j--);
- }
复制代码
全部资料51hei下载地址:
第九届蓝桥杯单片机-彩灯控制器代码.zip
(807.35 KB, 下载次数: 28)
|