首页系统单片机编程数字代码,单片机系统编程

单片机编程数字代码,单片机系统编程

编程之家2026-05-171092次浏览

这篇文章给大家聊聊关于单片机编程数字代码,以及单片机系统编程对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

单片机编程数字代码,单片机系统编程

51单片机的编程问题

1:C51编译器如何区分位地址和字节地址

是靠预定义实现的,比如:sfr P0= 0x80; sbit P0_0= 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P0.0位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:

C51语句: P0= 1;

P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P0.0脚将输出高电平(其实是呈现高阻态,P0口独有的),其他.1-.7脚输出低电平。

C51语句: P0_0= 1;

P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P0.0将输出高阻态。而P0.1-.7不会变化。

单片机编程数字代码,单片机系统编程

2:C51为什么要嵌套汇编

51单片机一个显著优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例:

汇编程序单独保存一个文件,加入到工程中,函数如下:

_proc_a:

mov a, r7

inc a

单片机编程数字代码,单片机系统编程

mov r7, a

ret

用c语言在.h文件中声明: extern unsigned char proc_a(unsigned char val);

调用时形如: retvalue= proc_a(0x11);

说明:

a:汇编程序如果带参数,则需要在汇编程序前多加一个下划线。而声明它的地方不用加(伟福编译器这么要求的)。

b:函数的形参中第一参数用R7传递,函数返回值用R7返回,这是C51的通用规范。其他参数都有相应规定。函数可以返回一个位,用psw的c位返回。c:上面的语句,执行顺序是把0x11给R7,然后跳转子程序,子程序将它加1后送回。

d:函数跳转到汇编程序时,本区的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考虑调用后是否要恢复这些常规资源。上例中,A的值被函数使用了,编程者不必恢复调用前的值。

单片机控制多位数码管的电子时钟程序

用单片机控制多位数码管的电子时钟,用独立按键进行控制,可显示时间,日期,有闹钟功能,独立按键进行时间日历,闹钟设置

软件编程: keil工程C语言代码:

/***************************************项目名称:数码管电子时钟实现功能:数码管显示时间、日期,时间、日期可调,可设置闹钟,闹铃响一分钟。****************************************/#include reg52.h#define uint unsigned int#define uchar unsigned char uint numwe,tt,t,numdu,set,aclock,rili; unsigned long int time,time1=0; unsigned long int second,minute,hour,year=2012,month=12,day=31; uchar code du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar code we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar Mth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//每月对应的天数 uchar YMth[13]={0,2,9,2,1,2,1,2,2,1,2,1,2}; sbit dula=P2^0; sbit wela=P2^1; sbit KEY0=P3^2;//选位 sbit KEY1=P3^1;//加一 sbit KEY2=P3^0;//设闹铃 sbit KEY3=P3^3; sbit beep=P2^2;//响铃 void Delay(uint del);//延时程序 void Display(uint sd,uint mm,uint hy);//显示程序 void add();//加一 void alarmclock();//闹钟 void init();//初始化 int clock();//计算时间 void Calender();//计算日期 void main(){ P2=0xff; init(); while(1){ add(); if(rili==1)//分日历和时间显示 Display(day,month,year); else Display(second,minute,hour); alarmclock();}} void Display(uint sd,uint mm,uint hy){ int y0,y1,y2; if(rili==1){ y0=hy/1000,y1=hy%1000;y2=hy%100;} for(numwe=0;numwe8;numwe++){ P0=0xff; wela=1; P0=we[numwe]; wela=0; P0=0xff; dula=1; switch(numwe){ case 0: P0=(tt==1set==1)?0x00:(rili==1)?du[y0]:du[hy/10];break; case 1: P0=(tt==1set==2)?0x00:(rili==1)?du[y1/100]:du[hy%10];break; case 2: P0=(rili!=1)?0x40:(tt==1set==3)?0x00:du[y2/10];break; case 3: P0=(tt==1set==4)?0x00:(rili==1)?du[hy%10]+0x80:du[mm/10];break; case 4: P0=(tt==1set==5)?0x00:(rili==1)?du[mm/10]:du[mm%10];break; case 5: P0=(rili!=1)?0x40:(tt==1set==6)?0x00:du[mm%10]+0x80;break; case 6: P0=(tt==1set==7)?0x00:du[sd/10];break; case 7: P0=(tt==1set==8)?0x00:du[sd%10];break;} dula=0; Delay(5);}} void init()//初始化{ wela=0; dula=0; TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;//定时器高八位//定时5ms TL0=(65536-50000)%256;//定时器低八位 IE=0x8f;//开启中断 TCON=0x15;//启动定时器及工作方式} int clock()//计算时间{ if(t==10|t==20) tt=!tt;//闪烁标志位 if(t==20){ t=0; if(!(set!=0aclock==0)) time++; if(time=time1timetime1+60) beep=0; else beep=1; Calender(); if(aclock==0){ second=time%60; minute=(time%3600)/60; hour=time/3600; if(hour==24){ time=0; hour=0;}} else{ second=time1%60; minute=(time1%3600)/60; hour=time1/3600; if(hour==24){ time=0; hour=0;}}}} void Delay(uint del){ uint i,j; for(i=0; idel; i++) for(j=0; j100; j++);} void timer0() interrupt 1//定时器0中断{ TH0=(65536-50000)/256;//定时器高八位//定时5ms TL0=(65536-50000)%256;//定时器低八位 t++; clock();} void settime() interrupt 0//it0{ if(KEY0==0){ Delay(2); if(KEY0==0){ if(rili!=1){if(set==2|set==5) set=set+2; else set++;} else set++; if(set==9){set=0;t=0;}//while(!KEY0);}}} void calendar() interrupt 2//日历{ if(KEY3==0){ Delay(2); if(KEY3==0) rili=!rili; set=0;aclock=0;}} void Calender()//计算日历{ if(time==86400){ day++; if((year%4==0year%100!=0)|(year%400==0)) Mth[2]=29; else Mth[2]=28; if(dayMth[month]){ day=1; month++; if(month12){month=1; year++;}}}} void add()//自加一{ int ge,ge1,ge2,shi,shi1,shi2,bai2,qian2; if(rili==1){ ge=day%10;ge1=month%10;ge2=year%10; shi=day/10;shi1=month/10;shi2=year%100/10; bai2=year%1000/100;qian2=year/1000;}else{ ge=second%10;ge1=minute%10;ge2=hour%10; shi=second/10;shi1=minute/10;shi2=hour/10;} if(KEY1==0){ Delay(2); if(KEY1==0){ if(rili==1){ if((year%4==0year%100!=0)|(year%400==0)) YMth[2]=10; else YMth[2]=9; switch(set){ case 1:qian2=(qian2+1)%10;break; case 2:bai2=(bai2+1)%10;break; case 3:shi2=(shi2+1)%10;break; case 4:ge2=(ge2+1)%10;break; case 5:shi1=(shi1+1)%2;break; case 6:ge1=(shi1==1)?(ge1+1)%3:(ge1+1)%10;break; case 7:shi=(month==2)?(shi+1)%3:(shi+1)%4;break; case 8:ge=(shi==3)?(ge+1)%YMth[month]:(month==2)?(ge+1)%YMth[2]:(ge+1)%10;break;} year=qian2*1000+bai2*100+shi2*10+ge2; month=shi1*10+ge1; day=shi*10+ge;}else{ switch(set){ case 1: shi2=(shi2+1)%3;break; case 2: ge2=(ge2+1)%4;break; case 4: shi1=(shi1+1)%6;break; case 5: ge1=(ge1+1)%10;break; case 7: shi=(shi+1)%6;break; case 8: ge=(ge+1)%10;break;} second=shi*10+ge; minute=shi1*10+ge1;hour=shi2*10+ge2; if(aclock==0) time=hour*3600+minute*60+second; else time1=hour*3600+minute*60+second;} while(!KEY1);}}} void alarmclock()//设置闹铃{ if(KEY2==0){ Delay(2); if(KEY2==0){ while(!KEY2); aclock=1; rili=0; set=0; while(1){ if(rili==1) Display(day,month,year); else Display(second,minute,hour); add(); if(KEY2==0){ while(!KEY2); aclock=0; set=0; break;}}}}}

引脚连接说明: 1、PO口接8为共阴数码管; 2、P2^0与P2^1分别为数码管的段锁存与位锁存; 3、P3^0为闹钟显示功能按键 P3^1为设置时钟时的数字调整,单向增大 P3^2为设置键,可对闹钟,日期,时间选择进行设置 P3^3为日立与时间的转换查看键 4、闹钟可选用led灯或者蜂鸣器,默认提醒时长为1分钟

软件仿真与实验效果:

在单片机C语言中一个字母,一个数字各占几个字节

在单片机C语言编程中,字母a到z以及数字0到9各自占用一个字节的空间。这是指在字符常量或字符变量中的情况。然而,当这些字符被赋予数值意义时,情况就有所不同了。例如,如果你定义了一个字符类型变量,它确实只需要一个字节来存储。但是,如果你使用整数类型变量(如int),则需要两个字节。同样地,长整型(long)和浮点型(float)分别需要四个字节来存储。

具体来说,字符(char)类型通常占据单片机内存中的一个字节,可以存储从-128到127的整数值(如果使用有符号字符类型)或0到255的整数值(如果使用无符号字符类型)。整数(int)类型通常需要两个字节,可以存储从-32768到32767的整数值(对于有符号整数类型)或0到65535的整数值(对于无符号整数类型)。长整型(long)和浮点型(float)则分别需要四个字节,长整型用于存储更大的整数值,而浮点型则用于存储具有小数部分的数值。

值得注意的是,不同单片机平台可能对数据类型的大小有所不同,因此在实际编程时,应查阅具体硬件的手册或参考文档,以确保代码的正确性和高效性。此外,不同的编译器也可能对数据类型的大小有不同的定义,因此在跨平台开发时,需要特别注意数据类型的兼容性问题。

综上所述,单片机C语言中,字母和数字各自占用一个字节,但这取决于它们被赋予的具体数值类型。理解这些基础概念对于编写高效且正确的程序至关重要。

文章到此结束,如果本次分享的单片机编程数字代码和单片机系统编程的问题解决了您的问题,那么我们由衷的感到高兴!

c语言软件电脑版下载,C语言编程软件官方免费下载java软件下载网站,塞班+java软件