找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机怎么把两个C程序整合到一起运行?

[复制链接]
跳转到指定楼层
楼主
ID:957836 发表于 2021-10-24 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序一
//功能 :七彩呼吸

#include <STC8G.h>  
//端口定义
sbit GREEN    =    P3^1;//红光控制端,0点亮
sbit RED  =    P3^2;//绿光控制端,0点亮
sbit BLUE   =    P3^3;//蓝光控制端,0点亮

void port_mode()
{
        P3M1=0X00;P3M0=0X00;P5M1=0X00;P5M0=0X00;
}

void Delay(unsigned int t);  
void RGB(unsigned char R ,unsigned char G ,unsigned char B);

void main (void)
{   
    RED = 0 ; GREEN = 0 ; BLUE = 0 ;

                        port_mode();
                        P3=0X01;
    while (1)      
    {
        RGB(1,0,0);
        RGB(0,1,0);
        RGB(0,0,1);
        RGB(0,1,1);
        RGB(1,1,0);
        RGB(1,0,1);
        RGB(1,1,1);
                          RGB(0,0,0);
    }
}

void Delay(unsigned int t)
{
while(--t);
}
//7色光依次逐渐变亮
void RGB(unsigned char R ,unsigned char G ,unsigned char B)
{
    unsigned int pwm , set = 2000 ;        
    for(pwm=1;pwm<set;pwm++)//渐亮
    {
             RED    = 0;        //熄灭LED
             GREEN  = 0;
             BLUE   = 0;
             Delay(set-pwm);//延时长
             RED    = R;        
             GREEN  = G;
             BLUE   = B;        
             Delay(pwm);//延时长
    }
                for(pwm=set-1;pwm>0;pwm--)//渐暗
    {
             RED    = 0;        //熄灭LED
             GREEN  = 0;
             BLUE   = 0;
             Delay(set-pwm);//延时长
             RED    = R;        
             GREEN  = G;
             BLUE   = B;        
             Delay(pwm);//延时长
    }
}

======================================================================
程序二
//功能:七彩单色显示
#include <stc8.h>
sbit      K=P5^5;         


void  delay (unsigned int i)
        {
                 unsigned int k,m;
                        for(m=0;m<1000;m++);
                                for(k=0;k<i;k++);
        }     


void port_mode()
        {
                P3M1=0X00;P3M0=0X00;P5M1=0X00;P5M0=0X00;
        }
        
void main()
        {   
                unsigned char i=0;        
                                       
                                        port_mode();
                                        P5=0XE0;
                                        P3=0X00;
                                        while(1)
                 {
                                        if(K==0)   
                                        {
                                                                delay(1200);     
                                                                if(K==0)         
                                                                {   
                                                                 if(++i==9)i=1;                                                                                          
                                                                }  
                                        }
                                         switch(i)            
                                        {
                                                         case  1:P3=0x02;break;
                                                         case  2:P3=0x04;break;
                                                         case  3:P3=0x08;break;
                                                         case  4:P3=0x06;break;
                                                         case  5:P3=0x0a;break;
                                                         case  6:P3=0x0c;break;
                                                         case  7:P3=0x0e;break;
                                                        default:P3=0X00;break;
                                        }
                                                        while(!K);  
                                                        delay(1200);
                        }   
        }

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

使用道具 举报

沙发
ID:624769 发表于 2021-10-24 19:00 | 只看该作者
把main 的内容 合并到一起,确保只有一个 main, 注意main里面 while(1) 也是只有一个,所以while(1) 里面贴一起,外面的贴一起,   其他的子函数随便贴在一个文件里,就可以了。
回复

使用道具 举报

板凳
ID:957836 发表于 2021-10-24 20:44 | 只看该作者
感谢您的回复,合并后当按键按第二次后就一直执行case 2: y=8; break;再按下按键却不能执行后面的程序了,能否帮忙检查一下错误呢?

#include <stc8.h>

sbit      K=P5^5;
sbit GREEN    =    P3^1;//红光控制端,0点亮
sbit RED  =    P3^2;//绿光控制端,0点亮
sbit BLUE   =    P3^3;//蓝光控制端,0点亮
unsigned char y=0;

//void Delays(unsigned int t);  
void RGB(unsigned char R ,unsigned char G ,unsigned char B);


void  delay (unsigned int i)
        {
                 unsigned int k,m;
                        for(m=0;m<9000;m++);
                                for(k=0;k<i;k++);
        }     

void fuxi()
{
                if(y==0)
                {
                        P3=0x00;
                }
                if(y==1)
                {
                        P3=0x02;
                }
                if(y==2)
                {
                        P3=0x04;
                }
                if(y==3)
                {
                        P3=0x08;
                }
                if(y==4)
                {
                        P3=0x06;
                }
                if(y==5)
                {
                        P3=0x0a;
                }
                if(y==6)
                {
                        P3=0x0c;
                }
                if(y==7)
                {
                        P3=0x0e;
                }
                if(y==8)
       
                {
                          
                        RGB(1,0,0);
                        RGB(0,1,0);
                        RGB(0,0,1);
                        RGB(0,1,1);
                        RGB(1,1,0);
                        RGB(1,0,1);
                        RGB(1,1,1);
                        RGB(0,0,0);
          }
               
}
       
void key()
{
  unsigned char x;
  if(K==0)
  {
    delay(50);
    if(K==0)
    {
      while(!K);
      x++;
      if(x==9)
      x=1;
      if(y==9)
      x=1;
      switch(x)
      {
        case 1: y=1; break;
        case 2: y=8; break;
        case 3: y=3; break;
                                case 4: y=4; break;
        case 5: y=5; break;
        case 6: y=6; break;
                                case 7: y=7; break;
        case 8: y=2; break;
        
        default: break;  
      }
    }
  }
}
       
       
void port_mode()
        {
                P3M1=0X00;P3M0=0X00;P5M1=0X00;P5M0=0X00;
        }
       
void main()
        {   
                unsigned char i=0;
                RED = 0 ; GREEN = 0 ; BLUE = 0 ;               
                                       
                                        port_mode();
                                        P5=0XE0;
                                        P3=0X00;
                     
                                        while(1)
                 {
                          key();
                          fuxi();

                                                 
                        }   
        }
       
        void Delays(unsigned int t)
{
while(--t);
}

void RGB(unsigned char R ,unsigned char G ,unsigned char B)
{
    unsigned int pwm , set = 2000 ;        
    for(pwm=1;pwm<set;pwm++)//渐亮
    {
             RED    = 0;        //熄灭LED
             GREEN  = 0;
             BLUE   = 0;
             Delays(set-pwm);//延时长度
             RED    = R;        
             GREEN  = G;
             BLUE   = B;        
             Delays(pwm);//延时长度
    }
                for(pwm=set-1;pwm>0;pwm--)//渐暗
    {
             RED    = 0;        //熄灭LED
             GREEN  = 0;
             BLUE   = 0;
             Delays(set-pwm);//延时长度
             RED    = R;        
             GREEN  = G;
             BLUE   = B;        
             Delays(pwm);//延时长度
    }
}
回复

使用道具 举报

地板
ID:624769 发表于 2021-10-24 21:00 | 只看该作者
unsigned char x;  放到全局变量
回复

使用道具 举报

5#
ID:957836 发表于 2021-10-24 21:06 | 只看该作者
188610329 发表于 2021-10-24 21:00
unsigned char x;  放到全局变量

放到全局变量后还是和原来一样。
回复

使用道具 举报

6#
ID:973695 发表于 2021-10-24 22:45 | 只看该作者
执行case 2: y=8; break;再按下按键却不能执行后面的程序了

是因为 void RGB() 函数里头用了大量的 delay()空操作。单片机接收不了 按键操作。

解决的办法可以用外部中断来接收按键操作。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:57657 发表于 2021-10-24 23:37 | 只看该作者
看了下你的程序太乱,需要重写一份,其余全部用定时器中断实现,软件延时尽量不要用。
回复

使用道具 举报

8#
ID:957836 发表于 2021-10-25 07:31 来自手机 | 只看该作者
stycx 发表于 2021-10-24 22:45
执行case 2: y=8; break;再按下按键却不能执行后面的程序了

是因为 void RGB() 函数里头用了大量的 de ...

感谢您的宝贵建议。
回复

使用道具 举报

9#
ID:957836 发表于 2021-10-25 07:32 来自手机 | 只看该作者
npn 发表于 2021-10-24 23:37
看了下你的程序太乱,需要重写一份,其余全部用定时器中断实现,软件延时尽量不要用。

好的,您的建议非常好。
回复

使用道具 举报

10#
ID:420836 发表于 2021-10-25 07:56 | 只看该作者
确保新程序只有一个 main 函数,并且定义了所有其他函数和变量。
回复

使用道具 举报

11#
ID:517951 发表于 2021-10-25 20:15 | 只看该作者
把第二个文件的功能函数复制到第一个文件中去,然后main主函数在自己想要执行的地方调用新加进来的函数。
回复

使用道具 举报

12#
ID:339654 发表于 2021-10-26 22:45 | 只看该作者
使用时间片的方式运行代码,可以执行多个任务
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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