A. 如何用单片机做一个简单的倒计时器
我已经完成了,下面是电路图和实际效果,你也试试,程序已经调试完成了!!!是使用秒表程序改编完成的,喜欢的话,点一个赞吧!希望能帮到你!!!
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//显示0~F的值
u8 ssec=100,sec=60,min=04;
u8 DisplayData[8];
sbit beep=P1^5;
unsigned long counter=0;
unsigned int c=0;
sbit p15=P1^5;
bit p;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init()
{
TMOD=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0Xd8; //给定时器赋初值,定时10ms
TL0=0Xf0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器 -->启动定时器中断!
ET1=1;
TR1=1;
TH1=(65536-250)/256; //FC
TL1=(65536-250)%256;
}
/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=DisplayData[i];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐-->撤销选中;
}
}
void datapros()
{
DisplayData[0]=smgan[ssec%10];
DisplayData[1]=smgan[ssec/10];
DisplayData[2]=0x40;
DisplayData[3]=smgan[sec%10];
DisplayData[4]=smgan[sec/10];
DisplayData[5]=0x40;
DisplayData[6]=smgan[min%10];
DisplayData[7]=smgan[min/10];
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
Timer0Init(); //定时器0初始化
while(1)
{
datapros();
DigDisplay();
}
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器0中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
TH0=0Xd8; //给定时器赋初值,定时10ms
TL0=0Xf0;
ssec--;
if(ssec==00) //1s
{
ssec=100;
sec--;
if(sec==00)
{
sec=60;
min--;
if(min==-1)
{
P1=1;
ssec=0;sec=0;min=0;
TR0=0;
}
}
}
}
void Timer1() interrupt 3
{
TH1=(65536-250)/256; //FC
TL1=(65536-250)%256;
if(p!=1) p15=~p15;
if(p==1) p15=0;
c++;
if(c==250)
{
//c=0;
p=~p;
}
if(c>=250&&1695);
if(c==1696) c=0;
}
B. 谁有单片机的学习板
我有旧的 是我自己用的 +Q,Q:6,4,1,8,2,9,5,1,4 图片C. 用单片机实现P1.5=ACC.2与P2.7或ACC.1与P2.0
不明白想要说 的什么意思,位之间可以直接这样的运算啊,类似:sbit P15=P1^5;sbit P27=P2^7;sbit P20=P2^0; sbit A2=ACC^2;sbit A1=ACC^1; 然后:P15=(A2&P27)|(A1&P20);讨论进Q群127858558
D. 初学单片机,编程不太熟悉,51单片机根据开关状态输出高低电平,有逻辑判断,请教编程思路,用C语言!
编程思路:每次都是将P1口的值读取进来,再屏蔽低4位,仅对高4位进行判断
{
#define INPUTMASK 0xF0
char ReadPort = 0;
ReadPort = P1 & INPUTMASK;
switch(ReadPort)
{
case 0xf0: break; /* 没有任何按键按下,跳出 */
case 0x10: Subfunction1();break; /* P1.4按下,跳转到子函数1 */
case 0x20: Subfunction2();break; /* P1.5按下,跳转到子函数2 */
case 0x40: Subfunction3();break; /* P1.6按下,跳转到子函数3 */
case 0x80: Subfunction4();braak; /* P1.7按下,跳转到子函数4 */
default:
Subfunction5();braak; /* 任意2个或以上按键按下,跳转到子函数5 */
}
}
在switch case函数中采用模块块编程,这里的子函数,即在相应的按键状态下其它端口的状态实现,不再赘述。
E. 51单片机步进电机正反转程序
单片机控制步进电机,我想你说的是两相步进电机,一般是控制其相序分配的顺逆从而控制正反转,一般而言,步进电机相序分配你可以做成一个数组比如step[]={0x03,0x06,0x0c,0x09},这样来说可以假设P0口是步进电机控制口,那么可以按如下方式来控制: while(1) { for(i=0;i<4;i++) { if(fx==1)P0=step[i]; //正向 else P0=step[3-i]; //反向 delay(x); //x大小决定电机速度。
根据电机相数买个驱动器。然后用单片机产生脉冲来控制电机的转动以及正反转。单片机产生脉冲的方法和单片机控制流水灯是一样的。ULN2003D 是驱动步进电机的驱动芯片,主要是匹配电机所需的电流。 由于是四相电机,步进电机之所以可以转动就需要给相绕组提供连续的脉冲,所以需要4个端口来控制四相绕组的工作状态(P15应该是不需要的),具体的编码要看电机的拍数; 一旦明白这些,你就可以很容易编写代码来控制电机的转动了,还有在脉冲间你可以设置不同的延时时间来调节电机的转速。
F. 为什么isp要连接在单片机p15 p16 p17这三个脚呢其他port口不可以吗。详细点吧谢谢
这个是单片机的设计者定的,---没有为什么
接在p15 p16 p17是AT系列51单片机
STC系列的是接在P3.0 P3.1
G. 帮解释一下这个单片机的程序
#include <reg52.h> //包含51单片机头文件
//共阳极数码管0-9数组编码
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管位选数组编码,这里有8位数码管(既8个数码管)
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//下面是变量申明
unsigned char mode=0;
unsigned int temp;
float dianya;
unsigned int dianya1;
//下面是51单片机端口位申明
sbit START=P1^5;
sbit EOC=P1^6;
sbit OE=P1^7;
sbit a=P1^0;
sbit b=P1^1;
sbit c=P1^2;
sbit key=P1^3;
//一个延时函数
void delay(unsigned int z)
{
while(z--);
}
//按键扫描函数
void key_scan()
{
if(key==0) //当key按下时,key既端口P1^3
{
delay(10); //延时
if(key==0) //在检测端口P1^3是否为低
{
/********************************************
到这里你发现你程序有问题
********************************************/
}
}
switch (mode) //这里也有问题,如果mode只为0,变量a b c清0,可以用if语句
{
case 0 : a=0;b=0;c=0;break;
}
}
void main() //主函数
{
unsigned char aa[4],i;
while(1)
{
key_scan();
P2=wei[0]; // 选中第一个数码管
P0=seg[mode]; //第一个数码管显示存在变量mode里的数
/*******************************************
下面部分应该为从AD检测一个电压
*******************************************/
START=1; //P1^5 置1
delay(10); //延时
START=0; //P1^5 置0
while(EOC==0); //如果P1^6为0,一直循环等待
OE=1; //P1^7置1
temp=P3; //把P3端口上8位数赋值给变量temp
dianya=(5.0/255)*temp; //8位AD值转换成电压显示值
dianya1=dianya*10;
aa[2]=dianya1/10; //把转换后的值除10
aa[3]=dianya1%10; //把转换后的值求模
for(i=2;i<4;i++)
{
P2=wei[i]; //数码管2,3分别位选
if(i==2)
P0=seg[aa[i]]&0x7f; //显示转换后的电压值aa[2]并加上点 (除10的值)
else P0=seg[aa[i]]; //显标转换后的电压值aa[3](求模值)
delay(1);
}
}
}
H. STC单片机的I/O口控制继电器的问题
我想问下断开之后还能吸和再断开吗?或者就永远断开 ?
而且你的中断程序里没有清零中断标志位,这样就停留在中断里了
I. 请帮忙一个单片机中断应用编程
50hz方波周期是20毫秒,5Hz方波周期是200毫秒。晶振11.0592M10毫秒定时初值为65536-9216.程序为:
#include<reg51.h>
#define uchar unsigned char
uchar cnt=0;
sbit p15=P1^5;
sbit p17=P1^7;
void d0isr() interrupt 1
{
TH0=(65536-9216)/256;
TL0=(65536-9216)%256;
cnt++;
if( cnt%2 ==0 )p15=~p15;
if(cnt%10 ==0)p17=~p17;
cnt%=100;
}
main()
{
TMOD=0x01;
TH0=(65536-9216)/256;
TL0=(65536-9216)%256;
TR0=1;
ET0=1;
EA=1;
while(1);
}