求个51单片机程序

求个51单片机程序,第1张

你这图正是PWM控制灯的亮暗!!!我有一个可以借鉴一下:

//

// 利用定时器控制产生占空比可变的 PWM 波

// 按K5,PWM值增加,则占空比减小,LED 灯渐暗。

// 按K6,PWM值减小,则占空比增加,LED 灯渐亮。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

//

#include < reg51h >

#include < intrinsh >

sbit K5 =P3^2 ; //增加键

sbit K6 =P3^3 ; //减少键

sbit BEEP =P3^7 ; //蜂鸣器

unsigned char PWM=0x7f ; //赋初值

void Beep();

void delayms(unsigned char ms);

//

void main()

{

P2=0xff;

TMOD=0x21 ;

TH0=0xfc ; //1ms延时常数 12M

TL0=0x18 ; //频率调节

// TH1=PWM ; //脉宽调节

// TL1=0 ;

EA=1;

ET0=1;

ET1=1;

TR0=1 ;

while(1)

{

do{

if(PWM!=0xff)

{PWM++ ;delayms(10);}

else Beep() ;

}

while(K5==0);

do{

if(PWM!=0x00)

{PWM-- ;delayms(10);}

else Beep() ;

}

while(K6==0);

}

}

//

// 定时器0中断服务程序

//

void timer0() interrupt 1

{

// TR1=0 ;

TH0=0xfc ;

TL0=0x66 ;

TR1=1 ;

P2=0x00 ; //启动输出

}

//

// 定时器1中断服务程序

//

void timer1() interrupt 3

{

TH1=PWM ; //用定时器的方式2,是数据重装TH-TL中,改变PWM的值即该变定时器的初值

TR1=0 ;

P2=0xff ; //结束输出

}

//

//蜂鸣器子程序

//

void Beep()

{

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delayms(2) ;

BEEP=!BEEP ; //Beep取反

}

BEEP=1 ; //关闭蜂鸣器

delayms(100);

}

//

// 延时子程序

//

void delayms(unsigned char ms)

{

unsigned char i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

//

你想让输出口是P1^7,我这用的是P2口为输出,将其变化一下即可,希望对你有用!!!!!!!

以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)。

/ 本程序中,晶振为12MHz, /

/ 时间控制采用定时中断控制方式。 /

/ 模式和时间调整采用查询方式。 /

#include<reg52h>

sbit P20=P2^0; //分个位控制端

sbit P21=P2^1; //分十位控制端

sbit P22=P2^2; //时个位控制端

sbit P23=P2^3; //时十位控制端

sbit led=P2^7; //second display led

sbit key0=P3^0; //模式设置

sbit key1=P3^1; //加

sbit key2=P3^2; //减

unsigned char hour,min,sec,T50ms;

unsigned char modstate; //模式状态

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码

void init(); //初始化子程序声明

void delay500us(unsigned char X); //延时子程序声明

void display(); //显示子程序声明

void display001(); //显示子程序声明

void display002(); //显示子程序声明

void keyscan(); //按键识别子程序声明

void main()

{

init();

while(1)

{

keyscan();

}

}

void init() //初始化子程序

{

TMOD=0x01;

TH0=(65536-49990)/256;

TL0=(65536-49990)%256;

ET0=1;

EA=1;

TR0=1;

}

void delay500us(unsigned char X)

{

unsigned char i,j;

for(i=X;i>0;i--)

for(j=248;j>0;j--);

}

void timer0() interrupt 1 //timer0中断服务子程序,定时时间为50ms,本程序加了10us的时间修正量

{

TMOD=0x01;

TH0=(65536-49990)/256;

TL0=(65536-49990)%256;

T50ms++;

if(T50ms>=20)

{

T50ms=0;

sec++;

if(sec>=60)

{

sec=0;

min++;

if(min>=60)

{

min=0;

hour++;

if(hour>=24)hour=0;

}

}

}

}

void display()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour/10];

P23=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour%10];

P22=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min/10];

P21=0;

delay500us(5);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min%10];

P20=0;

delay500us(5);

if(T50ms<=10)led=0;

if(T50ms>10)led=1;

}

void display001()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour/10];

P23=0;

delay500us(10);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[hour%10];

P22=0;

delay500us(10);

}

void display002()

{

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min/10];

P21=0;

delay500us(10);

P20=1;

P21=1;

P22=1;

P23=1;

P0=table[min%10];

P20=0;

delay500us(10);

}

void keyscan() //按键识别钟程序

{

while(modstate==0)

{

display();

if(key0==0)

{

display();

if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display001(); //等待按键释放。

}

}

////

while(modstate==1)

{

display001();

if(key0==0)

{

display001();

if(key0==0)modstate++; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display002(); //等待按键释放。

}

if(key1==0)

{

display001();

if(key1==0)

{

hour++;

if(hour>=24)hour=0;

while(key1==0)display001();

}

}

if(key2==0)

{

display001();

if(key2==0)

{

hour--;

if(hour>=24)hour=0;

while(key2==0)display001();

}

}

}

////

while(modstate==2)

{

display002();

if(key0==0)

{

display002();

if(key0==0)modstate=0; //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display(); //等待按键释放。

}

if(key1==0)

{

display002();

if(key1==0)

{

min++;

if(min>=60)min=0;

while(key1==0)display002();

}

}

if(key2==0)

{

display002();

if(key2==0)

{

min--;

if(min>=60)min=0;

while(key2==0)display002();

}

}

}

}

程序如下,仿真见附件。有问题请追问。

#include <AT89X51h>

#define uchar unsigned char

#define uint unsigned int

bit flag_1s=0;

uchar code tab[8]={1,2,4,8,16,32,64,128};//[第1小题用这个表]

//uchar code tab[8]={0x05,0,0x50,0xa0,0xaa,0x55,0xff,0x00};//[第2小题用这个表]

void InitTimer1(void)

{

    TMOD = 0x10;

    TH1 = 0x3C;

    TL1 = 0x0B0;

    EA = 1;

    ET1 = 1;

    TR1 = 1;

}

void main(void)

{

    static uchar j;

    InitTimer1();

P0=0;

P1=0;

P2=0;

P3=0;

flag_1s=1;

while(1)

{

if(flag_1s==1)

{

flag_1s=0;

P2=tab[j];

j++;

if(j>=8) j=0;

}

}

}

void Timer1Interrupt(void) interrupt 3

{

    static uchar i;

    TH1 = 0x3C;

    TL1 = 0x0B0;

    //add your code here!

    i++;

    if(i>=20)//50ms20=1000ms

    {

    i=0;

    flag_1s=1;

    }

}

以上就是关于求个51单片机程序全部的内容,包括:求个51单片机程序、51单片机求这个时钟的c语言程序、51单片机流水灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9272123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存