⑴ 51单片机,帮忙写个c语言程序
//好像是这个头文件 好久没玩51了
#include <reg51.h>
//------------宏定义---------------//
#define uchar unsigned char
#define uint unsigned int
#define BUTTON1 1 //按键1
#define BUTTON2 2 //按键2
//-----------变量-----------//
uchar Counter = 0; //统计按键次数
/*-------管脚定义 --------//
记得是sbit P13 = P1^3;
忘了,你自己定义吧,我直接写程序
*/
//-------------延时---------------//
void Delay(uchar x)
{
uchar i,j;
for(i = 0; i++; i < x)
for(j = 0; j++; j < 200)
}
//------------按键扫描------------//
uchar ButtonScan (void)
{
uchar ButtonNum = 0;
if(P13 == 0)
{
/*延时防止按键抖动,如果你的晶振是12M的话,
如果是其他的你只要让延时在30ms就可以了*/
Delay(150);
if(P13 == 0)
while(!P13); /*等待按键松开*/
ButtonNum = BUTTON1;
}
if(P14 == 0)
{
Delay(150);
if(P14 == 0)
while(!P14); /*等待按键松开*/
ButtonNum = BUTTON2;
}
return ButtonNum;
}
//----------按键判断-------------//
void ButtonJugde (void)
{
switch(ButtonScan())
{
case 1: //增加
if (Counter != 40)
Counter++;
break;
case 2: //减小
if (Counter != 0)
Counter--;
break;
default: break;
}
}
//---------LED点亮处理--------//
uchar LED (void)
{
/*我这里把你所说的“一号灯”理解为P2.0所对应的二极管,
“二号灯”理解为P2.1所对应的二极管。。。一次类推
根据你的实际电路情况调整*/
uchar LedEnable;
if((Counter > 0) && (Counter <= 5))
{
/*我理解你的二极管是接地的,然后高电平点亮
根据你的实际电路情况调整*/
LedEnable = 0x01;
}
if((Counter > 5) && (Counter <= 10))
{
LedEnable = 0x03;
}
if((Counter > 10) && (Counter <= 15))
{
LedEnable = 0x07;
}
if((Counter > 15) && (Counter <= 20))
{
LedEnable = 0x0f;
}
if((Counter > 20) && (Counter <= 25))
{
LedEnable = 0x01f;
}
if((Counter > 25) && (Counter <= 30))
{
LedEnable = 0x3f;
}
if((Counter > 30) && (Counter <= 35))
{
LedEnable = 0x7f;
}
if((Counter > 35) && (Counter <= 40))
{
LedEnable = 0xff;
}
return LedEnable;
}
//--------------主函数------------------//
void main(void)
{
while(1)
{
ButtonJugde (); //按键扫描
P2 = LED(); //点亮二极管
}
}
免责声明:
以上程序为本人(chen bolin)所写,但是未通过本人验证。
任何人可以使用或修改本代码,包括商业用途。本人不承担任何责任。
具体请遵守GPL协议。
我没有编译,你自己编译看看吧,别忘了把管脚定义补全了。应该可以实现的。如果有什么不明白的可以到我的主页留言。
⑵ 求51单片机C语言编程
不能直接定时400ms,可定时50ms,采用中断方式,中断8次就是400ms。先计算出定时初始值,X=65536-50000=3CB0H。程序如下
#include<reg51.h>
sbit led=P2^0; //LED灯在P2.0上,0点亮
unsigned char t1n;//对定时50ms中断计数8次为400ms
void main()
{
TMOD=0x10;
TH1 =0x3C;//晶振频率=12M,定时50ms
TL1 =0xB0;
EA =1;//开中断
ET1 =1;
TR1 =1;
led =0;
while(1);
}
void T1_time() interrupt 3
{
TH1 =0x3C;
TL1 =0xB0;
t1n++;
if(t1n>=8)
{
t1n=0;
led=!led;//状态翻转
}
}
⑶ 51单片机C语言编程,简易计算器,复位键如何编程会简单些要求能随时返回主程序开头。。
提供个思路
void (*RecallBp)(void);
main()
{
保存堆栈指针
clear:
RecallBp=(void*) &clear;
恢复堆栈指针
初始化
........
}
需要返回时
调用 RecallBp();
⑷ 51单片机C语言编程
#include<AT89X51.H>
//设CPU是时钟12MHz的8051系列
dataunsignedintms;
sbitKEY=P2^3;
voidSetupTimer0()
{
TMOD&=0XF0;//仅保留T1信息
TMOD|=0X02;//设置T0:定时功能,方式2,自动重载8位定时器/计数器
TH0=256-250;//定时每0.25ms中断一次
TL0=256-250;
TR0=1;//开启定时器
ET0=1;//定时器0中断打开
}
voidTimer0_ISR()interrupt1//中断服务程序
{
staticdataunsignedcharus250;
if(++us250>=4){++ms;us250=0;}
}
voidprocess1()
{
unsignedchari,d;
unsignedinttime,dlt;
//第一步8灯整体一直闪(闪10下)。
for(i=0;i<10;++i)
{
P1=0;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
P1=0xFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
}
//第二步整体灭5秒。
P1=0xff;
for(time=ms,dlt=0;dlt<5000;dlt=ms-time);
//第三步从右边逐个点亮并循环4遍。
for(i=0;i<4;++i)
for(d=1;d;d<<=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);
//第4步循环完毕后全部熄灭;
P1=0xff;
}
voidprocess2()
{
unsignedchari,d;
unsignedinttime,dlt;
//第一步8灯整体闪3次。
for(i=0;i<3;++i)
{
P1=0;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
P1=0xFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
}
//第二步从左边逐个点亮并循环2遍。
for(i=0;i<2;++i)
for(d=0x80;d;d>>=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);
//第三步循环完毕后8灯一直流水;
for(;KEY;)
for(d=1;d&&KEY;d<<=1)
for(P1=d,time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
}
voidprocess3()
{
unsignedchari,j,d;
unsignedinttime,dlt;
//第一步8灯整体保持全灭,灭的时间为500ms,可以修改
P1=0XFF;
for(time=ms,dlt=0;dlt<500;dlt=ms-time);
//第二步8灯从外到里依次点亮,重复两遍。
for(i=0;i<2;++i)
for(d=0x1,j=0x80;d<=0x8;d<<=1,j>>=1)
for(P1=~(d|j),time=ms,dlt=0;dlt<500;dlt=ms-time);
//第三步8灯从里到外依次点亮,重复两遍循环完毕后8灯保持在4亮4灭的状态
for(i=0;i<2;++i)
for(d=0x8,j=0x10;d;d>>=1,j<<=1)
for(P1=~(d|j),time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
P1=0xc3;
for(;KEY;);
}
voidprocess4()
{
unsignedchari,d;
unsignedinttime,dlt;
//第一步整体保持全灭。灭的时间为1000ms,可以修改
P1=0XFF;
for(time=ms,dlt=0;dlt<1000;dlt=ms-time);
//第二步从左到右流水两遍。
for(i=0;i<2;++i)
for(d=1;d;d<<=1)
for(P1=d,time=ms,dlt=0;dlt<500;dlt=ms-time);
//第三步从右到左逐个点亮三遍。
for(i=0;i<3;++i)
for(d=0x1;d;d<<=1)
for(P1=~d,time=ms,dlt=0;dlt<500;dlt=ms-time);
//第4步其中一盏灯保持闪
for(;KEY;)
{
for(d=0x8;KEY;d^=0x8)
for(P1=~d,time=ms,dlt=0;dlt<500&&KEY;dlt=ms-time);
}
}
voidmain()
{
//dataunsignedcharp0;
ms=0;
SetupTimer0();
EA=1;//全局中断打开
while(1)
{
process1();
process2();
process3();
process4();
}
}
⑸ 求51单片机C语言程序编程思路
#include<AT89X51.H>
//假定继电器是安装在P3.5,按键分别安装在P3.6,P3.7,时钟频率12MHz
sbitsw1=P3^6;
sbitsw2=P3^7;
sbitrelay=P3^5;
voidSetupTimer0()
{
TMOD&=0XF0;//仅保留T1信息
TMOD|=0X02;//设置T0:定时功能,方式2,自动重载8位定时器/计数器
TH0=256-250;//定时每0.25ms中断一次
TL0=256-250;
TR0=1;//开启定时器
ET0=1;//定时器0中断打开
}
dataunsignedcharus250;
dataunsignedintrelay_timer;
voidTimer0_ISR()interrupt1//定时中断服务程序,为按键消抖服务
{
//如果一个动作过程刚刚开始,则设定继电器延时3000ms,并打开继电器
if(0==relay_timer&&0==sw1){relay_timer=3000;relay=1;}
if(++us250>=4)//250us中断一次,每四次得到1ms
{
us250=0;
if(relay_timer==0)relay=0;//如继电器延时为0,则关继电器
else--relay_timer;//否则继电器延时递减
}
//如果当前正处于一个动作过程且有sw2按下,则修改继电器延时为1000ms
if(relay_timer&&0==sw2)relay_timer=1000;
}
voidmain()
{
us250=0;
relay_timer=0;
relay=0;
SetupTimer0();
EA=1;//全局中断打开
while(1);//所有的动作均在中断函数内完成
}
⑹ 51单片机C语言程序
这个很简单,可以利用单片机的定时器来完成
当有脉冲输入的时候,启动定时器,并对定时器的计数值进行清零
每一次脉冲输入都清零计数值,当脉冲消失后,定时器的计数值达到指定时间则关闭
关闭的同时,调用其它函数,例如你的继电器控制
需要说明的是,我使用的开发板和你的不见得一样,所以端口的使用只能你自己修改了
但程序已经经过硬件测试成功,请放心使用,如果满意记得采纳哦
/***************************************************************************/
#include <reg51.h> //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;}//如果达到指定时间,则关闭定时器,并设置标识符
}
/***************************************************************************/
⑺ 用C语言编程51单片机时候让程序返回到指定位置用什么语句
还是循环,需要循环几次用的i++
或者这样不就回去了吗?
while(1)
{
P0 = 0xFE;
for(i = 0;i < 60000;i++);
P0 = 0xFB;
for(j = 0;j < 30000;j++);
P0 = 0xFD;
}
⑻ 很简的51单片机C语言流水灯程序
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的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
uchar a,i,j;
while(1) //大循环
{
a=0xfe; //赋初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_crol_(a,1); //将a变量循环左移一位
}
a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_cror_(a,1); //将a变量循环右移一位
}
}
}
2、51单片机是对所有兼容Intel
8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash
rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。
⑼ 求51单片机的c语言程序
#include<stc89.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x00};
uchar led[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x00,0xFF};
sbit adrd=P3^7;
sbit adwr=P3^6;
sbit la=P2^6;
sbit wela=P2^7;
uchar date1=0;
uchar date2=50;
uchar date3=100;
uchar date4=150;
uchar date5=200;
uchar date6=255;
uchar a,sz;
void init();
void delay(uint z);
uchar adchushihua();
void shumaguan(uint shu);
void processing();
void main()
{
init();
while(1)
{
sz=adchushihua();
for(a=10;a>0;a--)
{
shumaguan(sz);
processing();
}
}
}
void init()
{
P0=0x7f;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar adchushihua()
{
uchar shu;
adwr=1;
_nop_();
adwr=0;
_nop_();
adwr=1;
P1=0xff;
adrd=1;
_nop_();
adrd=0;
_nop_();
shu=P1;
adrd=1;
return shu;
}
void shumaguan(uint shu)
{
uchar ,shi,ge;
=shu/100;
shi=shu%100/10;
ge=shu%10;
la=1;
P0=table[];
la=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(5);
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
delay(5);
la=1;
P0=table[ge];
la=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
delay(5);
}
void processing()
{
if((sz>=date1)&&(sz<=date2))
{
P1=0xfe;
}
else if((sz>=date2)&&(sz<=date3))
{
P1=0xfd;
}
else if((sz>=date3)&&(sz<=date4))
{
P1=0xfb;
}
else if((sz>=date4)&&(sz<=date5))
{
P1=0xf7;
}
else if((sz>=date5)&&(sz<date6))
{
P1=0xef;
}
else if(sz==date6)
{
P1=~P1;
delay(20);
}
}
这个是我刚刚写的 根据你的需要 反正闲来无事 我写的比较笼统 需要你自己根据 自己的实际情况来判断确定 我只是利用AD简单的处理 成数码管显示的数字 你要是 转换成电压 那就把里面的变量 修改一下 我写的那个控制LED灯亮就不要动了 只是修改一下他前面定义的数字就可以 最后那个是我自己加上去的有点趣味性 希望对你有帮助