51单片机C程序
正确的表达式应该是:P0=number[a[0]];
这应该是从P0口输出数码管显示的段码数组,而number[ i ]是个数组即为段码表,而a[ i ] 也是一个数组,是与数码管相对应的缓冲区,而a[0]是保存第一个数码管显示的数据,例如a[0]=2; 意思是第一个数码管要显示2,把2代入段码表为number[2]; 得到2的段码,从P0口输出,即可实现第一个数码管显示2了。
这个很简单,可以利用单片机的定时器来完成
当有脉冲输入的时候,启动定时器,并对定时器的计数值进行清零
每一次脉冲输入都清零计数值,当脉冲消失后,定时器的计数值达到指定时间则关闭
关闭的同时,调用其它函数,例如你的继电器控制
需要说明的是,我使用的开发板和你的不见得一样,所以端口的使用只能你自己修改了
但程序已经经过硬件测试成功,请放心使用,如果满意记得采纳哦
/***************************************************************************/
#include //51单片机通用头文件
sbit P24=P1^0; sbit P25=P1^1; sbit P26=P1^2; sbit P27=P1^3;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
sbit k=P3^7; sbit KK=P1^4;//定义按键和继电器端口
int t,n,s,fe=0;
/***************************************************************************/
void YS(int hs){int hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}//延时函数
/***************************************************************************/
void XS(int xs)//数码管显示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P27=0; YS(5); P27=1;
P0=table[d2]; P26=0; YS(5); P26=1;
P0=table[d3]; P25=0; YS(5); P25=1;
P0=table[d4]; P24=0; YS(5); P24=1;
}
/***************************************************************************/
void main(void)//主函数
{
TMOD=0x01; EA=1; ET0=1; KK=0;//定时器初始化
TH0=(65536-921)/256; TL0=(65536-921)%256;//定时器初值
while(1)
{
XS(t);//调用数码管显示函数
if(k==0)//如果按键被按下
{
YS(10);//延时去抖动
if(k==0)//如果是有效按键
{
TR0=1;//启动定时器,开始计时
n=0;//每次按键都清空定时计数
t++;//按键值累加一次
KK=1;//继电器打开
while(!k){XS(t);}//等待按键松开,并调用数码管显示,避免黑屏
}
}
if(fe==1)//如果没按键输入
{
fe=0;t=0;//清空按键计数值,并设置标识符
KK=0;//继电器吸合
}
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;//n等于100时,则为1秒
if(n>1000){TR0=0;n=0;fe=1;}//如果达到指定时间,则关闭定时器,并设置标识符
}
/***************************************************************************/
sfr P0M0 = 0X94; // 在编译过程中会把 POM1之类的东西变成这些地址
sfr P1M1 = 0X91; //mcu在运行中也是对这些地址操作的
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
uchar CONT_1; //定义一个常量 作为计数器 使用,类型无符号整形数
P0M1 = 0; //将io口设置为推挽输出
P1M1 = 0; // 下面这些事定义了这些寄存器的初始值
P2M1 = 0; //以免第一次使用这些寄存器时出错
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
前面几个sfr都是定义寄存器的地址,然后定义一个计数器CONT_1,接下来的就是给刚才定义的寄存器赋初值了。
都他强了,我菜鸟一个,来学习下
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
这一段是对通用IO的设置寄存器定义为好记的变量名。具体是什么寄存器你就得结合手册查一下,估计是设置IO口方向、内部上来电阻之类的,或者是配置给某些内部器件如PCA计数器、定时器、计数器等。
至于下面的应该是电磁波或者超声测距之类的算法!!
看起来不是很复杂。
你要是抄板子的话就得想办法知道原来用的什么MCU!再找到它的手册!
有兴趣的话可以研究一下!
linfeighaot@sina.com
答:include <AT89X51.H>//单片机51头文件,存放着单片机的寄存器 unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容 sbit gewei=P2^2; //个位选通定义 sbit shiwei=P2^3; //十位选通定义 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07...
答:这个可以用定时器来做,比如检查某键,按键时间超过2秒后一个变量开始累加知道键释放为止。实现方法如下:include<reg51.h> define uint unsigned int define uchar unsigned char uint v=0,time=0;sbit key=P1^0;void t0isr() interrupt 1 { TH0=(65536-50000)/256;TL0=(65536-50000)%256;ti...
答:ET0=0;//5ms结束,禁止T0中断 TR0=0;//停止T0计时 Flag_Delay5ms=1;//重新将 延时5ms 标志位 置为 1,为下次延时做准备 } 该程序不合理的地方,在等待、及 禁止 T0中断时,停止T0计时前,T0依然在计时,换句话说,下次再启动的初值,已经不是原来设置好的初值了。所以延时误差依然存在。
答://主程序 int main (void){ int i;sinti(); //串口初始化程序 ring=1;while(1){ while (1){ if(CASE1==0){ send('a');ring=0;break;} if(CASE2==0){ send('b');ring=0;break;} if(CASE3==0){ send('c');ring=0;break;} if(CASE4==0){ send('d');ring=0...
答:另外,建议你对于按键扫描程序使用switch case 语句,这样条理更清晰。/*按键获取程序*/ unsigned int Key(){ uchar keyvalue;keyvalue=P3;keyvalue|=0xc3;if((keyvalue|0xc3)==0xff){ Delay(10);if((keyvalue|0xc3)==0xff){ return(0);} } else { Delay(10);if((keyvalue|0xc3)!=...
答:1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。例程:include<reg51.h> //51单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit beep=P2^3;void delay(uint z) //延时函数,z...
答:include <reg52.h> / 本程序功能,输出方波,频率1-25ms 单片机@12MHz /12T / sbit Pulse=P1^1; //---方波 sbit Add=P3^2; //---频率加 sbit Dec=P3^3; //---频率减 sbit Start = P1^3; //---开关键 sbit Display_Ten_Bit = P2^0;sbit Display_Bit_Bit = P2^1;code ...
答:include <reg51.h> //调用头文件reg51.hvoid main() //主函数{unsigned char // 无符号字符型tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//定义一个数组 LED数码管译码用的码表while(1) //主循环{P2=P2|0x07; // P2口...
答:中断控制程序:include <AT89X52.H> define uchar unsigned char define uint unsigned int define port_count P2 //P2接8LED接口 //将计数器的二进制值用8个LED显示出来 uchar count;//计数器(存储中断次数)void main(void){ count=0; //清零计数器 port_count=~count;//清零P2口 IT0=...
答:|P1口接8个发光二极管共阳 include <AT89X51.H> unsigned char i;unsigned char temp;unsigned char a,b;void delay(void){ unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);} void main(void){ while(1){ temp=0xfe;P1=temp;delay();for(...