51单片机C语言编程
首先要明确单片机的端口名称一般都是规定好了的(参考该单片机的datasheet);
其次,要给某个端口赋值(1或0),还是给端口组(8位单片机一个组八个脚)赋值,这就是按位操作还是按字节操作的问题。例如:单片机有PA口,PB口,其中PA口有PA0~PA7八个脚,拉高PA口(PA = 0XFF;),拉高PA0脚(PA &=0X01;或者PA0 = 1; )。当然有些单片机是通过读写IO口输入输出寄存器来实现的。
再者,RTX,TDX两个脚应该是通信的脚,与通用IO口为复用的脚,要怎么用,怎么发送数据、接收数据就涉及到通信协议了,不同通信方式,工作方式就不一样了,具体(参考该单片机的datasheet)。
建议先仔细阅读单片机的datasheet和该单片机的编程指南(如果有的话)
希望能解决你的疑问
正确的表达式应该是:P0=number[a[0]];
这应该是从P0口输出数码管显示的段码数组,而number[ i ]是个数组即为段码表,而a[ i ] 也是一个数组,是与数码管相对应的缓冲区,而a[0]是保存第一个数码管显示的数据,例如a[0]=2; 意思是第一个数码管要显示2,把2代入段码表为number[2]; 得到2的段码,从P0口输出,即可实现第一个数码管显示2了。
// 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--);
}
brvrvrb behebhrv irvbhrorv jibbe jsbdbdj ndb.bfb jdbdjfjt jrnfbdfnx hsccevd kfnt;tgtn bhbjrbrb jenjbbvb dbdjtfbt djrbrbfbdy
单片机 用C语言怎么编程!
include <AT89X51.h> \/\/预处理命令 void main(void) \/\/主函数名 { \/\/这是第一种注释方式 unsigned int a; \/\/定义变量a 为int 类型 \/ 这是第二种注释方式 \/ do{ \/\/do while 组成循环 for (a=0; a<50000; a++); \/\/这是一个循环 P1_0 = 0; \/\/设P1.0 口为低电平,点亮LED...
单片机c语言编程100个实例
一个串行通信接口;(SCON,SBUF) 4. 一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。 C语言编程基础: 1. 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2. 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
单片机C语言编程
include<reg51.h> define uint unsigned int sbit button1=P1^0;sbit button2=P1^1;sbit led1=P0^0;sbit led2=P0^1;sbit mc1=P2^0;sbit mc2=P2^1;uint d1=0,d2=0;uint jd1,jd2;void t0isr() interrupt 1 { led1=0;TR0=0;mc1=0;} void t1isr() interrupt 3 { led2=0;...
单片机C语言编程
\/*该程序流水灯有两种模式,顺序左移和顺序右移,独立开关控制*\/ include<reg52.h> include<intrins.h> define uchar unsigned char define uint unsigned int uchar tmp,flag;sbit key1=P3^4;sbit key2=P3^5;void delay(uint z);void led();void keyscan();void main(){ tmp=0xfe;P1=...
单片机C语言程序
它整个的功能就是一个延时,等待单片机处理完其它任务,这样写程序符合程序的规范化和可读性的要求,void是说明返回值是空的,即没有返回值,可以不写,LED=~LED;\/\/是取反,每次执行这条语句就会使其值取反,若上次是0,则执行后其值变为1,DelayMS(100);就是调用了上面的子函数,代表延时100MS ...
求 单片机简单的C语言程序例子(越多越好)
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接了四个...
求一个51单片机C语言程序编程
单片机甲、乙进行双机串行通信,甲机通过串口控制乙机LED闪烁(如下图所示,要求利用芯片MAX232),双方的晶振频率均为11.0592MHz(波特率为9600kb\/s)要求:甲机按开关K1一次,发送字符“A”给乙机,点亮灯D1与D2;按开关K1两次,发送字符“B”给乙机,点亮灯D3与D4;按开关K1三次,发送字符“C...
求一个单片机c语言编程,题目要求接8个二极管,要求左循环点亮
include<reg51.h> include<intrins.h> define uchar unsigned char define uint unsigned int void DelayMS(uint x){ uchari;while(x--){ for(i=0;i<120;i++);} } \/\/主程序 void main(){ P0=0xfe;while(1){ P0=_crol_(P0,1);\/\/P0的值向左循环移动 DelayMS(150);} } ...
谁能帮我写一下单片机C语言程序?
include<reg51.h> sbit LED=P1^0;sbit K1=P1^1;sbit K2=P1^2;void delay(int ms){ unsigned char i;while(ms--)for(i=0;i<120;i++);} void t0isr(void) interrupt 1 { TH0=(65536-10000)\/256;TL0=(65536-10000)%256;LED=~LED;} main(){ TMOD=0x01;TH0=(65536-10000)\/...
单片机c语言编程
用于 做流水灯 可以让一盏灯 一直从左边移到右边 我们用 当i=1的时候 来分析 temp=0xfe=(1111 1110)执行 a=temp<>7; b=0000 0001 p1=a|b; P1=1111 1101;所以 p1就丛 1111 1110 变化成了 1111 1101 这样等就左移了一位。
仉种盐酸: 每一种单片机都有一套自己的C编译器,你可以直接用,也可以挂载到其他的编译环境中 比如 Wave6000 等 51系列的 推荐用keilV8 Microchip系列的推荐用HT-PICC 编译环境用MPLAB 然后编程代码部分你写好之后,编译,此时会生成一些文件,如*.hex ,*.bin …… 然后把.hex 文件 利用烧写器烧写到单片机里面 这样单片机就可以按照编译的程序执行了 单片机的种类不一样,程序代码也略有区别
桃城区17668851470: c语言编程c51单片机?
仉种盐酸: #include <reg51.h>#define uchar unsigned char#define uint unsigned intmain(){ uint xdata *xp;//定义指向片外RAM的指针 uint data *p;//定义指向片内RAM的指针 uchar i;//定义循环变量 xp=0x100;//指向片外RAM的100H单元 p=0x30;//指向片内RAM的30H单元 for(i=0;i<10;i++){//循环10次 *p=*xp;//将片外RAM单元中的内容传送给片内RAM单元 xp++;//指向下一个片外RAM单元地址p++;//指向下一个片内RAM单元地址}}
桃城区17668851470: 51单片机用C语言?
仉种盐酸: 如果你不急,我明天晚上可以帮你写一下,给你一点提示,OX02H.THO=(65536-400)\256.TLO=(65536-400)%256,
桃城区17668851470: 51单片机C语言编程?
仉种盐酸: 代码如下: typedef union {unsigned int myvalue; struct{ unsigned myvalueL:8; unsigned myvalueH:8; }child;}_mytype;_mytype mytype; void main(){ mytype.myvalue = 0x1234;} 仿真如下:是你要的结果吧
桃城区17668851470: 求一80C51单片机的C程序 - ?
仉种盐酸: #include unsigned char flag,num,keyn;sbit KEY=P3^0;sbit LED1=P3^4;sbit LED2=P3^5void delay(unsigned int a){ unsigned int i,j; for(i=0;i<125;...
桃城区17668851470: 51单片机c语言编程是否用到指令系统 - ?
仉种盐酸: 单纯的c语言编程时用不到系统指令的,但是c和汇编的混合编程时用的到指令系统的,然后就是你要对系统的存储有深刻的认识比如块存储,存储结构等之类的,因为c会用到很多内存操作的,这样可以提高代码运行质量
桃城区17668851470: 单片机c语言编程 - ?
仉种盐酸: 看你的单片机型号了,51单片机要求读之前写1,但如果该端口一直就作为输入的话,只要你没有特意给它赋值0,它默认就是1,可直接读. AVR单片机就要配置有关寄存器
桃城区17668851470: AT89S51单片机c语言程序的编程基础 - ?
仉种盐酸: 1、 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110.2、 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位.3、 ++var表示对变量var先增一;var—表示对变量后减一.4、 x |= 0x0f;表示为 x = x | 0x0f;5、 TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位.6、 While( 1 ); 表示无限执行该语句,即死循环.语句后的分号表示空循环体,也就是{;}
桃城区17668851470: 单片机编程(C语言)?
仉种盐酸: P2口是8位口吧, 十六进制FE是 1111 1110. P2=0XFE的意思就是把信号1111 1110(1为高电平,0为低电平)送到P2口.P2口外接LED 后LCD灯可以点亮.
桃城区17668851470: 51单片机串口通信c语言编程 - ?
仉种盐酸: 这只是个模板,参考一下/*----------------------------------------------- 名称:串口通信 网站:www.doflye.net 编写:shifang 日期:2009.5 修改:无 内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源 打开串口调试程序,将波特率设置为...