㈠ 单片机c语言程序问题,LED闪烁灯的,初学单片机,希望高手能回答的通俗易懂些
void DelayMS(uint x)//这是个延时函数
{
uchar i;
while(x--)
{
for(i=120;i>0;i--); //for 语句后边可以接分号,意思是从120自减到1
}
}
void main()
{
while(1)//死循环,延时函数中的x变为0仍然可以闪烁的原因是一直在执行,灯亮灯灭的操作
{
LED = ~LED;//亮灭灯的操作
DelayMS(150);//延时150毫秒
}
}
//while(1)死循环,一直循环执行
LED = ~LED;//亮灭灯的操作
DelayMS(150);//延时150毫秒
这两句代码
㈡ 汇编语言或C语言编写一个控制灯闪烁的程序
我写的这个程序应该可以,按一下灯亮,再按一下灯灭
#include "REG52.H"
sbit LED1_01 = P1^1; //LED灯
sbit KEY0_01 = P1^2; //按键
void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
int main(void)
{
LED1_01 = 1; //打开LED灯点亮
while(1)
{
if(KEY0_01 == 0) //检测按键是否按下
{
Delay_1ms(10); //延时去抖动
if(KEY0_01 == 0) //确定按键按下
{
LED1_01 = ~ LED1_01; //取反LED灯 [ 亮 . 灭 ] }
while(KEY0_01 == 0); //检测松手
}
}
}
你的图里有A/D转换器
AD转换函数ADC_DIS.C
#include <REGX51.H>
#include"def.h"
#include"lib.h"
sbit adc_cs=P1^0;
sbit adc_rd=P1^1;
sbit adc_wr=P1^2;
/***ADC0804启动转换函数***/
INT8U start_ad()
{
INT8U
temp;
adc_cs=0;
adc_wr=1;
delay(1);
adc_wr=0;
delay(1);
adc_wr=1;
delay(1); //启动AD
adc_rd=1;
delay(1);
adc_rd=0;
delay(1);
temp=P2;
delay(1);
adc_rd=1;
delay(1);
//读取数据
return
temp;
}
用这个程序。
㈢ PIC12F629帮我用C语言写个程序,控制三个LED亮灭!
/******************************************************************************
*IC:PIC12F629OSC:片内4MHz
*****************************************************************************/
#include<pic.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineLED1GPIO0
#defineLED2GPIO1
#defineLED3GPIO2
#defineKEYGPIO4
/******************************************************************************
*芯片配置字
*****************************************************************************/
__CONFIG(FOSC_INTRCIO&WDTE_ON&PWRTE_ON&MCLRE_OFF&BOREN_ON);
/******************************************************************************
*函数及变量声明
*****************************************************************************/
voidinterruptISR(void);//中断处理
voidflash();//LED12Hz闪烁函数
uinttime=0;//延时用变量
ucharcnt=0;//记录按键被按下几次
/******************************************************************************
*主函数
*****************************************************************************/
voidmain()
{
//选项寄存器
OPTION_REG=0x0F;/*GPIO上拉使能
*GP2/INT端口电平下降沿触发中断
*TIMER0时钟源选择内部时钟
*TIMER0在GP2/TOCKI电平上升沿递增
*预分频器分配给WDT
*PS2:PS0=111WDT分频比1:128
*/
//中断控制寄存器
INTCON=0xC0;/*全局中断使能
*外设中断使能
*TMR0溢出中断禁止
*GP2/INT外部中断禁止
*端口电平变化中断禁止
*TMR0中断标志T0IF清零
*INT中断标志INTF清零
*电平变化中断标志GPIF清零
*/
//中断标志位寄存器
PIR1=0x00;/*EEPROM写操作完成中断标志位EEIF清零
*bit6-4位未用
*比较器中断标志位CMIF清零
*bit1未用
*TMR1溢出中断标志位TMR1IF清零
*/
//电源控制寄存器
PCON=0x00;/*bit7-2未用
*上电复位标志位清零
*欠压复位标志位清零
*/
//IO端口输入输出配置
CMCON=0x07;//关闭模拟比较器,使GP<2:0>为数字IO
TRISIO=0x38;//GP<5:3>输入GP<2:0>输出
GPIO=0x3F;//GP<2:0>输出高电平
WPU=0x30;//GP<5:4>内部弱上拉开启
IOC=0x30;//GP<5:4>端口电平变化中断使能
//Timer1控制
TMR1H=0x3C;//使TMR1溢出时间为50000个周期(50ms)
TMR1L=0xB0;
PIE1=0x01;//TMR1IE计时器1溢出中断使能
T1CON=0x01;//TMR1ON使能Timer1
//主循环
while(1)
{
if(KEY==0)//如果按键按下
{
time=0;
while(!KEY);//等待按键被松开,由中断函数计数
if(time<60)//按下时间不足50ms*60=3000毫秒
{
cnt++;//按键次数加1,改变工作状态
if(cnt>3)
{
cnt=0;
}
}
elseif(time>=60&&time<100)//按住时间3秒到5秒之间
{
LED2=!LED2;//LED2亮灭状态翻转
}
elseif(time>=100)//按住时间达到5秒
{
LED3=!LED3;//LED3亮灭状态翻转
}
}
switch(cnt)//检测按键按下次数
{
case0:LED1=1;break;//LED1熄灭
case1:LED1=!LED1;break;//LED1低亮
case2:LED1=0;break;//LED1高亮
case3:flash();break;//LED1闪烁
default:break;
}
}
}
/******************************************************************************
*中断处理函数
*****************************************************************************/
voidinterruptISR(void)
{
if(TMR1IE&&TMR1IF)//定时器1溢出中断
{
asm("CLRWDT");//定时喂狗
++time;//延时计数
TMR1H=0x3C;//重设TIMER1初始值使TMR1溢出时间为50000个时钟周期
TMR1L=0xB0;
TMR1IF=0;//定时器1溢出中断标志位清零
}
}
/******************************************************************************
*LED1闪烁函数
*****************************************************************************/
voidflash()
{
time=0;
if(time%4==0)
{
LED1=!LED1;
}
}
㈣ 一个51单片机,晶振为12MHz,让前三个LED灯分别以1ms,1s,5s的频率闪烁,怎么用c语言写,谢谢各位了~~
LED1 1ms闪烁人眼分辨不出来 定时器设定为16位定时50ms 另设一变量作定时器中断计数,到10(0.5S)的倍数时LED2取反,到50(2.5S)的倍数时LED3取反
#include<reg52.h>
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
unsigned int count;
void main()
{
TMOD=0x01; //定时器0,工作方式1
TH0=(65536-500)/256; /////////0.5ms
TL0=(65536-500)%256;
EA=1;
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void time0() interrupt 1
{
led1=~led1;
count++;
if (!(count%1000)) {led2=~led2;}
if (count==5000) {led3=~led3;count=0;}
}
led1是看不出闪烁的 太快了
㈤ 用C语言编写一个单片机控制LED灯闪烁变化的编程 急用!!!!!!!!!
C语言实现LED灯闪烁控制配套51单片机开发板。
#include //包含单片机寄存器的头文件
/****************************************
函数功能:延时一段时间
*****************************************/
void delay(void) //两个void意思分别为无需返回值,没有参数传递。
{
unsigned int i; //定义无符号整数,最大取值范围65535。
for(i=0;i<20000;i++) //做20000次空循环。
; //什么也不做,等待一个机器周期。
}
/*******************************************************
函数功能:主函数 (C语言规定必须有也只能有1个主函数)。
********************************************************/
void main(void)
{
while(1) //无限循环。
{
P0=0xfe; //P1=1111 1110B, P0.0输出低电平。
delay(); //延时一段时间。
P0=0xff; //P1=1111 1111B, P0.0输出高电平。
delay(); //延时一段时间。
}
}
单片机驱动LED灯的源程序:
#include<reg52.h> //头文件。
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P1^7; //位定义。
void delay_ms(uint);//mS级带参数延时函数。
void main()
{
while(1)
{
LED1=0;
delay_ms(1000);
LED1=1;
delay_ms(1000);
}
}
void delay_ms(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(5)c语言3个led灯闪烁扩展阅读:
单片机应用分类:
通用型:
这是按单片机(Microcontrollers)适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
总线型:
这是按单片机(Microcontrollers)是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、 数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接。
另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。
控制型:
这是按照单片机(Microcontrollers)大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型。
通常是小封装、低价格,外围器件和外设接口集成度高。 显然,上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。
参考资料来源:网络-单片机
㈥ 求51单片机C语言,一个板子上完成一部分三个开关分别控制三个led灯光亮灭(不是流水灯),
#include<reg51.h>
sbitled1=P1^0;
sbitled2=P1^1;
sbitled3=P1^2;
sbitkey1=P1^4;
sbitkey2=P1^5;
sbitkey3=P1^6;
main()
{
while(1)
{
led1=key1;
led2=key2;
led3=key3;
}
}
㈦ 谁有单片机中3个led灯闪烁控制的流程图与汇编语言,c语言程序
可以用外部中断计数,来实现流水灯的正转、暂停、以及反转和爆闪。。这是我前几天写的一个这样的程序,楼主可以结合protues 画图仿真,注意程序中所用到的IO端口就行了。
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
uchara,b;
voiddelay(ucharz)
{
uchari,j,k;
for(i=z;i>0;i--)
for(k=20;k>0;k--)
for(j=110;j>0;j--);
}
voidbegain()
{
EA=1;
EX0=1;
IT0=1;
}
voidmain()
{a=b=0;
P0=0xfe;
begain();
while(1)
{
if(a==1)
{
P0=_crol_(P0,1);
delay(50);
}
if(a==3)
{
P0=_cror_(P0,1);
delay(50);
}
if(a==4)
{
P0=0x00;
delay(50);
P0=0xff;
delay(50);
P0=0xfc;
}
if(a==5)
{
a=1;
}
}
}
voidint0()interrupt0
{
a++;
if(a==5)
{
a=1;
}
}
㈧ 用c语言编写单片机按键控制多个led灯闪烁。按一次全亮,再按次全灭;长按5s流水灯模式,再按灭。
你可以简单地认为单片机只能输出5V或者0V的电压 分别对应1和0,那么LED灯的另一端接地或者接5V,如果你 的单片机输出5V接到LED灯,LED灯另一端接地 , 那就产生电压了,电路就导通了,灯就亮了 ,反之也是这个道理。时间方面可以写大致的延时,或者用定时器,这样就比较精确了,你学会了这个就可以说入门了。
㈨ 用C语言编写一个单片机控制LED灯闪烁三次的程序,急求!
# P1上接LED等。
#include "reg51.h"
void delayms(unsigned int x)
{
int i,j;
for(i=x;i>0;i--)
for(j=0;j<120;j++);
}
void main(void)
{
char i;
for(i=0;i<6;i++)
{
P1 = ~P1;
delayms(1000);
}
while(1);
}
㈩ 用c语言编程三个按键对应点亮三个LED灯的程序,AT89S52单片机,最好有原理图,谢谢。急求
这个也求?用按键点亮LED灯这个是51入门最基础的东西,真心想学的话,买块51的开发板,都带有例程,很快就可以入门的。建议你还是多看看资料把基础的东西学好。推荐你看一下《十天学会单片机和C语言编程》的视频教程对入门还是不错的。
三路抢答器提供你编程思路(按键扫描方式)参考,程序还是要根据你的硬件电路自己编写。
端口配置:
1、选择4个端口作为输入端口连接按键(独立按键,按键一端接单片机端口,另一端接地)。 三路为抢答的按键KEY1、KEY2、KEY3,一路为抢答后复位按键KEY0。
2、选择3个端口作为输出端口连接LED灯(高电平点亮还是低电平点亮要看你电路设计)对应为LED1、LED2、LED3。
编程思路:
1、初始设置一个抢答键按下与否的位标志变量:bit flag = 0;(没有抢答按键按下flag = 0,有抢答按键按下flag = 1)。
2、主程序按键扫描循环。
3、按键按下程序KEY1、KEY2、KEY3基本相同。以KEY1为列:
首先判断是否有抢答键按下(KEY1==0),如有抢答按键按下,延时10ms(消抖),再判断是否KEY1==0,如果KEY1==0说明KEY1抢答按键已经按下,然后再判断是否flag = =0,如果flag = =0,则点亮LED1(其他按键按下的话点亮相应的LED灯)、按键按下标志置“1”(flag = 1)。
4、复位按键程序判断KEY0按下并且flag = =1时,关闭所有LED灯、按键按下标志复位置“0”(flag = 0)。