当前位置:首页 » 编程语言 » 单片机c语言编程指令
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

单片机c语言编程指令

发布时间: 2023-03-29 10:53:27

㈠ pic系列单片机用c语言编程时,让他执行A/D转换的指令是什么

在C语言里没有指令,只有语句,用C语言执行A/D转换如下:
//A/D转换初始化子程序
void
adinitial()
{
ADCON0=0x41;
//选择A/D通道为RA0,且打开A/D转换器
//在工作状态,使A/D转换时钟为8Tosc
ADCON1=0X8E;
//转换结果右移,及ADRESH寄存器的高6位为"0"
//把RA0口设置为模拟量输入方式
ADIE=1;
//A/D转换中断允许
PEIE=1;
//外围中断允许
TRISA0=1;
//设置RA0为输入方式
}
//读ADRESH寄存器就能得到AD转换值了,
汇编的如下:
ADINT
MOVLW
0X51
MOVWF
ADCON0
;选择A/D转换通道为RA2,且打开A/D在工
;作状态,并使A/D转换时钟为8tosc
BANKSEL
ADCON1
;选BANK1体
MOVLW
0X80
MOVWF
ADCON1
;转换结果右移,即ADRESH寄存器的高6位;为“0”,且把RA2口设置成模拟量输入口
CLRF
PIE1
;禁止其它中断
BSF
PIE1,ADIE
;A/D转化中断允许
BSF
TRISA,2
;设置RA2口为输入方式
BSF
INTCON,PEIE
;外围中断允许
BSF
INTCON,GIE
;总中断允许
BCF
STATUS,RP0
;返回BANK0
RETURN

㈡ 单片机c语言编程

问题在变量申明,修改为脊掘:猛厅

#include"reg52.h"
typedefunsigned樱知核charu8;
typedefunsignedintu16;

sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;

sfrGPIO_KEY=0x90;
sfrGPIO_DIG=0x80;

u16KeyValue;

u8codesmgan[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

voiddelay(u16i)
{
while(i--);
}

voidKeyDown()
{
u8a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(1000);
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))
{
delay(1000);
a++;
}
}
}
}
voidmain()
{
LSA=0;
LSB=0;
LSC=0;
while(1)
{
KeyDown();
GPIO_DIG=smgan[KeyValue];
}
}

㈢ 51单片机c语言 _nop_()是一个空指令短时间延时的空几个机器周期

这个_nop_()等效与汇编里面的,NOP指令,也就是空一个机器周期,如果是传统51单片机的话,等于空12个时钟周期【即一个机器周期】,操作方法如下:

1、首先,可以利用keil来进行模拟实验,观察软件所显示的数值,然后再进行相关的运算,即可得出结果。

㈣ 单片机 用C语言怎么编程!

每一种单片机都有一套自己的C编译器,你可以直旦悔接用,也可以挂载到其他的编译环境模衡正中
比如
Wave6000

51系列的
推荐用keilV8
Microchip系列的推荐用HT-PICC
编译环境用MPLAB
然后编程代码部分你写好之后,编译,此时会生成一些文件,如*.hex
,*.bin
……
然后把.hex
文件拦碰
利用烧写器烧写到单片机里面
这样单片机就可以按照编译的程序执行了
单片机的种类不一样,程序代码也略有区别

㈤ C语言单片机的指令

楼上的答案是c语言整个程序的大循环,是个死循环。在整个程序中只能出先一次,在大括号里面放整个程序的所有函数,让单片机不停的循环所有的函数。而你所说的暂停指令也是在一个地方等待,单是必须要兆袜有条件跳蔽唯出循环。例宏猜培如while(判断条件);
当条件为真的时候就在那里等待,当条件为假的时候执行下面的语句。汇编中也有相似的指令,例如:
djnz
rn
,$。

㈥ 51单片机C语言编程

// 51单片机C语言编程,这个时钟+秒表可以参考一下。

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit qingling=P1^0; //清零

sbit tiaofen=P1^1; //调分

sbit tiaoshi=P1^2; //调时

sbit sounder=P1^7; //naozhong

uint a,b;

uchar hour,minu,sec, //时钟

hour0,minu0,sec0,//秒表

hour1,minu1,sec1;

h1,h2,m1,m2,s1,s2,//显示位

k,s;//状态转换标志

uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*****************函数声明***********************/

void keyscan();

void init();

void delay(uchar z);

void display(uchar,uchar,uchar);

void sounde();

/*****************主函数*************************/

void main()

{

init();

while(1)

{

while(TR1)

{

keyscan(); //扫描函数

while(s==1) //s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间(也是通过调时,调分函数);

{ //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响(一分钟后自动关闭,可手动关闭)。再次切换,s=0.

keyscan(); //s状态切换(0-》1-》2-》0)通过外部中断1实现。

display(hour1,minu1,sec1); //闹钟时刻显示

}

display(hour0,minu0,sec0);//时钟表显示

while(k) /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。0秒表关;1秒表从零计时;2秒表停,显示计时时间*/

{

display(hour,minu,sec); //秒表显示

}

}

}

}

/*****************初始化函数***********************/

void init()

{

a=0;

b=0;

k=0;

s=0;

hour0=0;

minu0=0;

sec0=0;

hour=0;

minu=0;

sec=0;

hour1=0;

minu1=0;

sec1=0;

TMOD=0x11; //定时器0,1工作于方式1;赋初值

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

EX0=1; //秒表中断

EX1=1; //闹钟设定中断

ET0=1;

ET1=1;

IT0=1; //边沿触发方式

IT1=1;

PX0=1;

PX1=1;

TR0=0; //初始,秒表不工作

TR1=1; //时钟一开始工作

}

/*****************定时器0中断*************/

void timer0_int() interrupt 1 //秒表

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

a++;

if(a==2)

{

a=0;

sec++;

if(sec==100)

{

sec=0; //毫秒级

minu++;

if(minu==60)

{

minu=0; //秒

hour++;

if(hour==60) //分

{

hour=0;

}

}

}

}

}

/*************外部中断0中断函数************/

void ex0_int() interrupt 0

{

k++;

if(k==3)

k=0;

if(k==1)

{

TR0=~TR0;

if(TR0==1)

{

hour=0;

minu=0;

sec=0;

}

}

if(k==2)

{

TR0=~TR0;

}

}

/*************外部中断1中断函数************/

void ex1_int() interrupt 2

{

s++;

if(s==3)

s=0;

}

/*************定时器1中断****************/

void timer1_int() interrupt 3 //控制时钟工作

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(s==2)

{

if(hour1==hour0 && minu0==minu1)

sounde();

}

b++;

if(b==20)

{

b=0;

sec0++;

if(sec0==60)

{

sec0=0;

minu0++;

if(minu0==60)

{

minu0=0;

hour0++;

if(hour0==24)

hour0=0;

}

}

}

}

/*************键盘扫描****************/

void keyscan()

{

if(s==1)

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec1=0;

minu1=0;

hour1=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu1++;

if(minu1==60)

{

minu1=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour1++;

if(hour1==24)

{

hour1=0;

}

while(!tiaoshi);

}

}

else //调整时钟时间

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec0=0;

minu0=0;

hour0=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu0++;

if(minu0==60)

{

minu0=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour0++;

if(hour0==24)

{

hour0=0;

}

while(!tiaoshi);

}

}

}

/*************显示函数****************/

void display(uchar hour,uchar minu,uchar sec)

{

h1=hour/10;

h2=hour%10;

m1=minu/10;

m2=minu%10;

s1=sec/10;

s2=sec%10;

P0=0xff;

P2=table[h1];

P0=select[7];

delay(5);

P0=0xff;

P2=table[h2];

P0=select[6];

delay(5);

P0=0xff;

P2=0x40;;

P0=select[5];

delay(5);

P0=0xff;

P2=table[m1];

P0=select[4];

delay(5);

P0=0xff;

P2=table[m2];

P0=select[3];

delay(5);

P0=0xff;

P2=0x40;

P0=select[2];

delay(5);

P0=0xff;

P2=table[s1];

P0=select[1];

delay(5);

P0=0xff;

P2=table[s2];

P0=select[0];

delay(5);

}

/*************闹钟函数****************/

void sounde()

{

sounder=~sounder;

}

/*************延时函数****************/

void delay(uchar z)

{

int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

㈦ 单片机C语言有哪些常用函数和指令

C语言可以用的,在单片机上几乎都可以用。

㈧ 单片机C语言编程

//程序已经改正。

//使用putchar相关函数时,不可同时使用中断,但可以使用scanf。

//美化输入、输出。

//判定a时应该按照字符处理。

#include<reg52.h>

#include<stdio.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharchoose=0,flag1=0,flag2=0,flag3=0,a=0;//choose——选择,flag1——选择输入结束标记,flag2——选择计算标记,flag3——n输入结束标记

intn; //n——计算值

floatd;//d——计算结果

voidinit(){

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

TR1=1;

//SCON=0x50;

SM0=0;

SM1=1;

REN=1;

EA=1;

ES=0;

TI=1;

}

floatcount(intc){

floatb;

b=c*(1+c)/2;

returnb;

}

voidmain(){

init();

while(1){

printf("Pleaseinputcommand->");

scanf("%c",&a); //无命令时在此处等待。

flag1=1;

if(a=='1'){

choose=0;

flag3=1;

}

if(a=='2'){

choose=1;

}

if((a!='1')&&(a!='2')){

choose=2;

}

printf(" "); //换行。

switch(choose){

case0:

puts("->Turnoncount!");

break;

case1:

puts("->Turnoffcount!");

printf("-------------------------------------------- "梁孙); //更改输出格式定义。

break;

case2:

puts("->Error!");

printf("-------------------------------------------- "); //更改输出格式定义。

break;

}

if(flag3==1){

flag3=0;

printf("Pleaseinputnthenpushenter:"); //更改输出格式定义。

scanf("%d",&n);

getchar(); //吸收回车。

printf("n=%d ",n); //更改输出格式定义。

d=count(n);

printf("Theresultis%f ",d); //更改输出格式定义。

printf("-------------------------------------------- "); //更改输橡野链出格式脊歼定义。

}

}

}

㈨ 单片机的C语言编程

#include <AT89X51.h> //包含头文件
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义数码管位选码
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//定义数码管段选码
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10}; //显示码数组,因为只用了六个数码管,所以将最后两位赋值为10对应与段码0x00,表示不亮
unsigned char temp[8]; //暂存数组
unsigned char dispcount; //扫描位的记录
unsigned char T0count; //计数次数
unsigned char timecount; //定时器5ms中断的次数
bit flag; //定义标志位
unsigned long x; //定义变量用来存放频率值

void main(void)
{
unsigned char i;

TMOD=0x15; //定义定时器0为计数方式,定时器1为记时方式,均工作在方式1
TH0=0; //定时器0初值高8位为0
TL0=0; //定时器0初值低8位为0
TH1=(65536-5000)/256; //定时器1初值高8位
TL1=(65536-5000)%256; //定时器1初值低8位,即定时5ms
TR1=1;//启动定时器1
TR0=1;//启动定时器0
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
EA=1; //开总中断

while(1)
{
if(flag==1) //如果定时时间到了1s
{
flag=0; //标志位清零
x=T0count*65536+TH0*256+TL0; //获得整型的频率值,T0count计数器在1s内溢出的次数,每中历溢出一次就计数了T0count*65536次,再加上当前计数寄存器的值即为实际计数总数
for(i=0;i<8;i++)
{
temp[i]=0; //暂存缓冲区清零
}
i=0;
while(x/10) //将频率值的每一位分离出来,存进temp数组,例如63239分离为6、3、2、3、9
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;

for(i=0;i<6;i++)
{
dispbuf[i]=temp[i]; //将暂存数组卖春搜的数据赋给显示数组
}
timecount=0; //记时清零
T0count=0; //计数清零
TH0=0; //森瞎定时器0初值清零
TL0=0; //定时器0初值清零
TR0=1; //重新启动定时器0,其实是作为计数器来用
}
}
}

void t0(void) interrupt 1 using 0 //每个计数中断一次
{
T0count++; //计数加一
}

void t1(void) interrupt 3 using 0 //5ms产生一次中断
{
TH1=(65536-5000)/256; //
TL1=(65536-5000)%256; //重装初值
timecount++;
if(timecount==200) //当timecount=200时,即为1s
{
TR0=0; //关闭定时器0,为了读出定时器0计数个数
timecount=0; //timecount清零,重新计时
flag=1; //置标志位通知主程序1s已到
}
/**********以下为数码管扫描部分**********/
//因为放在该中断程序中,故每5ms扫描一位数码管
P2=0xff; //先关闭所有数码管
P0=dispcode[dispbuf[dispcount]]; //先确定相应数码管的段码,送入段码
P2=dispbit[dispcount]; //送入位码
dispcount++; //下一次应该扫描下一位数码管所以要加一
if(dispcount==8) //因为共有8个数码管
{
dispcount=0; //扫描完第7个,回头扫描第0个
}
}

㈩ 单片机c语言编程

单片机的外部结构:

DIP40双列直插;
P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)
电源VCC(PIN40)和地线GND(PIN20);
高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)
内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)
程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)
P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1
单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)

四个8位通用I/O端口,对应引脚P0、P1、P2和P3;
两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)
一个串行通信接口;(SCON,SBUF)
一个中断控制器;(IE,IP)
针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。
C语言编程基础:

十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
++var表示对变量var先增一;var—表示对变量后减一。
x |= 0x0f;表示为 x = x | 0x0f;
TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;}
在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P1.3
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCC
While( 1 ); //死循环,相当 LOOP: goto LOOP;
}
注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。
在某引脚输出低电平的编程方法:(比如P2.7引脚)
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2.7
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口。
{
P2_7 = 0; //给P2_7赋值0,引脚P2.7就能输出低电平GND
While( 1 ); //死循环,相当 LOOP: goto LOOP;
}

在某引脚输出方波编程方法:(比如P3.1引脚)
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P3.1
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{
P3_1 = 1; //给P3_1赋值1,引脚P3.1就能输出高电平VCC
P3_1 = 0; //给P3_1赋值0,引脚P3.1就能输出低电平GND
} //由于一直为真,所以不断输出高、低、高、低……,从而形成方波
}

将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) )
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P1_1 = 1; //初始化。P1.1作为输入,必须输出高电平
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{
if( P1_1 == 1 ) //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC
{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND
else //否则P1.1输入为低电平GND
//{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND
{ P0_4 = 1; } //给P0_4赋值1,引脚P0.4就能输出高电平VCC
} //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平
}

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )
#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3
void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口
{
P3 = 0xff; //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平
While( 1 ) //非零表示真,如果为真则执行下面循环体的语句
{ //取反的方法是异或1,而不取反的方法则是异或0
P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出
} //由于一直为真,所以不断将P3取反输出到P2
}
注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。