久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3825|回復: 5
打印 上一主題 下一主題
收起左側

有兩個MCU程序主函數各有一個while(1),如果合成一個程序怎樣改動才能同時運行

[復制鏈接]
跳轉到指定樓層
樓主
ID:731982 發表于 2020-4-27 19:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
5黑幣
兩個while(1)不可能同時存在,那么怎么改動才能合二為一呢
程序1 喇叭
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P2^0;        //定義喇叭輸出端口
uchar tick,tl,th;                //定義節拍和T0初值變量
uchar TABLE[]={        //音符節拍表
    0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
        0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
        0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
        0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
        0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
        0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
        0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
        0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
        0x00};
uchar TABLE1[]={  //定時器初值表
0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44,
0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,
0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,
0xfe,0x85,0xfe,0x9a,0xfe,0xc1};
   //T0中斷服務函數
timer0()interrupt 1 using 1{
TL0=tl;TH0=th;//低八位定時器和高八位定時器
BEEP=~BEEP;
}
//基本單位延時函數
void delay1(){
uint i;
for(i=0;i<20000;i++);
}
//節拍延時函數
void delay(tt){
uchar i;
for(i=0;i<=tt;i++)delay1();
}
//主函數
void main(){
uchar t,t1,k=0;
while(1){
TMOD=0x01;IE=0x82;// T0工作于模式1,即16位定時器模式.IE是中斷允許寄存器,D7置1表示允許CPU中斷,D1置1表示允許T0溢出中斷.
while(TABLE[k]!=0)
{ tick=(TABLE[k])&0x0f;
t=(_crol_(TABLE[k],4))&0x0f;
if(t!=0){
t1=--t*2+1;
t=t*2;
tl=TL0=TABLE1[t1];
th=TH0=TABLE1[t];
TR0=1;
  }
else TR0=0;
delay(tick);
k++;
     }
TR0=0;
   }
}

==========================
程序2 點陣
#include<reg52.h>
#include<intrins.h>
//intrins.h函數,一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環移位指令_crol_等時使用
//OE        第13腳        輸出有效(低電平)
//MR        第10腳        主復位(低電平)
typedef unsigned char uchar;
typedef unsigned int uint;
/**********管腳說明********************/
#define P P1   //define 不用加;
sbit SER = P3^4;    //p3.4串行數據輸入   DS
sbit SCK = P3^6;    //串行輸入時鐘,上升沿有效    SHCP        第11腳        數據輸入時鐘線
sbit RCK = P3^5;    //串行寄存器時鐘,上升沿有效  STCP        第12腳        輸出存儲器鎖存時鐘線

/***********************************/

/**********函數聲明********************/
void SendTo595(uchar byteData);
/***********************************/

/**********全局參數聲明********************/
char shu=0xFE;
/***********************************/


void delay(unsigned int n)//延時函數
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}

void hang()//行掃描
{
        P=shu;
        shu=_crol_(shu,1);
}

char a[32]={0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,
                        0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00,
                    0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,
                        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void main()
{
  int i,b=0;
        while(1)
        {
                        int num=12;
                        while(num--)
                        {
                                for(i=0;i<8;i++)
                                {
                                        hang();     //先位選再段選
                                        SendTo595(a[i+b]);                        
                                        delay(3);
                                }
                                //P=0xFF;
                                //SendTo595(0x00);
                        }
                  b++;
                        if(b>=24)b=0;
                        //P=0xFF;
         }        
}



//發送一個字節數據給595再并行輸出
void SendTo595(uchar Data)
{
   int j=0;
   for(j;j<8;j++)
   {
                SCK = 0;
        SER=0x80&Data;//&為按位運算符,即全1為1,有0為0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位為1則是1高位為0則這個式子為0
        Data=_crol_(Data,1); //左移一位 將高位補給低位,如果二進制數為01010101 那么_crol_(1) 為10101010
        SCK = 1;          //上升沿讓串行輸入時鐘變成高電平 并延時兩個時鐘周期
        _nop_();

   }  

   /*位移寄存器完畢,轉移到存儲寄存器*/
         
        
   RCK = 0;
   RCK = 1;         //上升沿,存儲寄存器變為高電平 延遲兩個時鐘周期
   _nop_();
   RCK = 0;

}



里面部分重復的變量名我自己會改,只想解決main里面怎么合并的問題

最佳答案

查看完整內容

可以直接把一個while(1)里面的程序放到另一個while(1)中,但是最好通過中斷實現,把主要的部分放到定時器中斷里面。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:578714 發表于 2020-4-27 19:47 | 只看該作者
可以直接把一個while(1)里面的程序放到另一個while(1)中,但是最好通過中斷實現,把主要的部分放到定時器中斷里面。
回復

使用道具 舉報

板凳
ID:592807 發表于 2020-4-27 21:51 | 只看該作者
while里面的內容直接放一起,不沖突就好
回復

使用道具 舉報

地板
ID:723681 發表于 2020-4-27 21:59 | 只看該作者
你可以根據情況,把兩套程序有機的整合到一起,把主程序中需要循環執行的部分才放到while(1)里面
回復

使用道具 舉報

5#
ID:624817 發表于 2020-4-28 00:40 | 只看該作者
C語言不過關啊 就算這個程序給你給你說明白了 換另一個還是不會,這樣治標不治本 可以先把基礎學好,基礎好了移植自然不成問題。
回復

使用道具 舉報

6#
ID:731982 發表于 2020-4-28 08:42 來自手機 | 只看該作者
houge123 發表于 2020-4-27 23:01
可以直接把一個while(1)里面的程序放到另一個while(1)中,但是最好通過中斷實現,把主要的部分放到定時器中 ...

謝謝您了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久在线 | 久久tv在线观看 | 国产精品国产精品国产专区不蜜 | 中文在线观看视频 | 欧美中文字幕一区二区三区 | 国产亚洲精品91 | 成人免费在线 | 宅女噜噜66国产精品观看免费 | 成人在线中文字幕 | 久久夜色精品国产 | 91精品麻豆日日躁夜夜躁 | 欧洲色综合 | 国产欧美一级二级三级在线视频 | 日韩午夜 | 久久久久久a | 亚洲欧美中文日韩在线v日本 | 天堂一区二区三区 | 奇米影视77 | 久久久国产精品入口麻豆 | 综合精品在线 | 日韩精品1区2区3区 成人黄页在线观看 | 亚洲日本三级 | 91精品免费视频 | 久久久久久久国产精品 | 国产精品九九视频 | 欧美日韩国产在线观看 | 伊人网伊人网 | 亚洲精品视频导航 | 亚州综合在线 | 欧美成人精品在线观看 | 激情亚洲 | 女人一区 | 中文字幕 欧美 日韩 | 国产一区二区三区免费 | 国产一区二区 | 最新一级毛片 | 91精品国产91久久综合桃花 | 欧美情趣视频 | 久久综合激情 | 在线a视频网站 | 欧美精品成人 |