51单片机程序100例,《单片机C语言程序设计实训100例——基于8051+Proteus仿真》 第03篇源代码
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++)
</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;
}
}
}