百度
360搜索
搜狗搜索

51单片机程序100例,《单片机C语言程序设计实训100例——基于8051+Proteus仿真》 第03篇源代码详细介绍

本文目录一览: 51单片机,定时器方式1的1s定时,怎么编程

本程序来自《单片机C语言程序设计实训100例——基于8051+Proteus仿真》没用中断。
#include

#include

#define uchar unsigned char

#define uint unsigned int

void main()

{

uchar T_Count = 0;

P0 = 0xfe;

P2 = 0xfe;

TMOD = 0x10;//定时器1方式1

TH1 = (65535-50000)/256;//定时50000us=50ms

TL1 = (65535-50000)%256;

TR1 = 1;//启动定时器1

while(1)

{

if(TF1== 1)//查询方式定时时间到后TF1=1

{

TF1 = 0;

TH1 = (65535-50000)/256;

TL1 = (65535-50000)%256;

if(++T_Count == 20)//50ms*20=1000ms

{

P0 = _crol_(P0,1);

P2 = _crol_(P2,1);

T_Count = 0;

}

}

}

}

c51单片机程序实例

https://github.com/fmw666/C51
里面有一些 C51程序
配套 Proteus 和 同步代码
#include

#define uchar unsigned charuchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0到9uchar num,cnt,disn;uchar keyval,disk;uchar led[]={1,2,3,4};void dealdat(uchar a){led[0]=0;led[1]=0;led[2]=0;led[3]=0;led[a]=disk;}void delay(unsigned int a){ unsigned int i,j; for(i=0;i
<a;i++) for(j="0;j
100) { cnt=0; disn++; disn%=4; dealdat(disn); }}uchar kbscan(void){ unsigned char sccode,recode; P3=0x0f; //发0扫描,列线输入 if ((P3 & 0x0f) != 0x0f) //有键按下 {// delay(20); //延时去抖动 if ((P3&0x0f)!= 0x0f) { sccode = 0xef; //逐行扫描初值 while((sccode&0x01)!=0) { P3=sccode; if((P3&0x0f)!=0x0f) { recode=(P3&0x0f)|0xf0; return((~sccode)+(~recode)); } else sccode=(sccode<<1)|0x01; } } } return 0; //无键按下,返回0}void getkey(void){ unsigned char key; key=kbscan(); if(key==0){keyval=0xff;return;} switch(key) { case 0x11:keyval=7;break; case 0x12:keyval=4;break; case 0x14:keyval=1;break; case 0x18:keyval=10;break; case 0x21:keyval=8;break; case 0x22:keyval=5;break; case 0x24:keyval=2;break; case 0x28:keyval=0;break; case 0x41:keyval=9;break; case 0x42:keyval=6;break; case 0x44:keyval=3;break; case 0x48:keyval=11;break; case 0x81:keyval=12;break; case 0x82:keyval=13;break; case 0x84:keyval=14;break; case 0x88:keyval=15;break; default:keyval=0xff;break; }}main(){ TMOD=0x11; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TR0=1; ET0=1; EA=1; while(1) { getkey(); if(keyval!=0xff)disk=keyval; delay(10); }}

求利用51单片机实现控制步进电机(PWM电机)前进、后退、加减速 的程序(C语言),以及电路图 不胜感激

#include "reg52.h"
void delay(unsigned int t);
//Motor
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;
unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转
unsigned int K;
/**********************************************************************
* *
* 步进电机驱动 *
* *
***********************************************************************/
void motor_ffw()
{
unsigned char i;
unsigned int j;
for (j=0; j<12; j++) //转1*n圈
{
for (i=0; i<8; i++) //一个周期转30度
{
if(K==1) P1 = FFW[i]&0x1f; //取数据
if(K==2) P1 = FFZ[i]&0x1f;
delay(15); //调节转速
}
}
}
/******************************************************
*
* 延时程序
*
********************************************************/
void delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<100; k++)
{ }
}
}
main()
{
while(1)
{
K=1;
motor_ffw();
K=2;
motor_ffw();
}
}
给你个例子,这是正反转的可以用这个修改出加减速程序

求51单片机控制2个数码管的程序

两只数码管段码分别由P0,P2输出控制,P0是十位,P2是个位。P3.2,P3.4分别接两只按键,P32.清0,P3.4计数。
以上程序来自《单片机C语言程序设计实训100例--基于8051+Proteus仿真》
#include

#define

uchar

unsigned

char

#define

uint

unsigned

int

uchar

DSY_CODE[]=

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f

};

uchar

Count

=

0;

void

main()

{

P0

=

0x00;

P2

=

0x00;

TMOD

=

0x06;

TH0=255;

TL0=255;

ET0=1;

EX0=1;

EA

=1;

IP

=0x02;

IT0=1;

TR0=1;

while(1)

{

P0

=

DSY_CODE[Count/10];

P2

=

DSY_CODE[Count%10];

}

}

void

Clear_Counter()

interrupt

0

{

Count

=

0;

}

void

Key_Counter()

interrupt

1

{

Count

=

(Count

+

1)

%100;

}

c51单片机c语言交通灯的程序

#include

#define uint unsigned int

#define uchar unsigned char

sbit spk=P3^0;

sbit k0=P3^2;

sbit k1=P3^7;

sbit k2=P3^6;

sbit red1=P0^0;

sbit yellow1=P0^1;

sbit green1=P0^2;

sbit red2=P0^3;

sbit yellow2=P0^4;

sbit green2=P0^5;

uchar shi,ge,temp=29,aa,i,bb,flag0=0,flag1=0;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管码

void delay(uint z);

void display();

void init() //初始化函数

{

P3=0xfe;

EA=1;

EX0=1;

EX1=1;

IT1=1;

IT0=1;

TMOD=0x11;

TH0=(65536-50000)/256;//定时初值50毫秒

TL0=(65536-50000)%256;

ET0=1;

TR0=1;

}

void main()//主函数

{

init();

while(1)

{

display();

}

}

void delay(uint z)//延时子函数

{

uint x,y;

for(x=0;x
<z;x++)
for(y=0;y<110;y++);

}

void interrupt_0() interrupt 0//外部中断0,当k0按下时两路红的全亮

{

TR0=!TR0;

spk=1;

P1=0xff;

red1=0;

red2=0;

green1=1;

green2=1;

yellow1=1;

yellow2=1;

spk=0;

}

void interrup_1() interrupt 2//外部中断1,东西红灯亮或南北红灯亮

{

if(k1==0) //当中断触发时,检测到k1按下时东西红灯亮

{

TR0=!TR0;

P1=0xff;

red1=0;

red2=1;

green1=1;

green2=0;

yellow1=1;

yellow2=1;

}

if(k2==0)//当中断触发时,检测到k2按下时南北红灯亮

{

TR0=!TR0;

P1=0xff;

red1=1;

red2=0;

green1=0;

green2=1;

yellow1=1;

yellow2=1;

}

}

void timer0() interrupt 1//定时器,实现倒计时

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

if(aa==10)

{

aa=0;

temp--;

}

if(flag1==0)

{

if((temp>5)&&(temp<30)) P0=0xde;

if((temp<=5)&&(temp>=0)) P0=0xcf;

}

if(flag0==0)

{

if(temp==0)

{

temp=20;

flag1=1;

}

}

阅读更多 >>>  汇编语言指令大全及实例解析,单片机及工程应用内容简介

if(flag1==1)

{

if((temp>5)&&(temp<30)) P0=0xf3;

if((temp<=5)&&(temp>=0)) P0=0xf1;

flag0=1;

if(temp==0)

{

temp=29;

flag1=0;

flag0=0;

}

}

}

void display()//显示数码管倒计时

{

red1=0;

green2=0;

while(1)

{

P1=0xff;

shi=temp/10;

ge=temp%10;

P2=0x80;

P1=table[shi];

delay(10);

P1=0xff;

P2=0x40;

P1=table[ge];

delay(10);

}

}

如果你设计的五一单片机C语言交通灯的程序出不来,你肯定是有相应的错误,编译也是通过不了的,你应该仔细的阅读一下自己的程序

#include

#define uchar unsigned char

#define uint unsigned int

uint t1oc=20; //20*50000us=1s

uint count;

uchar tp[8];

uchar t1,t2,t3,t4;

uchar d1,d2,d3,d4;

//数码管显示代码

unsigned char code tab[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,

0x40,0x80};

//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

//0 1 2 3 4 5 6 7 8 9 A B C D E F - .

unsigned char code tab_p[]={

0xbf,0x86,0xdb,0xcf,

0xe6,0xed,0xfd,0x87,

0xff,0xef,0xf7,0xfc,

0xb9,0xde,0xf9,0xf1};//带小数点的16个数码

unsigned char code tab_w[]={

0x7F,0xBF,0xDF,0xEF,0xF7,0xfb,0xfd,0xfe};//位选择代码 从右到左

void delay1ms(unsigned int count) //延时1ms

{

unsigned char j;

for(;count>0;count--)

for(j=0;j<120;j++);

}

void led_ex(unsigned char dat,unsigned char N)

{

P0=dat;

P2=0x01<
<n;
delay1ms(1);

P2=0x00;

}

void display(unsigned char num,unsigned char wei,bit p)

{

P3=tab_w[wei];

if(!p)

P1=tab_p[num];

else

P1=tab[num];

delay1ms(1);

P1=0x00;

}

//定时器0 50000us 12MHz

void initTimer(void)

{

TMOD=0x1;

TH0=0x3c;

TL0=0xb0;

}

//定时器0 定时中断

void timer0(void) interrupt 1

{

TH0=0x3c;

TL0=0xb0;

t1oc--;

if(t1oc==0)

{

t1oc=20; //20*50000us=1s

t1--;

if(t1==0)

{

t1=d1;

led_ex(0xFF,0);

}

tp[0]=t1%10;

tp[1]=t1/10;

t2--;

if(t2==0)

{

t2=d2;

led_ex(0x00,1);

}

tp[2]=t2%10;

tp[3]=t2/10;

t3--;

if(t3==0)

{

t3=d3;

led_ex(0x00,2);

}

tp[4]=t3%10;

tp[5]=t3/10;

t4--;

if(t4==0)

{

t4=d4;

led_ex(0x00,3);

}

tp[6]=t4%10;

tp[7]=t4/10;

}

}

void main()

{

unsigned char i;

initTimer();

TR0=1;

ET0=1;

EA=1;

d1= 60;

d2= 30;

d3= 50;

d4= 45;

t1=1;

t2=1;

t3=1;

t4=1;

while(1)

{

for(i=0;i<8;i++)

{

display(tp[i],i,i%2);

}

}

}

51单片机交通灯Proteus仿真和C语言程序。交通灯仿真

懂事电子设计 Vgz

c51单片机交通灯仿真实例,可以参考一下,下载附件仿真试试。

Proteus仿真原理图:

程序如下:

#include

#define uchar unsigned char

#define uint unsigned int

uchar data buf[4];

uchar data sec_dx=20;//东西数默认

uchar data sec_nb=30;//南北默认值

uchar data set_timedx=20;

uchar data set_timenb=30;

int n;

uchar data b;//定时器中断次数

sbit k1=P1^6;//定义5组开关

sbit k2=P1^7;

sbit k3=P2^7;

sbit k4=P3^0;

sbit k5=P3^1;

sbit Yellow_nb=P2^5; //南北黄灯标志

sbit Yellow_dx=P2^2; //东西黄灯标志

sbit Green_nb=P2^4;

sbit Green_dx=P2^1;

sbit Buzz=P3^7;

bit Buzzer_Indicate;

bit time=0;//灯状态循环标志

bit set=1;//调时方向切换键标志

uchar code table[11]={ //共阴极字型码

0x3f, //--0

0x06, //--1

0x5b, //--2

0x4f, //--3

0x66, //--4

0x6d, //--5

0x7d, //--6

0x07, //--7

0x7f, //--8

0x6f, //--9

0x00 //--NULL

};

//函数的声明部分

void delay(int ms);//延时子程序

void key();//按键扫描子程序

void key_to1();//键处理子程序

void key_to2();

void key_to3();

void display();//显示子程序

void logo(); //开机LOGO

void Buzzer();

//主程序

void main()

{

TMOD=0X01;

TH0=0XD8;

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

EX0=1;

EX1=1;

logo();

P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯

sec_nb=sec_dx+5;

while(1)

{

key(); //调用按键扫描程序

display(); //调用显示程序

Buzzer();

}

}

//函数的定义部分

void key() //按键扫描子程序

{

if(k1!=1)

{

delay(10);

if(k1!=1)

{

while(k1!=1)

{

key_to1();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k3!=1)

{

TR0=1; //启动定时器

Buzzer_Indicate=0;

sec_nb=set_timenb; //从中断回复,仍显示设置过的数值

sec_dx=set_timedx;

if(time==0)

{ P2=0X99;sec_nb=sec_dx+5; }

else { P2=0xC3;sec_dx=sec_nb+5; }

}

if(k4!=1)

{

delay(5);

if(k4!=1)

{

while(k4!=1);

set=!set;

}

}

if(k5!=1)

{

delay(5);

if(k5!=1)

{

while(k5!=1)

key_to3();

}

}

}

void display() //显示子程序

{

buf[1]=sec_dx/10; //第1位 东西秒十位

buf[2]=sec_dx%10; //第2位 东西秒个位

buf[3]=sec_nb/10; //第3位 南北秒十位

buf[0]=sec_nb%10; //第4位 南北秒个位

P1=0xff; // 初始灯为灭的

P0=0x00;

P1=0xfe; //片选LCD1

P0=table[buf[1]];

delay(1);

P1=0xff;

P0=0x00;

P1=0xfd; //片选LCD2

P0=table[buf[2]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xfb; //片选LCD3

P0=table[buf[3]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xf7;

P0=table[buf[0]]; //片选LCD4

delay(1);

}

void time0(void) interrupt 1 using 1 //定时中断子程序

{

b++;

if(b==19) // 定时器中断次数

{ b=0;

sec_dx--;

sec_nb--;

if(sec_nb<=5&&time==0) //东西黄灯闪

{ Green_dx=0;Yellow_dx=!Yellow_dx;}

if(sec_dx<=5&&time==1) //南北黄灯闪

{ Green_nb=0;Yellow_nb=!Yellow_nb;}

if(sec_dx==0&&sec_nb==5)

sec_dx=5;

if(sec_nb==0&&sec_dx==5)

sec_nb=5;

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

}

}

void key_to1() //键盘处理子程序之+

{

TR0=0; //关定时器

if(set==0)

set_timenb++; //南北加1S

else

set_timedx++; //东西加1S

if(set_timenb==100)

set_timenb=1;

if( set_timedx==100)

set_timedx=1; //加到100置1

sec_nb=set_timenb ; //设置的数值赋给东西南北

sec_dx=set_timedx;

}

void key_to2() //键盘处理子程序之-

{

TR0=0; //关定时器

if(set==0)

set_timenb--; //南北减1S

else

set_timedx--; //东西减1S

if(set_timenb==0)

set_timenb=99;

if( set_timedx==0 )

set_timedx=99; //减到1重置99

sec_nb=set_timenb ; //设置的数值赋给东西南北

sec_dx=set_timedx;

}

void key_to3() //键盘处理之紧急车通行

{

TR0=0;

P2=0Xc9;

sec_dx=00;

sec_nb=00;

Buzzer_Indicate=1;

}

void int0(void) interrupt 0 using 1 //只允许东西通行

{

TR0=0;

P2=0Xc3;

Buzzer_Indicate=0;

sec_dx=00;

sec_nb=00;

}

void int1(void) interrupt 2 using 1 //只允许南北通行

{

TR0=0;

P2=0X99;

Buzzer_Indicate=0;

sec_nb=00;

sec_dx=00;

}

void logo()//开机的Logo "- - - -"

{ for(n=0;n<50;n++)

{

P0=0x40;

P1=0xfe;

delay(1);

P1=0xfd;

delay(1);

P1=0Xfb;

delay(1);

P1=0Xf7;

delay(1);

P1 = 0xff;

}

}

void Buzzer()

{

if(Buzzer_Indicate==1)

Buzz=!Buzz;

else Buzz=0;

}

void delay(int ms) //延时子程序

{

uint j,k;

for(j=0;j
<ms;j++)
for(k=0;k<124;k++);

}
</ms;j++)

阅读更多 >>>  单片机如何转嵌入式linux

</n;

</z;x++)

用51单片机实现温度报警器的程序,要正确的

/*使用举例:数码管
scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
discan=0x00;
Disdata=dis_7[_1820display[k]]; //数据显示
if (k==1){DIN=0;} //小数点显示
discan=scan_con[k]; //位选
_18B20_delay(100);
}
}
main()
_18B20_init();//18B20初始化
while(1)
{
EA=0;//在利用18B20测试温度时,要严格遵循时序,禁止一切中断
_18B20_work(_18B20_read()); //处理温度数据
EA=1;//测试完毕,恢复系统中断
scan(); //显示温度值
}
*/
#include "intrins.h" //_nop_();延时函数用
//*****************//
//以下是DS18B20驱动程序
//*****************//
/**************************************************
** 功能描述: DS18B20驱动程序,使用12M晶体
** DQ占用引脚资源P1^7
****************************************************/sbit DQ=P1^7; //温度输入口unsigned char data temp_data[2]={0x00,0x00}; //读出温度暂放
unsigned char data _1820display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
unsigned int temp;
//**************温度小数部分用查表法***********//
unsigned char code ditab[16]=
{
0x00,0x01,0x01,0x02,
0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,
0x08,0x08,0x09,0x09
};/*****************11us延时函数*************************/
//
void _18B20_delay(unsigned int t)
{
for (;t>0;t--);
}/****************DS18B20复位函数************************/
_18B20_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;
_nop_();_nop_();//从高拉倒低
DQ=0;
_18B20_delay(50); //550 us
DQ=1;
_18B20_delay(6); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
_18B20_delay(45); //延时500 us
presence=~DQ;
}
DQ=1; //拉高电平
}/****************DS18B20写命令函数************************/
//向1-WIRE 总线上写1个字节
void _18B20_write(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //从高拉倒低
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
_18B20_delay(6); //66 us
val=val/2; //右移1位
}
DQ=1;
_18B20_delay(1);
}/****************DS18B20读1字节函数************************/
//从总线上取1个字节
unsigned char _18B20read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //从高拉倒低
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;
_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
_18B20_delay(6); //66 us
}
DQ=1;
return(value);
}
_18B20_read() //读出温度函数
{
_18B20_reset(); //总线复位
_18B20_delay(200);
_18B20_write(0xcc); //发命令
_18B20_write(0x44); //发转换命令
_18B20_reset();
_18B20_delay(1);
_18B20_write(0xcc); //发命令
_18B20_write(0xbe);
temp_data[0]=_18B20read_byte(); //读温度值的低字节
temp_data[1]=_18B20read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}/****************温度数据处理函数************************///二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分/********************************************************/
_18B20_work(unsigned int tem)
{
unsigned char n=0;
if(tem>6348) // 温度值正负判断
{
tem=65536-tem;
n=1;
} // 负温度求补码,标志位置1
_1820display[4]=tem&0x0f; // 取小数部分的值
_1820display[0]=ditab[_1820display[4]]; // 存入小数部分显示值
_1820display[4]=tem>>4; // 取中间八位,即整数部分的值
_1820display[3]=_1820display[4]/100; // 取百位数据暂存
_1820display[1]=_1820display[4]%100; // 取后两位数据暂存
_1820display[2]=_1820display[1]/10; // 取十位数据暂存
_1820display[1]=_1820display[1]%10;
/******************数码管符号位显示判断**************************/
if(!_1820display[3])
{
_1820display[3]=0x0a; //最高位为0时不显示
if(!_1820display[2])
_1820display[2]=0x0a; //次高位为0时不显示
}
if(n)
_1820display[3]=0x0b; //负温度时最高位显示"-"
}
/******************1602液晶符号位显示判断**************************/
if(!_1820display[3])
{
_1820display[3]=' '-'0'; //最高位为0时不显示
if(!_1820display[2])
_1820display[2]=' '-'0'; //次高位为0时不显示
}
if(n)
_1820display[3]='-'-'0'; //负温度时最高位显示"-"
} _18B20_init()//18B20初始化
{
_18B20_reset(); //开机先转换一次
_18B20_write(0xcc); //Skip ROM
_18B20_write(0x44); //发转换命令
}

很简的51单片机C语言流水灯程序

1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。
例程:
#include

//51单片机头文件

#include

//包含有左右循环移位子函数的库

#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单片机是基础入门的一个单片机,还是应用最广泛的一种。

#include

#include

#define LED P2

void delay(char i);

void main()

{ unsigned char LedVablue=0xFE;

while(1)

{

LedVablue= _crol_(LedVablue,1); //_crol_(x,Y)是

//里面的一个库函数,相当于汇编的带进位循环

LED=LedVablue;

delay(100);

}

}

void delay(char i)

{

char j;

for(;i>0;i--)

for(j=0;j<250;j++);

}

字符型char 默认为signed类型

所以你的延时子程序里j循环条件一直满足

程序调用第一个delay(100)时陷入死循环

此时led=11111110 所以只有第一个灯一直亮

就会这种解释了

你确认只把初值

LED = 0xfe改成~LED = 0?

//---------------------------------------

//头文件

#include

阅读更多 >>>  卡片机是什么

//---------------------------------------

//---------------------------------------

//数据类型替代声明

#define u8 unsigned char

#define u16 unsigned int

//---------------------------------------

u8 led[8]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};

//---------------------------------------

//延时子函数 延时时间为n毫秒

void delay_ms(u8 n)

{

u16 i;

for(;n>0;n--)

{

for(i=114;i>0;i--)

{

;

}

}

}

//---------------------------------------

//---------------------------------------

//流水一次子函数

void liushui(void)

{

u8 i;

for(i=0;i<=7;i++)

{

P0=led[i];

delay_ms(240);

}

}

//---------------------------------------

//---------------------------------------

//主函数

void main(void)

{

while(1)

{

liushui();

}

}

//---------------------------------------

#include

#define LED P2

void delay();

void main()

{

char n;

while(1)

{

LED = 0xfe;

delay();

for(n=0;n<8;n++)

{

LED = (LED << 1) | 0x01;

delay();

}

}

}

void delay()

{

char j1,j2,j3;

for(j3=0;j3<10;j3++)

{

for(j2=0;j2<100;j2++)

{

for(j1=0;j1<100;j1++){}

}

}

}

试试这个程序

我不知道你的编译器是怎样定义char的,如果char定义为有符号变量的话,char就是-127至+128大小的有符号的变量,你的for(j=0;j<250;j++)里面j<250,这个条件就会永远满足,所以就死循环了

1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。例程:

#include

//51单片机头文件#include

//包含有左右循环移位子函数的库#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单片机是基础入门的一个单片机,还是应用最广泛的一种。

《单片机C语言程序设计实训100例——基于8051+Proteus仿真》 第03篇源代码

单片机c语言编程100个实例目录1
函数的使用和熟悉
实例3:用单片机控制第一个灯亮
实例4:用单片机控制一个灯闪烁:认识单片机的工作频率
实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能
实例6:使用P3口流水点亮8位LED
实例7:通过对P3口地址的操作流水点亮8位LED
实例8:用不同数据类型控制灯闪烁时间
实例9:用P0口、P1 口分别显示加法和减法运算结果
实例10:用P0、P1口显示乘法运算结果
实例11:用P1、P0口显示除法运算结果
实例12:用自增运算控制P0口8位LED流水花样
实例13:用P0口显示逻辑"与"运算结果
实例14:用P0口显示条件运算结果
实例15:用P0口显示按位"异或"运算结果
实例16:用P0显示左移运算结果
实例17:"万能逻辑电路"实验
实例18:用右移运算流水点亮P1口8位LED
实例19:用if语句控制P0口8位LED的流水方向
实例20:用swtich语句的控制P0口8位LED的点亮状态
实例21:用for语句控制蜂鸣器鸣笛次数
实例22:用while语句控制LED
实例23:用do-while语句控制P0口8位LED流水点亮
实例24:用字符型数组控制P0口8位LED流水点亮
实例25: 用P0口显示字符串常量
实例26:用P0 口显示指针运算结果
实例27:用指针数组控制P0口8位LED流水点亮
实例28:用数组的指针控制P0 口8 位LED流水点亮
实例29:用P0 、P1口显示整型函数返回值
实例30:用有参函数控制P0口8位LED流水速度
实例31:用数组作函数参数控制流水花样
实例32:用指针作函数参数控制P0口8位LED流水点亮
实例33:用函数型指针控制P1口灯花样
实例34:用指针数组作为函数的参数显示多个字符串
单片机c语言编程100个实例目录2
实例35:字符函数ctype.h应用举例
实例36:内部函数intrins.h应用举例
实例37:标准函数stdlib.h应用举例
实例38:字符串函数string.h应用举例
实例39:宏定义应用举例2
实例40:宏定义应用举例2
实例41:宏定义应用举例3
* 中断、定时器中断、定时器 *中断、定时器*中断、定时器 /
实例42:用定时器T0查询方式P2口8位控制LED闪烁
实例43:用定时器T1查询方式控制单片机发出1KHz音频
实例44:将计数器T0计数的结果送P1口8位LED显示
实例45:用定时器T0的中断控制1位LED闪烁
实例46:用定时器T0的中断实现长时间定时
实例47:用定时器T1中断控制两个LED以不同周期闪烁
实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频
实例49:用定时器T0的中断实现"渴望"主题曲的播放
实例50-1:输出50个矩形脉冲
实例50-2:计数器T0统计外部脉冲数
实例51-2:定时器T0的模式2测量正脉冲宽度
实例52:用定时器T0控制输出高低宽度不同的矩形波
实例53:用外中断0的中断方式进行数据采集
实例54-1:输出负脉宽为200微秒的方波
实例54-2:测量负脉冲宽度
实例55:方式0控制流水灯循环点亮
实例56-1:数据发送程序
实例56-2:数据接收程序
实例57-1:数据发送程序
实例57-2:数据接收程序
实例58:单片机向PC发送数据
实例59:单片机接收PC发出的数据
*数码管显示*数码管显示 数码管显示数码管显示*/
实例60:用LED数码显示数字5
实例61:用LED数码显示器循环显示数字0~9
实例62:用数码管慢速动态扫描显示数字"1234"
实例63:用LED数码显示器伪静态显示数字1234
实例64:用数码管显示动态检测结果
实例65:数码秒表设计
实例66:数码时钟设计
实例67:用LED数码管显示计数器T0的计数值
实例68:静态显示数字“59”
单片机c语言编程100个实例目录3
键盘控制*键盘控制* *键盘控制 *键盘控制 */
实例69:无软件消抖的独立式键盘输入实验
实例70:软件消抖的独立式键盘输入实验
实例71:CPU控制的独立式键盘扫描实验
实例72:定时器中断控制的独立式键盘扫描实验
实例73:独立式键盘控制的4级变速流水灯
实例74:独立式键盘的按键功能扩展:"以一当四"
实例75:独立式键盘调时的数码时钟实验
实例76:独立式键盘控制步进电机实验
实例77:矩阵式键盘按键值的数码管显示实验
//实例78:矩阵式键盘按键音
实例79:简易电子琴
实例80:矩阵式键盘实现的电子密码锁
液晶显示LCD*液晶显示LCD *液晶显示LCD * *液晶显示LCD*液晶显示LCD *液晶显示LCD */
实例81:用LCD显示字符'A'
实例82:用LCD循环右移显示"Welcome to China"
实例83:用LCD显示适时检测结果
实例84:液晶时钟设计
*一些芯片的使用*24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控/
实例85:将数据"0x0f"写入AT24C02再读出送P1口显示
实例86:将按键次数写入AT24C02,再读出并用1602LCD显示
实例87:对I2C总线上挂接多个AT24C02的读写操作
实例88:基于AT24C02的多机通信 读取程序
实例89:基于AT24C02的多机通信 写入程序
实例90:DS18B20温度检测及其液晶显示
实例91:将数据"0xaa"写入X5045再读出送P1口显示
实例92:将流水灯控制码写入X5045并读出送P1口显示
实例93:对SPI总线上挂接多个X5045的读写操作
实例94:基于ADC0832的数字电压表
实例95:用DAC0832产生锯齿波电压
实例96:用P1口显示红外遥控器的按键值
实例97:用红外遥控器控制继电器
实例98:基于DS1302的日历时钟
实例99:单片机数据发送程序
实例100:电机转速表设计
模拟霍尔脉冲
http://www.dzkfw.com.cn/myxin/51c_language.chm 单片机c语言一百例子

求一个51单片机的C语言程序,8个LED4种亮法,自上而下,自下而上,高低4位交替亮,一个个灭直到全灭。

我给你做个例子吧,把接LED灯的io口赋值0,灯亮;把接LED灯的io口赋值1,灯灭
因为一般接io口的LED灯有个上拉高电平,io这端给他个低电平(0),造成电压差,就有电流通过,灯就亮了;反之,io给高电平(1),没有压差,无电流,灯灭。
下面的你自己应该可以写了,锻炼下手。
void delay(void)
{
int i=10000; //这个值调整亮灯灭等快慢,越小越快越大越慢
while(i--)
return;
}
//从上到下亮灯
void LED_a(void)
{
LED_IO1 = 0;
delay();
LED_IO2 = 0;
delay();
LED_IO3 = 0;
delay();
LED_IO4 = 0;
delay();
LED_IO5 = 0;
delay();
LED_IO6= 0;
delay();
LED_IO7= 0;
delay();
LED_IO8= 0;
delay();
}
//开始灯全灭
void LED_dengmie(void)
{
LED_IO1 = 1;
LED_IO2 = 1;
LED_IO3 = 1;
LED_IO4 = 1;
LED_IO5 = 1;
LED_IO6= 1;
LED_IO7= 1;
LED_IO8= 1;
}
main()
{
LED_dengmie();
LED_a();
}
#include

unsigned char P1;

void delay05s(void)

{

unsignedchar i,j,k;

for(i=50;i>0;i--)

for(j=20;j>0;j--)

for(k=248;k>0;k--);

}

void main(void)

{

while(1)

{

//自上而下

P1=0xfe;delay05s();P1=0xfd;delay05s();P1=0xfb;delay05s();

P1=0xf7;delay05s();

//自下而上

P1=0xf7;delay05s();P1=0xfb;delay05s();P1=0xfd;delay05s();

P1=0xfe;delay05s();

//交替

P1=0xfC;delay05s();P1=0xf3;delay05s();

//一个个灭

P1=0xf0;delay05s();P1=0xf1;delay05s();P1=0xf3;delay05s();

P1=0xf7;delay05s();P1=0xff;delay05s();

}

}

#include

#define uchar unsigned char

uchar led;

void delay()

{

uchar i,j;

for(i=0;i<100;i++)

for(j=0;j<125;j++);

}

main()

{

uchar i;

while(1)

{

led=0xfe;

i=8;

while(i--)

{

P0=led;

delay();

led<<=1;

led|=0x01;

}

i=8;

led=0x7f;

while(i--)

{

P0=led;

delay();

led>>=1;

led|=0x80;

}

i=8;

led=0x0f;

while(i--)

{

P0=led;

delay();

led>>~led;

}

i=8;

led=0x00;

P0=led;

delay();

while(i--)

{

led|=0x80

P0=led;

delay();

led>>=1;

}

}

}

网站数据信息

"51单片机程序100例,《单片机C语言程序设计实训100例——基于8051+Proteus仿真》 第03篇源代码"浏览人数已经达到22次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:51单片机程序100例,《单片机C语言程序设计实训100例——基于8051+Proteus仿真》 第03篇源代码的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!