求一个单片机C语言程序 要求定时闹钟控制步进电机正反转 第一次定时正转 第二次定时反转 加分!!!

求一个单片机C语言程序 要求定时闹钟控制步进电机正反转 第一次定时正转 第二次定时反转 加分!!!,第1张

#include "reg52h"

#define uchar unsigned char 

#define uint unsigned int 

//本列4组步进电动机工作于8拍方式

//正转励磁序列为A->AB->B->BC->C->CD->D->DA

uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};

//反转励磁序列为AD->D->CD->C->BC->B->BA->A

uchar code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};

sbit k1=P3^0;  //正转

sbit k2=P3^1;  //反转

sbit k3=P3^2;  //停止

//延时

void delay(uchar ms)

{ uchar us;

 while(ms--)for(us=0;us<120;us++);

}

//正转

void SETP_MOTOR_FFW(uchar n)

{ uchar i,j;

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

 { for(j=0;j<8;j++)

  { if(k3==0)break;

   P1=FFW[j]|(P1&0xf0);

   delay(25);

  }

 }

}

//反转

void SETP_MOTOR_REV(uchar n)

{ uchar i,j;

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

 { for(j=0;j<8;j++)

  { if(k3==0)break;

   P1=REV[j]|(P1&0xf0);

   delay(25);

  }

 }

}

//主程序

void main()

{ uchar N=3; //运转圈数

 while(1)

 { if(k1==0)

  { P0=0x0e|(P0&0xf0);  //LED1点亮

   SETP_MOTOR_FFW(N);  //电动机正转 

   if(k3==0)break;

  }

  else if(k2==0)

  { P0=0x0d|(P0&0xf0);  //LED2点亮

   SETP_MOTOR_REV(N);  //电动机反转 

   if(k3==0)break;

  }

  else 

  { P0=0x0b|(P0&0xf0);  //LED3点亮

   P1=0x03|(P1&0xf0);

  }

 }

}

这个吗?

我想赚钱你可以帮我找找吗,网上兼职的

加我q1070872487

(1)用数字逻辑集成块实现;

(2)时间以24小时为一个周期,显示时、分、秒;

(3)计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;

(4)为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。

c51单片机 晶振为110592MHz

#include<reg52h>

#define HOUR1 1

#define HOUR0 0

#define MIN1 2

#define MIN0 8

#define SEC1 2

#define SEC0 0

#define uint unsigned int

#define ulint unsigned long int

#define uchar unsigned char

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

int i;

ulint

sharp,second,count=0,sec0=SEC0,sec1=SEC1,min0=MIN0,min1=MIN1,hour0=HOUR0,hour1=HOUR1;//秒计数全局变量

uchar code segment[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

uchar code time[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};

void delay(uint);//程序毫秒延时

void beeper(uchar);//开蜂鸣器毫秒

void init();//初始化函数

void display();//从数码管上显示

void counter();//计算进行过程中的时、分、秒值

void scan();//扫描键盘

void main()

{

init();

while(1)

{

scan();//扫描键盘看是否有键按下

for(i=6;i>0;i--)//动态扫描6位数码管

{

display();//显示时、分、秒

}

}

}

void init()

{

second=hour136000+hour03600+min1600+min060+sec110+sec0;

TMOD=0x01;

TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

EA=1;

ET0=1;

TR0=1;

}

void delay(uint z)//程序毫秒延时

{

uint x=0,y=0;

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

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

}

void timer0() interrupt 1

{

TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

count++;

if(count==20)//判断是否到1秒

{

counter();//计算进行过程中的时、分、秒值

if(sharp!=hour0) beeper(1000);//判断小时的值是否改变,变则启动蜂鸣器

}

}

void beeper(uchar tt)

{

uchar t=tt;

count=0;

beep=0;//开蜂鸣器

delay(t);

beep=1;//关蜂鸣器

}

void display()

{

P0=0xff;//位消影(低电平选择位)

//送位选信号

wela=1;

P0=segment[i-1];

wela=0;

P0=0x00;//段消影(高电平选择段)

//送段选信号

dula=1;

switch(i)

{

case 6 : P0=time[sec0]; break;

case 5 : P0=time[sec1]; break;

case 4 : P0=time[min0]; break;

case 3 : P0=time[min1]; break;

case 2 : P0=time[hour0]; break;

case 1 : P0=time[hour1]; break;

}

delay(1);

P0=0x00; //配合上面用于消隐

dula=0;

}

void counter()

{

second++;

if(second==86400) second=0;

count=0;

sharp=hour0;//设置报时检测KEY

sec0=second%10;

sec1=(second%60-sec0)/10;

min0=((second%3600-sec110-sec0)/60)%10;

min1=((second%3600-sec110-sec0)/60-min0)/10;

hour0=(second%36000-min1600-min060-sec110-sec0)/3600;

hour1=second/36000;

}

void scan()

{

}

#include<reg51h>

unsigned char code su[11]={0x3f,0x06,0x5b,0X4F,0x66,0X6D,0x7d,0x07,0x7f,0x6f,0x40};//数码管显示

unsigned char xian[8]={0,0,10,0,0,10,0,0};

unsigned char sen=0,min=0,hou=0,sen2=0,min2=0,hou2=0,sen3=59,min3=59,hou3=23,num;//变量定义

//--------引脚定义

sbit ks=P1^4; //秒按键

sbit km=P1^5; //分按键

sbit kh=P1^6; //时按键

sbit ds=P1^7;

sbit bb=P3^4;

//-------8个数码管位显示接口

sbit P20=P2^0;

sbit P21=P2^1;

sbit P22=P2^2;

sbit P23=P2^3;

sbit P24=P2^4;

sbit P25=P2^5;

sbit P26=P2^6;

sbit P27=P2^7;

bit jp1,jp2,jp3;//位定义

int n=0,jp4;

//----演示程序

void daly()

{

unsigned char j;

for(j=60;j;j--);//for循环

}

//------数码管显示

void show()

{

xian[0]=hou/10; //时的十位

xian[1]=hou%10; //时的个位

xian[3]=min/10; //分的十位

xian[4]=min%10; //分的个位

xian[6]=sen/10; //秒的十位

xian[7]=sen%10; //秒的个位

P0=su[xian[7]]; //八段数码管显示秒的个位

P20=0; //动态显示,打开第一个数码管

daly(); //延时

P20=1; //动态显示,关闭第一个数码管

P0=su[xian[6]];//八段数码管显示秒的十位

P21=0;//动态显示,打开第二个数码管

daly();//延时

P21=1;//动态显示,打开第二个数码管

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

P0=su[xian[5]];//注:你xian[3]xian[5]都为从定义

P22=0;

daly();

P22=1;

//-------------分个位的显示

P0=su[xian[4]];

P23=0;

daly();

P23=1;

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

P0=su[xian[3]];//注:你xian[3]xian[5]都为从定义

P24=0;

daly();

P24=1;

//------------分十位的显示

P0=su[xian[2]];

P25=0;

daly();

P25=1;

//-------------时个位的显示

P0=su[xian[1]];

P26=0;

daly();

P26=1;

//-----------时十位的显示

P0=su[xian[0]];

P27=0;

daly();

P27=1;

}

//---------按键程序

void key()

{

if((ks==0)&&(jp1==0))

{

jp1=1;//秒按键生效

daly();//消抖

if(ks==0) sen++; //秒加1

}

else if((ks==1)&&(jp1==1)) jp1=0;//秒按键未生效

if(sen==60)//等于60时

{

min++;//分加1

sen=0;//秒清零

}

if((km==0)&&(jp2==0))

{

jp2=1;//分按键生效

daly();//消抖

if(km==0) min++;//分加1

}

else if((km==1)&&(jp2==1)) jp2=0;//分按键未生效

if(min==60)//等于60时

{

hou++;//时加1

min=0;//分清零

}

if((kh==0)&&(jp3==0))

{

jp3=1;//时按键生效

daly(); //消抖

if(kh==0) hou++;//时加1

}

else if((kh==1)&&(jp3==1)) jp3=0;//时按键未生效

if(hou==24) hou=0;//时为24时,清零

if(ds==0)//定时 *** 作

{

daly();//消抖

while(ds==0);

daly();

if(ds==1) jp4++;//定时按键生效,加一

if(jp4>1) jp4=0;//JP4只能是一。

/注:就本人感觉而言这两句就是废话,一句就能完事:if(ds==1) jp4=1;/

}

}

//-------从功能上看这是定时

dings()

{

EA=0; //关闭中断

TR0=0;//T0停止计数

hou2=hou;//把现有的时分秒,保留储存在hou2,min2,sen2

min2=min;

sen2=sen;

hou=0; //清零

min=0;

sen=0;

while(jp4==1) //等待直到按键生效

{

hou3=hou; //把现有的时分秒,保留储存在hou3,min3,sen3

min3=min;

sen3=sen;

show(); //现实

key();//按键扫描

hou3=hou;//把按键后更改的时分秒,也就是定时时间,保留储存在hou3,min3,sen3

min3=min;

sen3=sen;

}

hou=hou2;//把远有的时间分别还原

min=min2;

sen=sen2;

EA=1;//开中断

TR0=1;//T0计数

}

void main()

{

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

TH0=45535>>8;//赋初值

TL0=45535;

EA=1; //允许中断

ET0=1;//T0中断使能

EX1=1;//外部中断1

TR0=1;//T0开始计数

hou3=99;

min3=99;

sen3=99;

while(1)

{

show();//显示

key();//按键程序

dings();//定时 *** 作

if(((hou60+min))60+sen>=((hou360+min3))60+sen3 )//判断是否到了定时时间

{

bb=0;//蜂鸣器鸣叫(也可能是其他音乐芯片)

num++;

if(num>=500) //鸣叫延时

{

bb=1; //蜂鸣器关闭

num=0; //延时计数清零

jp4=0;//位清零

hou3=99;//重新赋值

min3=99;

sen3=99;

}

}

}

}

void_time0_(void)interrupt 1

{

TL0=45535; //定时器0重新赋值

TH0=45535>>8;

if(++n==50) //1秒

{

n=0;

sen++; //秒加1

if(sen==60) //加到60

{

min++;

sen=0;

}//分加1

if(min==60)//加到60

{

hou++;

min=0;

}//时加1

if(hou==24) hou=0;//24时,时变成0

}

}

说实话,这个程序编写的很烂。

C语言时间计数从1970-1-1始。

time()

函数返回

time_t

就是这个计数。

你若会

2011年01月10日10点钟

time_t

后面

它作时间

比较

就很简单。

设一个时间标志

flag=0,

当时间等于

2011年01月10日10点钟

flag=1。

如果

关掉按键

按了,则

flag=0

flag==1

beep,

否则

不响。

==============================

time_t

rawtime;

struct

tm

target_time;

time_t

t_end,t_now;

/

get

current

timeinfo

and

modify

it

to

the

user's

choice

/

time

(

&rawtime

);

target_time

=

localtime

(

&rawtime

);

//

time_t

to

tm

//

time

struc

and

to

time_t

target_time->tm_year

=

2011

-

1900;

target_time->tm_mon=

1

-

1;

//

month

-

1

target_time->tm_mday

=

10

;

//

day

target_time->tm_hour

=

10

;

//

hour

target_time->tm_min

=

1

;

target_time->tm_sec

=

1

;

t_end

=

mktime

(target_time);

//

t_end

就是

2011年01月10日10点

时间计数

t_now

=

time(NULL);

//

现在时间计数

=============

若用条件语句:

if

(年

>

2011)

goto

Lab;

if

(

(年

==

2011)

&&

(月>

1))

goto

Lab;

if

(

(年

==

2011)

&&

(月==

1)

&&

(日

>10))

goto

Lab;

if

((年

==

2011)

&&

(月==

1)

&&

(日

==

10)

&&

(时

>

10))

goto

Lab;

继续计时

Lab:;

以上就是关于求一个单片机C语言程序 要求定时闹钟控制步进电机正反转 第一次定时正转 第二次定时反转 加分!!!全部的内容,包括:求一个单片机C语言程序 要求定时闹钟控制步进电机正反转 第一次定时正转 第二次定时反转 加分!!!、求用单片机c语言做一个电子时钟,实现调时、显示、整点报时等功能。、求单片机 数字钟 c语言代码注释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10070204.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存