
#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语言代码注释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)