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秒表的程序要怎么编啊、单片机控制舵机程序、单片机的红绿灯控制程序如何写啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)