百度
360搜索
搜狗搜索

c51单片机c语言教程,51单片机 c语言里 _nop_ 函数怎么用 具体一点 求高手指教详细介绍

本文目录一览: 新概念51单片机C语言教程的介绍

《新概念51单片机C语言教程》是2009年电子工业出版社出版的图书,作者是郭天祥。《新概念51单片机C语言教程:入门、提高、开发、拓展》从实际应用入手,以实验过程和实验现象为主导,循序渐进地讲述51单片机C语言编程方法以及51单片机的硬件结构和功能应用。《新概念51单片机C语言教程:入门、提高、开发、拓展》从实际应用入手,以实验过程和实验现象为主导,循序渐进地讲述51单片机C语言编程方法以及51单片机的硬件结构和功能应用。全书共分5篇,分别为入门篇、内外部资源操作篇、提高篇、实战篇和拓展篇。《新概念51单片机C语言教程:入门、提高、开发、拓展》内容丰富,实用性强,书中大部分内容均来自科研工作及教学实践,许多C语言代码可以直接应用到工程项目中。《新概念51单片机C语言教程》配套光盘提供13讲近30学时的教学视频和《新概念51单片机C语言教程》实例代码,可使读者更快更好地掌握单片机知识和应用技能。《新概念51单片机C语言教程》作者还可提供与《新概念51单片机C语言教程:入门、提高、开发、拓展》配套的单片机实验板。《新概念51单片机C语言教程:入门、提高、开发、拓展》可作为大学本、专科单片机课程教材,适合于51单片机的初学者和使用51单片机从事项目开发的技术人员,也可供从事自动控制、智能仪器仪表、电力电子、机电一体化等专业的技术人员参考。

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

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++)

阅读更多 >>>  程序设计教程课后答案,谁有c#程序设计教程第三版的课后习题答案,刘甫迎主编的??急求,

C51单片机多机通信C语言

单片机a,b,c. a为主机,bc为从机。a上有一个外部中断0输入,按第一次a的两个LED亮500ms,再按一下,b机的两个LED灯亮500ms,第三次按下c机的两个LED灯亮500ms,然后周而复始。两个数码管分别显示0/1/2, 和abc(bc由从机反馈)
/*
主从通信基本步骤:
1. 主机从机初始化为方式2或者3,从机都置SM2=1,允许中断
2. 主机置TB8=1,发送从机地址
3. 所有从机均接收主机发送要寻址的从机地址
4. 被寻址的从机确认地址后,置本机SM2=0,向主机返回地址,供主机核对
5. 核对无误后,主机向被寻址的从机发送命令,通知从机接受或者发送数据。
6. 本次通信结束后,主从机重置SM2=1,主机可再对其他从机寻址
*/
******************************************************************
主机a:
******************************************************************
#include

#define uchar unsigned char

#define uint unsigned int

uchar leddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00};

uchar Mode;

sbit P10 = P1^0;

sbit P13 = P1^3;

sbit P17 = P1^7;

sbit P20 = P2^0;

sbit P21 = P2^1;

void UART_init()

{

TMOD = 0x20;

TH1 = 0xfd;

TL1 = 0xfd;

TR1 = 1;

SCON = 0xd0;

ES = 1;

EX0 = 1;

IT0 = 1; //INT0下跳触发

EA = 1;

TI = 0;

}

void DelayMs(int ms)

{

uchar i;

while(ms--)

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

}

void putc_to_SerialPort(uchar c)

{

SBUF = c;

while(TI == 0);

TI = 0;

}

void MasterControl(unsigned char Addr, unsigned char Comd)

{

TB8 = 1;

putc_to_SerialPort(Addr);

DelayMs(50);

TB8 = 0;

putc_to_SerialPort(Comd);

DelayMs(50);

}

Ex0_int(void) interrupt 0

{

P0 = leddata[Mode];

P20 = 0;

if(Mode == 0)

{

P2 = leddata[10];

P10 = 0;

P13 = 0;

DelayMs(500);

P10 = 1;

P13 = 1;

// MasterControl('b','C');

// MasterControl('c','C');

}

else if(Mode == 1)

{

P10 = 1;

P13 = 1;

MasterControl('b','O');

// MasterControl('c','C');

}

else if(Mode == 2)

{

P10 = 1;

P13 = 1;

// MasterControl('b','C');

MasterControl('c','O');

}

Mode = (Mode + 1) % 3;

}

com_int(void) interrupt 4

{

if(RI)

{

RI = 0;

if(SBUF == 'b')

{

P2 = leddata[11];

}

if(SBUF == 'c')

{

P2 = leddata[12];

}

}

}

void main(void)

{

P0 = 0x00;

P1 = 0xff;

P2 = 0x00;

UART_init();

Mode = 0;

while(1);

}

******************************************************************

从机b:

******************************************************************

#include

#define uchar unsigned char

uchar RecData;

sbit P10 = P1^0;

sbit P13 = P1^3;

void UART_init()

{

TMOD = 0x21;

TH1 = 0xfd;

TL1 = 0xfd;

TR1 = 1;

SCON = 0xf0;

ES = 1;

PS = 1;

EA = 1;

}

void DelayMs(int ms)

{

uchar i;

while(ms--)

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

}

void putc_to_SerialPort(uchar c)

{

SBUF = c;

while(TI == 0);

TI = 0;

}

com_int(void) interrupt 4

{

if(RI)

{

RecData = SBUF;

RI = 0;

if(RB8 == 1) //地址

{

if(RecData == 'b') //是自己的地址,置SM2=0,准备接受数据

{

SM2 = 0;

putc_to_SerialPort('b');

}

else //不是自己的地址

{

SM2 = 1;

}

}

if(RB8 == 0) //数据

{

if(RecData=='O')

{

P10 = 0;

P13 = 0;

DelayMs(500);

P10 = 1;

P13 = 1;

阅读更多 >>>  c++教程编程,c语言入门教程有哪些

}

if(RecData=='C')

{

P10 = 1;

P13 = 1;

}

SM2 = 1;

}

}

}

void main(void)

{

P0 = 0xff;

P1 = 0xff;

UART_init();

while(1);

}

******************************************************************

从机c:

******************************************************************

#include

#define uchar unsigned char

uchar RecData;

sbit P10 = P1^0;

sbit P13 = P1^3;

void UART_init()

{

TMOD = 0x21;

TH1 = 0xfd;

TL1 = 0xfd;

TR1 = 1;

SCON = 0xf0;

ES = 1;

PS = 1;

EA = 1;

}

void DelayMs(int ms)

{

uchar i;

while(ms--)

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

}

void putc_to_SerialPort(uchar c)

{

SBUF = c;

while(TI == 0);

TI = 0;

}

com_int(void) interrupt 4

{

if(RI)

{

RecData = SBUF;

RI = 0;

if(RB8 == 1) //地址

{

if(RecData == 'c') //是自己的地址,置SM2=0,准备接受数据

{

SM2 = 0;

putc_to_SerialPort('c');

}

else //不是自己的地址

{

SM2 = 1;

}

}

if(RB8 == 0) //数据

{

if(RecData=='O')

{

P10 = 0;

P13 = 0;

DelayMs(500);

P10 = 1;

P13 = 1;

SM2 = 1;

}

if(RecData=='C')

{

P10 = 1;

P13 = 1;

SM2 = 1;

}

}

}

}

void main(void)

{

P0 = 0xff;

P1 = 0xff;

UART_init();

while(1);

}

51单片机编程,用C语言。

请问为什么开头要定义unsignedchar类型呢,不是可以用unsignedint代替吗??
在单片机中char类型的数据有什么作用呢??
我想说的是,单片机不是通用pc机
虽然说现在的单片机内部的ram越来越大但是比起电脑里还是有限的,
unsignedchar是可以用unsignedint代替,但是这样占用的字节数太多了。
字符型的1个字节长,而整型是2个字节长。
单片机的char型和c里面的不太一样,
因为你用的52是8位的单片机,而char型是8位,所以操作方便。
欢迎追问
不会,识别int型的低八位
如果你不急,我明天晚上可以帮你写一下,给你一点提示,OX02H.THO=(65536-400)\256.TLO=(65536-400)%256,
给你一个矩阵键盘的参考程序
行列扫描:通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
/****************************************************************************
*函数名
:KeyDown
*函数功能
:
检测有按键按下并读取键值
*输入
:

*输出
:

****************************************************************************/
voidKeyDown(void)
{
char
a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
Delay10ms();//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
GPIO_KEY=0X0F;
//测试列
switch(GPIO_KEY)
{
case(0X07):
KeyValue=0;break;
case(0X0b):
KeyValue=1;break;
case(0X0d):
KeyValue=2;break;
case(0X0e):
KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70):
KeyValue=KeyValue;break;
case(0Xb0):
KeyValue=KeyValue+4;break;
case(0Xd0):
KeyValue=KeyValue+8;break;
case(0Xe0):
KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0))//按键松手检测
{
Delay10ms();
a++;
}
}
}
}

新概念51单片机C语言教程的作品目录

第1篇入门篇1.1单片机概述1.1.1什么是单片机1.1.2单片机标号信息及封装类型1.1.3单片机能做什么1.1.4如何开始学习单片机1.251单片机外部引脚介绍1.3电平特性1.4二进制与十六进制1.4.1二进制1.4.2十六进制1.5二进制的逻辑运算1.5.1与1.5.2或1.5.3非1.5.4同或1.5.5异或1.6单片机的C51基础知识介绍1.6.1利用C语言开发单片机的优点1.6.2C51中的基本数据类型1.6.3C51数据类型扩充定义1.6.4C51中常用的头文件1.6.5C51中的运算符1.6.6C51中的基础语句1.6.7学习单片机应该掌握的主要内容2.1Keil工程建立及常用按钮介绍2.1.1Keil工程的建立2.1.2常用按钮介绍2.2点亮第一个发光二极管2.3while语句2.4for语句及简单延时语句2.5Keil仿真及延时语句的精确计算2.6不带参数函数的写法及调用2.7带参数函数的写法及调用2.8利用C51库函数实现流水灯第2篇内外部资源操作篇3.1数码管显示原理3.2数码管静态显示3.3数码管动态显示3.4中断概念3.5单片机的定时器中断4.1独立键盘检测4.2矩阵键盘检测5.1模拟量与数字量概述5.2A/D转换原理及参数指标5.3ADC0804工作原理及其实现方法5.4D/A转换原理及其参数指标5.5DAC0832工作原理及实现方法5.6DAC0832输出电流转换成电压的方法第6章串行口通信原理及操作流程6.1并行与串行基本通信方式6.2RS-232电平与TTL电平的转换6.3波特率与定时器初值的关系6.451单片机串行口结构描述6.5串行口方式1编程与实现6.6串行口打印在调试程序中的应用第7章通用型1602,12232,12864液晶操作方法7.1液晶概述7.2常用1602液晶操作实例7.3常用12232液晶操作实例7.4常用12864液晶操作实例第8章I2C总线AT24C02芯片应用8.1I2C总线概述8.2单片机模拟I2C总线通信8.3E2PROMAT24C02与单片机的通信实例第9章基础运放电路专题9.1运放概述及参数介绍9.2反相放大器9.3同相放大器9.4电压跟随器9.5加法器9.6差分放大器9.7微分器9.8积分器第3篇提高篇第10章定时器/计数器应用提高10.1方式0应用10.2方式2应用10.3方式3应用10.452单片机定时器2介绍10.5计数器应用第11章串行口应用提高11.1方式0应用11.2方式2和方式3应用11.3单片机双机通信11.4单片机多机通信第12章指针12.1指针与指针变量12.1.1内存单元、地址和指针12.1.2指针变量的定义、赋值与引用12.2指针变量的运算12.3指针与数组12.3.1指针与一维数组12.3.2指针与多维数组12.4指针与函数12.4.1指针作为函数的参数12.4.2指向函数的指针12.4.3指针型函数12.5指针与字符串12.5.1字符串的表达形式12.5.2字符指针作为函数参数12.5.3 使用字符指针与字符数组的区别12.6指针数组与命令行参数12.6.1 指针数组的定义和使用12.6.2指向指针的指针12.6.3 指针数组作为main()函数的命令行参数12.7指针小结12.7.1指针概念综述12.7.2指针运算小结12.7.3等价表达式12.8C51中指针的使用12.8.1指针变量的定义12.8.2指针应用第13章STC系列51单片机功能介绍13.1单片机空闲与掉电模式应用13.2“看门狗”概念及其应用13.3用软件实现系统复位13.4内部扩展RAM的应用13.5扩展P4口的应用13.6内部E2PROM的应用13.7STC89系列单片机内部A/D应用13.8STC12系列单片机内部A/D应用13.9STC12系列单片机的PCA/PWM介绍13.10STC12系列单片机的SPI接口介绍13.11STC12系列单片机的“576MHz”超速运行第4篇实战篇第14章利用51单片机的定时器设计一个时钟14.1如何从矩阵键盘中分解出独立按键14.2原理图分析14.3实例讲解第15章使用DS12C887时钟芯片设计高精度时钟15.1时钟芯片概述15.2DS12C887时钟芯片介绍15.3如何用TX-1C实验板扩展本实验15.4原理图分析15.5实例讲解第16章使用DS18B20温度传感器设计温控系统16.1温度传感器概述16.2DS18B20温度传感器介绍16.3实例讲解第17章太阳能充/放电控制器17.1控制器原理图分析17.2控制器板上元件介绍17.3实例讲解第18章VC、VB(MSCOMM控件)与单片机通信实现温度显示18.1VCMSCOMM控件与单片机通信实现温度显示18.2VBMSCOMM控件与单片机通信实现温度显示第5篇拓展篇第19章使用Protell99绘制电路图全过程19.1绘制电路板概述19.2建立工程19.3制作元件库19.4添加封装及制作PCB封装库19.5错误检查及生成PCB19.6布线电气特性设置19.7自动布线和手动布线第20章ISD400x系列语音芯片应用20.1ISD400x系列语音芯片介绍20.2ISD400x系列语音芯片操作规则20.3ISD400x系列语音芯片应用实现第21章电机专题21.1直流电机原理及应用21.2步进电机原理及应用21.3舵机原理及其应用第22章常用元器件介绍22.1二极管22.2电容22.3场效应管22.4光耦22.5蜂鸣器22.6继电器22.7自恢复保险22.8瞬态电压抑制器22.9晶闸管(可控硅)22.10电荷泵第23章直流稳压电源专题23.1整流电路23.2滤波电路23.3稳压电路23.4集成稳压模块的使用23.5串联开关型稳压电源第24章运放扩展专题24.1简单低通滤波器24.2“电流-电压”转换电路24.3光电放大器24.4精密电流源24.5可调参考电压源24.6复位稳定放大器24.7模拟乘法器24.8全波整流器和平均值滤波器24.9正弦波振荡器24.10三角波发生器24.11自动跟踪对称电源24.12可调实验电源24.13运放相关术语表附录A天祥电子开发实验板简介A.1TX-1C51单片机开发板(配套详细视频教程)A.2AVR单片机开发板(配套详细视频教程)A.3PIC单片机开发板(配套详细视频教程)A.4J-Link全功能ARM仿真器A.5三星S3C44B0ARM7入门级开发板A.6三星S3C44B0ARM7提高级开发板A.7TX-51STAR51单片机开发板(配套详细视频教程)参考文献

51单片机 c语言里 _nop_ 函数怎么用 具体一点 求高手指教

一个nop为1个指令周期,主要用于精确定时或者延时
nop指令的作用:
1)就是通过nop指令的填充(nop指令一个字节),使指令按字对齐,从而减少取指令时的内存访问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指令,cpu 就可以从第四个字节处读取指令了。)
2)通过nop指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟;-->具体应该说是占用了3个时钟脉冲!
3)i/o传输时,也会用一下 nop,等待缓冲区清空,总线恢复;
4)清除由上一个算术逻辑指令设置的flag位;
5)破解:)对于原程序中验证部分使用nop来填充,使验证失效;
6)有一个朋友说的比较厉害--在航天飞机控制程序中防止程序跳飞!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/erazy0/archive/2010/12/12/6071281.aspx
1、C语言中没有_nop_()函数,该函数是在51单片机中用的延时函数,延时一个指令周期。一般包含在 intrins.h 头文件当中。
2、例如用6MHz的晶振,则如下for循环大约延时1秒。
int i;
for(i=0; i<6000000; i++)
_nop_(); // 延时一个指令周期,相当于执行一条无意义的语言
在单片机c语言中直接调用库函数即可,具体如下:
#include

// 声明了void _nop_(void);

_nop_(); // 产生一条NOP指令。

该函数的作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。

单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。

单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。

51单片机C语言如何实现8个流水灯左移三次,后右移三次;如此循环

你直接用数组加for循环就可以实现
一个方向往另一个方向
0x01--->0xff
反方向
0xff--->0x01
先定义好类型 后for循环
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变量循环右移一位 } }}51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。

阅读更多 >>>  比较好的jquery教程,在vue-cliwebpack中如何引入jquery(详细教程)

51单片机C语言

这两组数据不是算的,而是根据音符实际频率实验得到的。
硬要说算的也要根据你定时器的频率具体得到。
如果想要自己利用蜂鸣器编歌,可用下面程序(极乐净土蜂鸣器版)
贴上极乐净土的简谱,对照下就能自己用蜂鸣器编歌了
#include

#define uchar unsigned char#define uint unsigned intsbit beep=P1^5;//蜂鸣器端口定义uint i,j;unsigned int C;#define l1 262 #define l2 284#define l3 311#define l4 349#define l5 392#define l6 440#define l7 494#define z1 523#define z2 587#define z3 659#define z4 698#define z5 784#define z6 880#define z7 987#define h1 1046#define h2 1174#define h3 1318#define h4 1396#define h5 1567#define h6 1760#define h7 1975#define zi 0void delay();unsigned code GP[]={zi,zi,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h1,z5,z6,z3,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h3,h1,h2,z6,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h1,z5,z6,z3,z5,z1,z2,/**/z3,h1,z6,h3,/**/h2,h3,h2,h1,h2,z6,zi,/**/z6,z6,z6,z6,h1,h2,h3,/**/z6,z6,z6,z5,z5,z6,/**/z6,z6,z6,z6,h1,h2,h3,/**/z6,z6,z6,h4,h4,h3,/**/z6,z6,z6,z6,h1,h2,h3,/**/ z6,z6,z6,z5,z5,z6,/**/z6,z6,z6,z6,h1,h2,h3,/**/h6,z5,z5,z6,z6,/**/0xff} ;//该数组保存乐谱 //高7音 h开头 中7音 z开头 低7音 l开头 休止符 zi unsigned code JP[]={8,8,8,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/ 8,8,8,8,/**/4,2,2,4,4,8,8,/**/8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/ 8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/8,8,8,2,2,2,2,/**/12,4,4,4,8,/**/ } ;//该数组保存相对应的延长,至于延长时长可参照乐谱void main(){ uchar i,j;TMOD=0x00;EA=1; //开总中断ET0=1; //开t0中断while(1){ i=0;while(GP[i]!=0xff){if(GP[i]!=0){C=460830/GP[i];TH0=(8192-C)/32;TL0=(8192-C)%32;TR0=1;}//开定时器0for(j=0;j

0;i--) {for(j=85;j>0;j--);}}void T0_time()interrupt 1{ TR0=0;beep=!beep;TH0=(8192-C)/32;TL0=(8192-C)%32;TR0=1;}

51单片机c语言编程?

对端口输出操作,直接适用赋值语句即可。 比如 P1 = 0x03;
对端口读取操作,直接赋值给局部变量即可。
对数码管操作,需要先定义 对应的 码表, Tab[16] = {, }分别对应 0~F 的端口输出值、点亮相应的LED位; 然后直接 操作端口输出对应字符即可,比如P1=Tab[3] 数码管输出显示3

网站数据信息

"c51单片机c语言教程,51单片机 c语言里 _nop_ 函数怎么用 具体一点 求高手指教"浏览人数已经达到21次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:c51单片机c语言教程,51单片机 c语言里 _nop_ 函数怎么用 具体一点 求高手指教的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!