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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7628|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

用stc89C52做的方波發(fā)生器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:67356 發(fā)表于 2018-3-20 18:49 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 jmkl128 于 2018-3-20 19:01 編輯


很簡(jiǎn)單的東西,輸出方波的頻率還比較準(zhǔn)。程序中按鍵部分采用了新的方法。
//晶振:12M (6T使能)
/*T0-計(jì)時(shí)25 微秒溢出中斷一次;P1.3 P1.4為增加、減少鍵P3.3 輸出方波
變量的定義:  pwm 設(shè)定的頻率數(shù)
connter_1 根據(jù)設(shè)定頻率計(jì)算后的,定時(shí)器溢的出次數(shù)值
connter : 定時(shí)器0計(jì)數(shù)溢出數(shù)
led_seg_code: 數(shù)碼管7 段碼
*/
/*用單片機(jī)產(chǎn)生頻率可調(diào)的方波信號(hào)。輸出方波的頻率范圍為1Hz-200Hz,頻率誤差比小于0.5%。
要求用"增加"、"減小"2 個(gè)按鈕改變方波給定頻率,按鈕每按下一次,給定頻率改變的步進(jìn)步長(zhǎng)為1Hz,
當(dāng)按鈕持續(xù)按下的時(shí)間超過(guò)2 秒后,給定頻率以10 次/秒的速度連續(xù)增加(減少),輸出方波的頻率要求在數(shù)碼管上顯示。
P1.3,P1.4分別為增加和減小按鍵*/
#include<reg52.h>
#include<intrins.h>
#include <math.h>
sbit    led_1=P2^4;
sbit    led_2=P2^3;
sbit    led_3=P2^2;
sbit    led_4=P2^1;
sbit    out=P2^0;
sbit    pwm_out=P3^3;
unsigned char pwm;
unsigned int  counter,counter_1;
unsigned char Trg;                          //點(diǎn)按
unsigned char Cont;                         //長(zhǎng)按
unsigned char cnt_plus;                     //長(zhǎng)按延時(shí)
unsigned char cnt_plus_time;                //長(zhǎng)按速度
unsigned char code seg_table[10]= {0xfa,0x22,0xb9,0xab,0x63,0x0cb,0x0db,0xa2,0xfb,0xeb}; //1~~~~9段選碼
/**************************************
****************定時(shí)器初始化函數(shù)****************
**************************************/
void InitTimer(void)
{
    TMOD &= 0xFF;      //設(shè)置定時(shí)器模式 T0,8位自動(dòng)加載,25us定時(shí)中斷。T1,16位,20ms,用于按鍵檢測(cè)
    TMOD |= 0x12;       //設(shè)置定時(shí)器模式
    TL0 = 0xCE;     //設(shè)置定時(shí)初值
    TH0 = 0xCE;     //設(shè)置定時(shí)重載值 25us
    TF0=0;    //清除中斷標(biāo)記
    ET0 = 1;  //TO使能
    TR0 = 1;   //T0開(kāi)始計(jì)時(shí)
    TL1 = 0xC0;     //設(shè)置定時(shí)初值
    TH1 = 0x63;     //設(shè)置定時(shí)初值 20ms
    TF1=0;      //清除中斷標(biāo)記
    ET1=1;    //T1使能
    TR1=1; //T1開(kāi)始計(jì)時(shí)
    EA = 1; //開(kāi)總中斷
}
/**************************************
****************延時(shí)1ms****************
**************************************/
void delay1ms(void) //@12.000MHz
{
    unsigned char i, j;
    i = 2;
    j = 239;
    do
    {
        while (--j)
        {
            ;
        }
    }
    while (--i);
}
/**************************************
****************按鍵檢測(cè)****************
**************************************/
void Key(void)
{
    unsigned char ReadData=P1^0xff;
    Trg=ReadData&(ReadData^Cont);
    Cont=ReadData;
    if (Cont==0)
    {
        cnt_plus=0;     //長(zhǎng)按標(biāo)志清0
    }
    if (Trg&0x10)       //按下P1.3
    {
        pwm++;
        if(pwm==201)
        {
            pwm=1;
        }
    }
    if (Trg&0x08)       //按下P1.4
    {
        pwm--;
        if(pwm==0)
        {
            pwm=200;
        }
    }
    if (cnt_plus<50)
    {
        cnt_plus++;        //開(kāi)始長(zhǎng)按延時(shí)
    }
    if (cnt_plus>=50)     //長(zhǎng)按1秒后開(kāi)始動(dòng)作
    {
        cnt_plus_time++;        //長(zhǎng)按時(shí)速度變化
        if (cnt_plus_time>10)
        {
            cnt_plus_time=0;
            if (Cont&0X10)  //長(zhǎng)按P1.3
            {
                if(pwm<=190)
                {
                    pwm=pwm+10;
                }
                else
                {
                    pwm++;
                }
                if(pwm==201)
                {
                    pwm=1;
                }
            }
            if (Cont&0X08)      //長(zhǎng)按P1.4
            {
                if(pwm>=10)
                {
                    pwm=pwm-10;
                }
                else
                {
                    pwm--;
                }
                if(pwm==0)
                {
                    pwm=200;
                }
            }
        }
    }
}
/**************************************
****************顯示函數(shù)****************
**************************************/
void display()
{
    P0=seg_table[pwm/100];
    led_1=0;
    led_2=1;
    led_3=1;
    led_4=1;
    delay1ms();
    led_1=1;
    P0=seg_table[(pwm%100-(pwm%10))/10];
    led_1=1;
    led_2=0;
    led_3=1;
    led_4=1;
    delay1ms();
    led_2=1;
    P0=seg_table[pwm%10];
    led_1=1;
    led_2=1;
    led_3=0;
    led_4=1;
    delay1ms();
    led_3=1;
    P0=0x73;
    led_1=1;
    led_2=1;
    led_3=1;
    led_4=0;
    delay1ms();
    led_4=1;
}
/**************************************
****************T0中斷溢出數(shù)計(jì)算****************
**************************************/
unsigned int get_T0_over_num(unsigned char p) //p 為頻率數(shù)
{
    unsigned int h;
    double f,*k;
    f=(double)p; //轉(zhuǎn)化為浮點(diǎn)數(shù)
    f=0.5/f; //半個(gè)周期的時(shí)間
    f=f/0.0000272; //中斷溢出數(shù)=f/0.000025;
    h=f; //取整
    if (modf(f,k)>=0.5)//四舍五入
    {
        h=h+1;
    }
    return h;
}
/* C51 有專門(mén)的庫(kù)文件MATH.H,里面有個(gè)函數(shù)
它是這樣定義的extern float modf(float x, float *ip);
調(diào)用它之后,整數(shù)部分被放入*ip, 小數(shù)部分作為返回值。
*/
/**************************************
****************主函數(shù)***************
**************************************/
void main ()
{
    InitTimer();
    pwm = 15;
    while(1)
    {
        counter_1=get_T0_over_num(pwm);
        display();
    }
}
/**************************************
****************T0中斷,用于改變方波頻率****************
**************************************/
void Timer0Interrupt(void) interrupt 1
{

    counter++;
    if(counter==counter_1)
    {
        counter = 0 ;
        pwm_out = ~pwm_out;
        out=    pwm_out;
    }
}
/**************************************
****************T1中斷,用于檢測(cè)按鍵****************
**************************************/
void tm1_isr() interrupt 3 using 1
{
    TR1=0;                 //關(guān)閉定時(shí)器T1
    Key();              //執(zhí)行鍵盤(pán)掃描
    TL1 = 0xC0;     //設(shè)置定時(shí)初值
    TH1 = 0x63;     //設(shè)置定時(shí)初值
    TR1=1;                  //啟動(dòng)定時(shí)器T1
}

方波.rar (1.96 KB, 下載次數(shù): 73)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:370303 發(fā)表于 2018-8-3 09:21 | 只看該作者
你是編程大神,51有你而精彩
回復(fù)

使用道具 舉報(bào)

板凳
ID:272158 發(fā)表于 2018-8-7 12:31 | 只看該作者
不錯(cuò),下載學(xué)習(xí)一下,可以做一個(gè)小玩具
回復(fù)

使用道具 舉報(bào)

地板
ID:757761 發(fā)表于 2020-5-21 21:28 | 只看該作者
仿真的晶振在哪里呀
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区高清视频 | 久热伊人 | 二区中文字幕 | 精品一区二区观看 | 成人h动漫精品一区二区器材 | 一区二区视频 | 国产精品视频导航 | 亚洲精品自拍 | 国内自拍视频在线观看 | 久久精品亚洲精品 | 亚洲嫩草| 久久久久久久久久久高潮一区二区 | 国产成人精品一区二区三区四区 | 五月婷婷 六月丁香 | 罗宾被扒开腿做同人网站 | 亚洲一区二区三区免费观看 | 喷水毛片 | 色小姐综合网 | a a毛片 | 色婷婷亚洲一区二区三区 | 欧美中文| 久久黄色精品视频 | 日韩av在线一区二区三区 | 久久综合av| 欧美一区二区三区视频 | 好好的日在线视频 | 精品国产成人 | 亚洲国产精品一区二区久久 | 黄色在线观看网址 | 国产精品无码专区在线观看 | 亚洲精品乱码久久久久久黑人 | 综合色在线 | 精品日韩一区二区三区av动图 | 福利一区在线观看 | 久久久久久黄 | 亚洲高清视频在线观看 | 亚洲综合成人网 | 黄色大片免费网站 | 高清av电影 | 国产蜜臀97一区二区三区 | 国产高潮好爽受不了了夜色 |