我有三个程序
1.按键控制3个LED灯的亮灭
2.按键控制PWN占空比调光
3.液晶屏60S倒计时
三个分开写的,用的都是不同的按键,现在想整合成一个程序却无从下手了。
预期开关控制灯亮以后能用其他按键对亮的灯进行调光。
另有独立按键控制一个固定程序可以按下以后显示60S倒计时且倒计时期间灯D1亮20SD2亮40S,倒计时结束灯全灭。
程序附下希望有大佬帮忙改一下,我学习一下
液晶显示倒计时:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^3;
sbit RW=P2^4;
sbit EN=P2^5;
uchar code temp[]="00";
uint aa,ee,date1;
void delay(uint aa)
{
uint bb,cc;
for(bb=0;bb<aa;bb++)
for(cc=0;cc<100;cc++);
}
void write_zhiling(uint com)
{
RS=0;
P0=com;
delay(5);
EN=1;
delay(10);
EN=0;
}
void write_shuju(uint shuju)
{
RS=1;
P0=shuju;
delay(5);
EN=1;
delay(10);
EN=0;
}
void inite() //中断、1602初始化
{
TMOD=0x01;
TH0=(65536-46080)/256;
TH0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
RW=0;
EN=0;
date1=60;
write_zhiling(0x38);
write_zhiling(0x0c);
write_zhiling(0x06);
write_zhiling(0x80);
write_zhiling(0x01);
write_zhiling(0x80+7);
for(aa=0;aa<2;aa++)
{
write_shuju(temp[aa]);
delay(5);
}
}
void display(uint date)
{
uint ge,shi;
ge=date%10;
shi=date/10;
write_shuju(0x30+shi);//0x30--0x39对应的是1602显示0--9的ASCLL码值
write_shuju(0x30+ge);
}
void timer0() interrupt 1
{
TH0=(65536-46080)/256;//11.0592MHZ晶振50Ms
TH0=(65536-46080)%256;
ee++;
if(ee==14)//加上前面延时子函数的延时, 在我的板子上ee=14的时候大概就是一秒钟
{
ee=0;
date1--;
if(date1==0)
{
date1=60;
}
write_zhiling(0x80+7);
display(date1);
}
}
void main()
{
inite();
while(1);
}
调光程序
#include <reg51.h>
#define uInt unsigned int
#define uchar unsigned char
uchar PWM_T = 0; //占空比控制变量
sbit k1=P1^0;//
sbit k2=P1^1;//
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit D1=P2^0;//
sbit D2=P2^1;//
sbit D3=P2^2;//
bit flag=0;
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 125; i++);
}
}
/*********************************************************************************************/
void main (void)
{
uInt n;
TMOD=0x02; //定时器0,工作模式2,8位定时模式
TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
D1=1;
//初始化P1,输出端口
//初始化P0
while(1) //PWM周期100,高电平100- PWM_T, 低电平PWM_T,低电平工作
{
for(n=0;n<100;n++); //延时,取值0-65535,数字越大变化越慢
if(k4==1||k5==1||k6==1) //通过按键改变占空比
{
if(k4==1) PWM_T=35; //这些值可以改变
else if(k5==1) PWM_T=65;
else if(k6==1) PWM_T=100;
}
}
}
/****************************************************
/定时器0中断模拟PWM
****************************************************/
uchar t ; //PWM计数
timer0() interrupt 1 using 2
{
t++; //每次定时器溢出加1
if(t==80) //PWM周期 100个单位
{
t=0; //使t=0,开始新的PWM周期
}
if(PWM_T<=t) //按照当前占空比切换输出为高电平
{
D1=1;} //使LED灯灭
else
D1 = 0;
}
按键控制颜色
#include <REG51.h> //单片机头文件
sbit k1=P1^0;//
sbit k2=P1^1;//
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit D1=P2^0;//
sbit D2=P2^1;//
sbit D3=P2^2;//
bit flag=0;
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 125; i++);
}
}
/*********************************************************************************************/
void main (void)
{
while(1){
if(k1==1&&flag==0){ //
DELAY_MS(10);
if(k1==1&&flag==0){
flag=1;
D1=0;
D2=1;
D3=1;//蓝亮红黄灭
}
}
if(k1==0){
flag=0;
D1=1;//蓝灭
}
if(k2==1&&flag==0){//
DELAY_MS(10);
if(k2==1&&flag==0){
flag=1;
D2=0;
D1=1;
D3=1;//红亮蓝黄灭
}
}
if(k2==0){
flag=0;
D2=1;//上面三个灯灭
}
if(k3==1&&flag==0){//
DELAY_MS(10);
if(k3==1&&flag==0){
flag=1;
D3=0;
D1=1;
D2=1;//黄亮蓝红灭
}
}
if(k3==0){
flag=0;
D3=1;//上面三个灯灭
}
}
}
|