AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊

AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊,第1张

display(second)子函数与两个数码管的连接方式有关

void main(void )//主程序

{

TMOD=0x01;// 定时器1工作方式一

ET0=1;

EA=1;

TH0=(65536-10000)/256;//定时10ms

TL0=(65536-10000)%256;

TR0=0;//上电先不启动

while(1)

{

if(key1==0)//判断按键是否按下

{

Delay1ms(10);//延时消抖

if(key1==0)

{

while(key1==0);//等待按键抬起

TR0=!TR0;//启动或停止

}

}

if(key2==0&&TR0==0)//判断按键是否按下及是否在走时

{

Delay1ms(10);//延时消抖

if(key2==0)

{

while(key2==0);//等待按键抬起

a=0; second=0;

}

}

display(second);

}

}

//中断子程序

void Timer0(void) interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

a++;

if(a==100 ) second++;

if(second==60) second=0;

}

//12MHz

#include <reg51h>

void InitTimer0(void)

{

TMOD = 0x01;

TH0 = 0x0B1;

TL0 = 0x0E0;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void delay(void) //误差 0us 延时1ms 此处可以修改高电平周期

//修改此处的延时可以更改舵机转的角度 ,45度具体是多少 你可以试试

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

void main(void)

{

InitTimer0();

P1_2=0;

while(1);

}

void Timer0Interrupt(void) interrupt 1

{

//20ms中断

TH0 = 0x0B1;

TL0 = 0x0E0;

P1_2=1;

delay();

P1_2=0;

}

//--------------------------------------------------

//名称:LED模拟交通灯

//作者:彭伟《单片机C语言程序设计实训100例-基于8051+PROTEUS仿真》

//--------------------------------------------------

//说明:东西向绿灯亮若干秒后,黄灯闪烁,闪烁5次后亮红灯

// 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁

// 闪烁5次后亮红灯,东西向绿灯亮,如此重复

//---------------------------------------------------

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0;//东西向指示灯

sbit YELLOW_A=P0^1;

sbit GREEN_A=P0^2;

sbit RED_B=P0^3;//南北向指示灯

sbit YELLOW_B=P0^4;

sbit GREEN_B=P0^5;

uchar Flash_count=0;Operation_type=1;//闪烁次数及 *** 作类型变量

//-----------------------------------------------------

//延时

//----------------------------------------------------

void DelayMS(uint x)

{

uchar i;

while(x--)for(i=0;i<120;i++)

}

//---------------------------------------------------

//交通灯切换子程序

//---------------------------------------------------

void Traffic_light()

{

switch(Operation_type)

{

case 1://东西向绿灯南北向红灯亮

RED_A=1;YELLOW_A=1;GREEN_A=0;

RED_B=0;YELLOW_B=1;GREEN_B=1;

DelayMS(2000);

Operation_type=2;

break;

case 2://东西向黄灯闪烁,绿灯关闭

DelayMS(300);

GREEN_A=1;

YELLOW_A=~YELLOW_A;

//闪烁5次

if (++Flash_count!=10) return;

Flash_count=0;

Operation_type=3;

break;

case 3://南北向绿灯东西向红灯亮

RED_A=0;YELLOW_A=1;GREEN_A=1;

RED_B=1;YELLOW_B=1;GREEN_B=0;

DelayMS(2000);

Operation_type=4;

break;

case 4://南北向黄灯闪烁,绿灯关闭

DelayMS(300);

GREEN_B=1;

YELLOW_B=~YELLOW_B;

//闪烁5次

if (++Flash_count!=10) return;

Flash_count=0;

Operation_type=1;

}

}

void main()

{

while(1) Traffic_light();

}

#include<AT89X51h>

#define uchar unsigned char

#define uint unsigned int //宏定义

sbit key1=P1^0; //位定义,定义按键为P10

uchar num; //变量num

uchar tt;

uchar code table[]=

{0x3f,0x06,0x5b,0x4f,<br>0x66,0x6d,0x7d,0x07,<br>0x7f,0x6f}; //数码管段的显示数组,0~9/延时子函数/

void delay(uint z)

{

uint x,y;

for(x=110;x>0;x--)

for(y=z;y>0;y--);

}/中断/

void timer0() interrupt 1

{

TH0=-50000/256;

TL0=-50000%256;

tt++;

if(key1==0) //按键按下

{

delay(5); //延时,目的是消除抖动

//(软件中感觉不来,硬件中不加这句的话,有点闪,不稳定)

if(key1==0) //按键按下,即P1_0=0

{

if(tt>=1)

{

num++; //变量num自加

if(num==10) //num=10(上面table中只有10个元素)

//显示到9时(注意:元素从0开始计数的)

num=0; //num=0,又开始显示0

while(!key1); //等待按键松开

delay(5); //消除抖动

while(!key1); //等待按键松开

}

}

}

}/初始化/

void init()

{

TMOD=0x01;//设置定时器0为工作方式1

TH0=-50000/256;//定时器0初始化

TL0=-50000%256;

EA=1;//开总中断

ET0=1;//开定时器0中断

TR0=1;//启动定时器0

tt=0;

num=0;

}/主函数/

void main()

{

init();

while(1) // 死循环

{

P2=table[num];//数码管段选端口,P2口,即a~g接P2口

P3=0xfd; //数码管位选,P3^1置低电平,对应的数码管点亮

}

} //程序结束

几相的步进电机啊?用不用驱动芯片?用的话选什么型号的驱动芯片?你要说具体点啊!

先给你三相的,个不用驱动芯片的步进电机程序。(驱动电路自己做)

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

uint time

void timer1(void) interrupt 1 using 1{ //定时器0中断,定时1ms//

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

time++;

}

void delay(uint n){ //一般延时

while(--n);

}

void delay(uint dtime){ //延时

TR0=1;

while(time<=dtime);

time=0;

TR0=0;

}

void moto(bit cf,uchar n,uint dtime){ //电机驱动子程序,

uchar idata zhpai[4]={0x78,0xb8,0xd8,0xe8};

uchar idata fpai[4]={0xe8,0xd8,0xb8,0x78};

uchar i,l=0;

if(cf==0) //正转,A-B-C-A

for(i=0;i<n;i++){

P1=zhpai[l];//P17~14为输出口,分别为A、B、C、D

l++;

delay(dtime);

if(l==4)l=0;

}

else{ //反转,C-B-A-C

for(i=0;i<n;i++){

P1=fpai[l];

l++;

delay(dtime);

if(l==4)l=0;

}

}

}

void main(){

TMOD=0x01;

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

EA=1;

ET0=1;

while(1){

moto(0,4,70);//正转,转四相,每相间隔70ms

delay(10000);

moto(1,4,70);//反转,转四相,每相间隔70ms

delay(10000);

}

}

以上就是关于AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊全部的内容,包括:AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊、单片机控制舵机程序、单片机的红绿灯控制程序如何写啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存