导航:首页 > 操作系统 > 51单片机c语言位

51单片机c语言位

发布时间:2022-07-12 00:39:11

A. 51单片机c语言sbit的作用是什么

在51单片机中,不能直接使用P0^0=xxx操作,因为P0^0是地址值,即指针,P0指针地址值0x80,P0^0指针地址0x81,P0^0=xxx是修改指针地址,即0x81=xxx,明显是错误的,我们想修改指针指向管脚值,必须使用位定义关键字sbit P00 = P0^0;然后P00=xxx,操作P00管脚值,即操作0x81指针指向的管脚P00的值。

B. 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. 51单片机中C语言奇偶校验位如何设置

MOV
A,
#待发数据
;数据进了A,即刻生成校验位P
MOV
C,
P
MOV
TB8,
C
;校验位送到TB8
MOV
SBUF,
A
;发送数据,以及P
上述写法,是偶校验。奇校验,需要增加一条取反指令,如下:
MOV
C,
P
CPL
C
MOV
TB8,
C
;校验位送到TB8

D. 51单片机c语言编程能给位赋值么

C语言中不能直接给二进制某一位赋值
但是可以通过按位操作来实现
如果你的P3是整型或者字符型的变量,可以通过“按位或”对某一位赋1,通过“按位与”对某一位赋0
P3=P3|0x40;//这样就是在不改变其他位的同时给第6位赋1
0x40转换成二进制位01000000
假如:P3的值为10110010
10110010
|
01000000
结果为
11110010

E. 51单片机C语言编程,是不是不能用位定义sbit来定义数组呢我试过,会报错C141,想知道个所以然。

没法定义bit数组,bit的结构体不能定义,如果是做标志的话可以这样用

unsignedintflag[100]=0;//定义1600个标志
voidSetFlag(intSetBit)//标志置1
{
flag[SetBit>>16]|=1<<(SetBit&0x0f);
}
voidClrFlag(intClrBit)//标志清零
{
flag[ClrBit>>16]&=~(1<<(ClrBit&0x0f));
}
bitReadFlag(intReadBit)//读取标志
{
returnflag[ReadBit>>16]&(1<<(ReadBit&0x0f));
}

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

给你一个矩阵键盘的参考程序
行列扫描:通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
/****************************************************************************
*函数名
: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++;
}
}
}
}

G. 51单片机C语言程序注释标注(写全)

#include<reg51.h>//调用头文件reg51.h
voidmain()//主函数
{
unsignedchar//无符号字符型
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//定义一个数组LED数码管译码用的码表
while(1)//主循环
{
P2=P2|0x07;//P2口与0x07按位进行或运算
while(P2&0x07==0x07);//如果P2扣低三位为111则原地等待
switch(P2&0x07)//获取P2低三位值并且据此执行响应的操作
{
0x06:P0=tab[0x0D];break;//P2低三位为06H,数码管显示“d”
0x05:P0=tab[0x0E];break;//P2低三位为05H,数码管显示“E”
0x03:P0=tab[0x0F];break;//P2低三位为03H,数码管显示“F”
}
}
}

H. 51单片机c语言编程

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

I. 51单片机C语言

先定义一个unsigned int 型的变量temp,
然后angle[0]乘以10000,结果给temp,
然后将temp分离,逐个给table的元素。
具体实现代码如下:

unsigned int temp;
temp = (unsigned int)(angle[0]*10000);
table[0] = temp/10000;
table[1] = '.';
table[2] = temp%10000/1000;
table[3] = temp%1000/100;
table[4] = temp%100/10;
table[5] = temp/10;
如果你是用来在1602显示的话,还有转换成ASCII码,在每个数组元素后面+'0'即可。

J. 51单片机中C语言奇偶校验位如何设置

在51单片机中,只要将一个值传送给累加器,这个数的奇偶校验值就会影响P。一般而言,在串行通讯中为确保传输数的准确,用到校验位的情况比较多。以下是程序代码:

#include<reg51.h>

main()
{
char dat;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0xd0;
while(1)
{
dat++;
ACC=dat;
TB8=P; //校验位送第九数据位TB8
SBUF=ACC;
while(TI==0);
TI=0;
}
}

阅读全文

与51单片机c语言位相关的资料

热点内容
程序员那么可爱25集 浏览:753
服务器地址和ip地址一样不 浏览:664
php中括号定义数组 浏览:602
php打印堆栈 浏览:516
华为adb命令行刷机 浏览:965
人像摄影pdf 浏览:761
解压文件密码怎样重新设置手机 浏览:1001
高考指南pdf 浏览:695
爬虫python数据存储 浏览:240
u盘怎么取消加密 浏览:431
567除以98的简便算法 浏览:342
pdf手机如何解压 浏览:21
python描述器 浏览:60
战地联盟3解压密码 浏览:805
s型命令 浏览:25
php年薪5年 浏览:71
如何上网上设个人加密账户 浏览:44
linux打开ssh服务 浏览:78
微信位置可以加密吗 浏览:470
算法蛮力法 浏览:438