㈠ 单片机c程序
定义一个uchar类型的数组Display_Digit。数组的元素有4个,且初始值都为0。Display_Digit[] 中括号里没有数字是因为它所有的元素都列出来了,所以可以省略。uchar类型是unsigned char, 没有符号位,因此能表示0~255。这个类型应该可以跟踪到他的定义,一般是一个宏定义: #define uchar unsigned char
㈡ 51单片机的c语言程序
请你参考:
#include<reg51.h>
unsignedchari;
voidDelayms(unsignedintx)
{
unsignedchart;
while(x--)
for(t=0;t<120;t++);
}
voidmain()
{
IT1=1;
IE|=0x84;
P2=0xFE;
i=1;
while(1);
}
voidEX1_INT()interrupt2
{
ET0=0;
Delayms(10);
P2=~(1<<i);
i=++i%8;
ET0=1;
}
㈢ 关于单片机的一个c程序
修改switch里面内容就可以了。
switch(number)
{
case 0:P2=0x01;P0=distab[1];break;
case 1:P2=0x02;P0=distab[3];break;
case 2:P2=0x04;P0=distab[4];break;
case 3:P2=0x08;P0=distab[6];break;
case 4:P2=0x10;P0=distab[2];break;
case 5:P2=0x20;P0=distab[5];break;
default:break;
}
㈣ 51单片机C程序
sfr
P0M1
=
0X93;
sfr
P0M0
=
0X94;
sfr
P1M1
=
0X91;
sfr
P1M0
=
0X92;
sfr
P2M1
=
0X95;
sfr
P2M0
=
0X96;
这一段是对通用IO的设置寄存器定义为好记的变量名。具体是什么寄存器你就得结合手册查一下,估计是设置IO口方向、内部上来电阻之类的,或者是配置给某些内部器件如PCA计数器、定时器、计数器等。
至于下面的应该是电磁波或者超声测距之类的算法!!
看起来不是很复杂。
你要是抄板子的话就得想办法知道原来用的什么MCU!再找到它的手册!
有兴趣的话可以研究一下!
[email protected]
㈤ 单片机C程序
这是个软件模拟时序实现SPI的函数.
SPI
有四条线
MOSI
MISO
CS
CLK,
在输出1个字节的时候,同时输入1个字节.
MOSI
mater
OUtput
,
slave
input
就是主机输出,从机输入.
MISO反之.
----
你可以搜下SPI接口的应用.
在这个程序中,应该是51系列单片机的程序.
MOSI
MISO
等等,,这些是个IO口.
上面应该有定义SBIT
MOSI=PX^X
㈥ 求 单片机简单的C语言程序例子(越多越好)
我前几天刚在网上看到的,不知道对你有没有用》
1. 闪烁灯
1. 实验任务
如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2. 电路原理图
图4.1.1
3. 系统板上硬件连线
把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4. 程序设计内容
(1). 延时程序的设计方法
作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:
如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒
机器周期 微秒
MOV R6,#20 2个机器周期 2
D1: MOV R7,#248 2个机器周期 2 2+2×248=498 20×
DJNZ R7,$ 2个机器周期 2×248 498
DJNZ R6,D1 2个机器周期 2×20=40 10002
因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:
DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET
(2). 输出控制
如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5. 程序框图
如图4.1.2所示
图4.1.2
6. 汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}
2. 模拟开关灯
1. 实验任务
如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
2. 电路原理图
图4.2.1
3. 系统板上硬件连线
(1). 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上;
(2). 把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;
4. 程序设计内容
(1). 开关状态的检测过程
单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。
(2). 输出控制
如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5. 程序框图
图4.2.2
6. 汇编源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND
7. C语言源程序#include <AT89X51.H>sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; //灯亮}else{L1=1; //灯灭}}}
3. 多路开关状态指示
1. 实验任务
如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
2. 电路原理图
图4.3.1
3. 系统板上硬件连线
(1. 把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;
(2. 把“单片机系统”区域中的P1.4-P1.7用导线连接到“四路拨动开关”区域中的K1-K4端口上;
4. 程序设计内容
(1. 开关状态检测
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
(2. 输出控制
根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
5. 程序框图
读P1口数据到ACC中
ACC内容右移4次
ACC内容与F0H相或
ACC内容送入P1口
<![endif]-->
图4.3.2
6. 方法一(汇编源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORl A,#0F0HMOV P1,ASJMP STARTEND7. 方法一(C语言源程序)#include <AT89X51.H>unsigned char temp;void main(void){while(1){temp=P1>>4;temp=temp | 0xf0;P1=temp;}}8. 方法二(汇编源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9. 方法二(C语言源程序)#include <AT89X51.H>void main(void){while(1){if(P1_4==0){P1_0=0;}else{P1_0=1;}if(P1_5==0){P1_1=0;}else{P1_1=1;}if(P1_6==0){P1_2=0;}else{P1_2=1;}if(P1_7==0){P1_3=0;}else{P1_3=1;}}}
先给你,传不上 太多了
㈦ 单片机C语言程序
把蜂鸣器响一次的程序封装成一个函数,然后根据灯光闪烁的情况判断,判断如果是第一个灯就运行一次蜂鸣器响的函数一次,如果是第二个灯就运行二次蜂鸣器响的函数,以此类推。
㈧ 求单片机c经典程序!!!
这是数字温度计的程序,从DS18B20数字温度传感器中读取温度,然后显示在数码管上!DS18B20数字温度传感器采用了单总线通讯方式(即采用一根线完成所有信号的传送),并且对时序要求比较高,看程序时要结合DS18B20数字温度传感器的时序图去看。
#include<reg52.h>
#include<intrins.h>
sbit sjx=P1^6; //ds18b20数据线接口位声明
sbit x1=P1^0;
sbit x2=P1^1;
sbit x3=P1^2;
sbit x4=P1^3;
unsigned char wei1,wei2,wei3,zf;
unsigned int wen,zijie=0;
unsigned char wdjc[2]={0,0};
int bb=0;
unsigned char code xianshima[] //0~9的显示码
={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,};
void xianshi(); //显示子程序声明
void yanshi(unsigned int z); //延时子程序声明
void reset(); //复位子程序声明
void chushihua (); //初始化子程序声明
void quwen(); //读取温度子程序声明
void xie(char); //向18b20写字节子程序声明
unsigned int (); //从18b20读字节子程序声明
void yanshi_18B20(unsigned int); //18b20延时子程序声明
main() //主函数
{
chushihua();
quwen();
yanshi(1000);
EA=1; //总中断允许
ET0=1; //定时器0中断允许
TMOD=0x01;
TH0=(65535-15535)/256;
TL0=(65535-15535)%256;
TR0=1; //定时器0启动
// chushihua();
while(1) //使程序循环
{
// chushihua(); //调用初始化子程序
// quwen(); //调用读取温度子程序
xianshi(); //调用显示子程序
}
}
void chushihua (void) //初始化子程序
{
reset(); //复位
xie(0xCC); //跳过序列号
xie(0x44); //温度转换命令
}
void quwen(void) //读取温度子程序
{
int k,i;
int wd; //存放读取的温度值 将其除以16即为得到的值
reset(); //复位
k++; //延时4us
xie(0xCC); //跳过序列号
k++; //延时4us
xie(0xBE); //发出读指令
k++;k++; //延时8us
wdjc[0]=(); //读取低字节
wdjc[1]=(); //读取高字节
i=wdjc[1]; //把第二个字节先存至低8位
i<<=8; //把第二个字节移到高八位上去
i|=wdjc[0]; //把第一个字节放到底八位上去
if( (wdjc[1]&0x08)) //去除的到数据的数据位,得到符号位
{
wd=0xffff-i+1; //如果为负温则去除其补码
zf=0; //表示温度为负数
}
else
{
wd=i; //如果为正温度则只直接赋予wd
zf=1; //表示温度为正数
}
wen=wd*10/16; //获取的温度转换成十进制温度数值的10倍
}
/*
数码管接线说明:
P2口接共阴极数码管段选(从低位到高位依次接数码管的a~h)
P1.0接数码管第一位的阴极,P1.1接数码管第二位的阴极,
P1.2接数码管第三位的阴极,P1.3接数码管第四位的阴极。
*/
void xianshi() //显示子程序
{
wei1=wen/100%1000%100%10;
wei2=wen/10%10000%1000%100%10;
wei3=wen/1%100000%10000%1000%100%10;
if(zf==0){x1=0;x2=1;x3=1;x4=1;P2=0x40;} //正负号显示
yanshi(5);
x1=1;x2=0;x3=1;x4=1;
P2=xianshima[wei1];
yanshi(5);
x1=1;x2=1;x3=0;x4=1;
P2=xianshima[wei2]+0x80; //小数点显示+80H
yanshi(5);
x1=1;x2=1;x3=1;x4=0;
P2=xianshima[wei3];
yanshi(5);
}
void yanshi(unsigned int z) //延时子程序
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void yanshi_18B20(unsigned int ys) //18b20延时子程序
{
for(;ys>0;ys--);
}
void reset() //18b20复位子程序
{
sjx = 0;
yanshi_18B20(44);
sjx = 1;
yanshi_18B20(15);
}
unsigned int () //读18b20子程序
{
unsigned char i;
for (i=8;i>0;i--)
{
zijie>>=1;
sjx = 0;
_nop_();_nop_();_nop_();_nop_();
sjx = 1;
if(sjx)
{
zijie|=0x80;
}
yanshi_18B20(4);
}
return(zijie);
}
void xie(char xzj) //写18b20子程序
{
unsigned char i,j;
for (i=8; i>0; i--)
{
sjx = 0;
j++;
sjx = xzj&0x01;
yanshi_18B20(8);
sjx = 1;
j++;
xzj>>=1;
}
}
void time0() interrupt 1 //中断服务程序
{
TH0=50000/256;
TL0=50000%256;
bb++;
if(bb==50)
{
bb=0;
chushihua();
quwen();
}
}
㈨ 单片机c语言程序
最近刚学完51单片机,对这个比较了解,这是典型的双机通信问题,很简单,以下是根据你提供的原理图写的程序,只需要把对应程序生成的hex文件,加载到单片机内,再运行即可显示,按一下加1,显示范围:10-19;
发送机程序:
/*发送单片机*/
#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitkey=P3^7;
voiddelay(uintt)
{
uinti;
while(t--)
for(i=0;i<200;i++);
}
voidserial_initial()
{
TMOD=0x20;
TH1=0xfa;//bps9600
TL1=0xfa;
TR1=1;
SCON=0x50;//SM0=0;SM1=1;REN=1
PCON=0x80;
}
voidmain()
{
ucharnum;
serial_initial();
num=10;//设置初始值为10,可根据需要修改
while(1)
{
if(key==0)
{
SBUF=num;
if(TI==1)
TI=0;
delay(100);
num++;
if(num==19)//设置结束值为19,可根据需要修改
num=10;
}
}
}
接收机程序:
#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodedis_code[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
ucharnum=0,n1=0,n2=0;
voiddelay(uintt)
{
uinti;
while(t--)
for(i=0;i<200;i++);
}
voidserial_initial()
{
TMOD=0x20;
TH1=0xfa;//bps9600
TL1=0xfa;
TR1=1;
SCON=0x50;//SM0=0;SM1=1;REN=1
PCON=0x80;
EA=1;//打开串口中断
ES=1;
}
voiddisplay_num()//显示接收的数字
{
n1=num%10;
n2=num/10;
P2=dis_code[n1];
delay(10);
P0=dis_code[n2];
delay(10);
}
voidmain()
{
serial_initial();
while(1)
{
display_num();
}
}
voidserial()interrupt4
{
if(RI==1)
{
RI=0;
num=SBUF;
}
}
原理图:
㈩ 简单的51单片机键盘C程序
A|=B;
等价于
A=A|B;
是先进行或运算,再把运算结果赋给A,之后的A已经不是原来的A了。
第一个键值判断后,你就键值变量已经被赋予新的值了。
如果正好按的是第一个键则能返回1,
如果不是第一个键按下,但经过
if((keyvalue|=0xfb)!=0xff)这一判断,其中的“keyvalue|=0xfb”就把keyvalue变成0xff了,后面的判断条件自然不会满足。
把这里的一些等于号再去掉试试看。
另外,建议你对于按键扫描程序使用switch
case
语句,这样条理更清晰。
/*按键获取程序*/
unsigned
int
Key()
{
uchar
keyvalue;
keyvalue=P3;
keyvalue|=0xc3;
if((keyvalue|0xc3)==0xff)
{
Delay(10);
if((keyvalue|0xc3)==0xff)
{
return(0);
}
}
else
{
Delay(10);
if((keyvalue|0xc3)!=0xff)
{
if((keyvalue|0xfb)!=0xff)
{
return(1);}
if((keyvalue|0xf7)!=0xff)
{
return(2);}
if((keyvalue|0xef)!=0xff)
{
return(3);}
if((keyvalue|0xdf)!=0xff)
{
return(4);}
}
}
}