找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1736|回复: 2
打印 上一主题 下一主题
收起左侧

我有几个单片机模块的程序都能独立实现功能,现想整合成一个程序

[复制链接]
跳转到指定楼层
楼主
ID:316257 发表于 2018-5-12 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有三个程序
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;//上面三个灯灭
                                }                 
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:316257 发表于 2018-5-12 13:16 | 只看该作者
有人搞出来可以加我QQ352846253有红包滴
回复

使用道具 举报

板凳
ID:123289 发表于 2018-5-12 21:25 | 只看该作者
为何你弄不出来呢,是你编程习惯不好。
建议:
1、先将各个程序画成框图。
2、将三个框图流程串联起来。
3、重新整合框图,走通各个分支。
4、在按框图写程序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表