单片机电子表C语言程序
单片机c语言编程实例:电子表

单片机c语言编程实例:电子表单片机c语言编程实例:电子表单键可调电子表:主要学习编程方法。
外部中断应用,中断嵌解:电子表分为工作状态和调整状态。
平时为工作状态,按键不足一秒,接键为换屏‘S’。
按键超过一秒移位则进入调整状态‘C’,而且调整光标在秒个位开始。
调整状态时,按键不足一秒为光标移动‘M’,超过一秒则为调整读数,每0.5秒加一‘A’,直到松键;如果10秒无按键则自动回到工作状态‘W’。
如果有年、月、日、时、分、秒。
四联数码管可分三屏显示,显示格式为“年月.”、“日.时.”、“分.秒”,从小数点的位置来区分显示内容。
(月份的十位数也可以用“-”和“-1”表示)。
enum status = { Work, Change, Add, Move, Screen } //状态牧举//计时和调整都是对下面时间数组Time进行修改unsigned char Time[12]={0,4, 0,6, 1,0, 0,8, 4,5, 3,2};//04年06月10日08时45分32秒unsigned char cursor = 12; //指向秒个位,=0时无光标unsigned char YmDhMs = 3; //指向“分秒”显示,=0时无屏显static unsigned char sts = Work;/*如果cursor不为0,装入DisBuf的对应数位,按0.2秒周期闪烁,即设一个0.1秒计数器S01,S01为奇数时灭,S01为偶数时亮。
小数点显示与YmDhMs变量相关。
*/void DisScan( void ) //动态刷新显示时调用。
没编完,针对共阴数码管,只给出控控制算法{//DisBuf每个显示数据的高四位为标志,最高位D7为负号,D6为小数点,D5为闪烁unsigned char tmp;tmp = Seg7Code[?x & 0x1f ]; //设?x为显示数据,高3位为控制位,将低5位变为七段码if( ?x & 0x40 ) tmp |= 0x80; //添加小数点if( ?x & 0x20 ){ if( S01 & 0x01 ) tmp=0; } //闪烁,S01奇数时不亮//这里没有处理负号位//将tmp送出显示,并控制对应数码管动作显示}void Display( void ) //根据状态进行显示{if( cursor != 0 ){ YmDhMs=(cursor+3)/4; } //1..4=1;5..8=2; 9..12=3for( i=(YmDhMs-1)*4; i<(YmDhMs)*4; i++ ){ unsigned char j = i%4;Disbuf[j] = Time[i];if( i == (cursor-1) ) Disbuf[j] |= 0x20; //闪烁,cursor!=0时才闪烁if( (i==9) || //小数点:分个位(i==7) || //小数点:时个位(i==5) || //小数点:日个位(i==3) //小数点:月个位) Disbuf[j] |= 0x40;//if(i==2){ if(Time[2]==1) DisBuf[2]=“-1”; else DisBuf=“-”; }}//工作状态:根据YmDhMs将屏数据装入DisBuf //调整状态:根据cursor将屏数据装入DisBuf}void KeyScan( void ) //根据状态扫描按键void ProcessKey( void ) //根据状态处理键信息{keyVal = KeyGet();if( keyVal == 0 ) return;switch( sts ){case Work:if( keyVal ==‘S’){if( --YmDhMs == 0 ) YmDhMs = 3; //换屏}if( keyVal == ‘C’){sts = Change;YmDhMs = 3;Cursor = 12;}break;case Change:if( keyVal == ‘W’ )if( keyVal == ‘A’ )if( keyVal == ‘M’ ) //根据cursorbreak;}}。
单片机c语言程序设计

单片机c语言程序设计
单片机C语言程序设计主要包括以下几个方面的内容:
1. 硬件初始化:包括对单片机的引脚、端口、定时器、中断等进行初始化设置。
2. 输入输出操作:对外部设备的输入输出进行控制,如读取按键、控制LED灯、驱动液晶显示屏等。
3. 时钟和定时器操作:利用单片机内部的定时器来生成精确的时间延时,进行定时操作。
4. 中断处理:单片机的中断是实现异步事件响应的重要手段。
程序中需要设置中断的触发条件,并编写对应的中断服务函数。
5. 存储器操作:包括对寄存器、变量、数组等进行读写操作,以及对外部存储器的读写操作。
6. 节能和休眠模式:单片机在待机、休眠等低功耗模式下可以通过设置进行省电操作。
7. 通信协议和接口:可以通过UART、SPI、I2C等通信协议
与其他外部设备进行数据交换。
8. 程序控制流程:包括循环、条件分支、跳转等控制结构的使用,以实现程序的逻辑控制。
以上只是单片机C语言程序设计的一些常见内容,具体的程序设计还需要根据实际需求进行设计。
可以根据单片机的型号和数据手册,选择合适的编译器和开发工具,参考相关资料和示例代码进行学习和实践。
单片机c语言程序设计

单片机c语言程序设计
单片机C语言程序设计是指使用C语言编写单片机控制程序,实现各种功能和任务。
具体步骤如下:
1. 确定程序功能:首先明确单片机的控制目标和需求,确定要实现的功能。
2. 编写主函数:使用C语言编写一个主函数,作为程序的入
口点。
在主函数中,可以定义变量、调用函数、编写主要的程序逻辑。
3. 初始化设置:在主函数中,进行单片机的初始化设置,包括引脚初始化、时钟设置、模块初始化等。
4. 编写中断服务函数:根据需要,编写中断服务函数。
在中断服务函数中,处理特定的中断事件,例如定时器中断、外部中断等。
5. 编写任务函数:根据程序的需求,编写各个任务函数。
任务函数可以是循环执行的函数,或者是根据事件触发执行的函数。
6. 实现控制逻辑:在任务函数中编写具体的控制逻辑代码,根据需要使用控制语句(如if、switch)和循环语句(如for、while)。
7. 进行调试和测试:完成编写后,进行程序的调试和测试,通过仿真器或者实际连接到单片机的硬件进行测试。
8. 优化和修改:根据测试结果进行程序的优化和修改,改善程序的性能和功能。
9. 生成可执行文件:将C源文件编译成可执行文件,可以直接下载到单片机中运行。
10. 下载和运行:将生成的可执行文件通过下载器下载到目标单片机中,并进行运行测试。
以上是单片机C程序设计的一般步骤,具体的实现方法和内容会根据不同的单片机型号和功能需求而有所不同。
单片机c语言电子万年历完整程序

该程序为51单片机c语言电子万年历#include"reg52.h"//#include<stdio.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P3^4;sbit lcdrs=P3^5;sbit DATA=P0^7;sbit RST=P0^5;sbit SCLK=P0^6;sbit menu=P3^0; //菜单sbit add=P3^1; //加一sbit dec=P3^7; //减一sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit ds=P3^2;//sbit beep=P3^3;uint temp;float f_temp;uint warn_l1=270;uint warn_l2=250;uint warn_h1=300;uint warn_h2=320;uint get_temp();void delayms(uint x);void write_com(uchar com);void write_data(uchar date);void init();void dis_temp(uint t);void Write1302(uchar dat);void WriteSet1302(uchar Cmd,uchar dat);uchar Read1302(void);uchar ReadSet1302(uchar Cmd);void Init_DS1302(void);void DisplaySecond(uchar x);void DisplayMinute(uchar x);void DisplayHour(uchar x);void DisplayDay(uchar x);void DisplayMonth(uchar x);void DisplayYear(uchar x);void DisplayWeek(uchar x);void dis_temp(uint t);void read_date(void);void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num);void key_scan(void);char code table[]="0123456789" ;uchar code table2[]= "TUEWESTHUFRISATSUNMON";uchar second,minute,hour,day,month,year,week,count=0; uchar ReadValue,num,time;void delayms(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}////////////////////////////////////////////////////////////void write_com(uchar com){lcdrs=0;P2=com;delayms(5);lcden=1;delayms(5);lcden=0;}void write_data(uchar date){lcdrs=1;P2=date;delayms(5);lcden=1;delayms(5);lcden=0;}void init(){lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}///////////////////////////////////////////////////////////////// void Write1302(uchar dat){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备delayms(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据{DATA=dat&0x01; //取出dat的第0位数据写入1302delayms(2); //稍微等待,使硬件做好准备SCLK=1; //上升沿写入数据delayms(2); //稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 }}void WriteSet1302(uchar Cmd,uchar dat){RST=0; //禁止数据传递SCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输delayms(2); //稍微等待,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}uchar Read1302(void){uchar i,dat;delayms(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续读8个二进制位数据{dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位 if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delayms(2); //稍微等待SCLK=0; //拉低SCLK,形成脉冲下降沿delayms(2); //稍微等待}return dat; //将读出的数据返回}uchar ReadSet1302(uchar Cmd){uchar dat;RST=0; //拉低RSTSCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}void Init_DS1302(void){WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,((59/10)<<4|(59%10))); //根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((23/10)<<4|(23%10))); //根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((28/10)<<4|(28%10))); //根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,((2/10)<<4|(2%10))); //根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,((14/10)<<4|(14%10))); //nian//WriteSet1302(0x8a,((4/10)<<4|(4%10)));}/////////////////////////////////////////////////////////////////void DisplaySecond(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x80+0x46);write_data(i+0x30);write_com(0x80+0x47);write_data(j+0x30);write_com(0x80+0x48);write_data(' ');dis_temp(get_temp());}void DisSecond(uchar x){uchar i,j;ReadValue = ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); i=x/10;j=x%10;write_com(0x80+0x46);write_data(i+0x30);write_com(0x80+0x47);write_data(j+0x30);}void DisplayMinute(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x80+0x43);write_data(i+0x30);write_com(0x80+0x44);write_data(j+0x30);write_com(0x80+0x45);write_data(':');}void DisplayHour(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x80+0x40);write_data(i+0x30);write_com(0x80+0x41);write_data(j+0x30);write_com(0x80+0x42);write_data(':');}void DisplayDay(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x89);write_data(i+0x30);write_com(0x8a);write_data(j+0x30); }void DisplayMonth(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x86);write_data(i+0x30);write_com(0x87);write_data(j+0x30);write_com(0x88);write_data('/');}void DisplayYear(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x81);write_data(2+0x30);write_com(0x82);write_data(0+0x30);write_com(0x83);write_data(i+0x30);write_com(0x84);write_data(j+0x30);write_com(0x85);write_data('/');}void DisplayWeek(uchar x){ uchar i;x=x*3;// write_com(0x8c);write_data(table2[x]); // write_com(0x8d);write_data(table2[x+1]); // write_com(0x8e);write_data(table2[x+2]); write_com(0x8c);for(i=0;i<3;i++){write_data(table2[x]);x++;}}void read_date(void){ReadValue = ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x83);minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x85);hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x87);day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89);month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8d);year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue=ReadSet1302(0x8b); //读星期 week=ReadValue&0x07;DisplayYear(year);DisplayMonth(month);DisplayDay(day);DisplayWeek(week);DisplayHour(hour);DisplayMinute(minute);DisplaySecond(second);dis_temp(get_temp()); ///温度显示key_scan(); ///按键检测}void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num){newval=ReadSet1302(newaddr); //读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f); //将bcd码转换成十进制if(flag) //判断是加一还是减一{newval++;switch(s1num){ case 1: if(newval>99) newval=0;DisplayYear(newval);break;case 2: if(newval>12) newval=1;DisplayMonth(newval);break;case 3: if(newval>31) newval=1;DisplayDay(newval);break;case 4: if(newval>6) newval=0;DisplayWeek(newval);break;case 5: if(newval>23) newval=0;DisplayHour(newval);break;case 6: if(newval>59) newval=0;DisplayMinute(newval);break;case 7: if(newval>59) newval=0;DisplaySecond(newval);break;default:break;}}else{newval--;switch(s1num){ case 1: if(newval==0) newval=99;DisplayYear(newval);break;case 2: if(newval==0) newval=12;DisplayMonth(newval);break;case 3: if(newval==0) newval=31;DisplayDay(newval);break;case 4: if(newval<0) newval=6;DisplayWeek(newval);break;case 5: if(newval<0) newval=23;DisplayHour(newval);break;case 6: if(newval<0) newval=59;DisplayMinute(newval);break;case 7: if(newval<0) newval=59;DisplaySecond(newval);break;default:break;}}WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //将新数据写入寄存器}//////////////////////////////////////void dsreset(void){uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit tempreadbit(void){uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar tempread(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); }return(dat);}void tempwritebyte(uchar dat) {uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tempchange(void){dsreset();delayms(1);tempwritebyte(0xcc);tempwritebyte(0x44);key_scan(); //////按键函数}uint get_temp(){uchar a,b;tempchange(); //////温度函数dsreset();delayms(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread();b=tempread();temp=b;temp<<=8;temp=temp|a;f_temp=temp*0.0625;temp=f_temp*10+0.5;f_temp=f_temp+0.05;return temp;}//////void dis_temp(uint t){uchar n1,n2,n3;n1=t/100;n2=t%100/10;n3=t%100%10;DisSecond(second); ///秒显示 write_com(0x80+0x49);write_data(table[n1]);//delayms(5);write_com(0x80+0x4a);write_data(table[n2]);//delayms(5);write_com(0x80+0x4b);write_data('.');// delayms(5);write_com(0x80+0x4c);write_data(table[n3]);//delayms(5);write_com(0x80+0x4d);write_data('^');//delayms(5);write_com(0x80+0x4e);write_data('C');//delayms(5);DisSecond(second); ////秒显示}/*********************液晶显示*****************/void warn(uint s,uchar led){uchar i;i=s;// beep=0;P1=~(led);while(i--){dis_temp(get_temp());}// beep=1;P1=0xff;i=s;while(i--){dis_temp(get_temp());}}void deal(uint t){uchar i;if((t>warn_l2)&&(t<=warn_l1)){warn(40,0x01);}else if(t<=warn_l2){warn(10,0x03);}else if((t<warn_h2)&&(t>=warn_h1)) {warn(40,0x04);}else if(t>=warn_h2){warn(10,0x0c);}else{i=40;while(i--){dis_temp(get_temp());DisSecond(second);} }}///////////////////////////////////////void main(){init();Init_DS1302();while(1){tempchange();read_date();deal(temp);key_scan();}}////******************************************* void key_scan(void){// uchar miao,s1num=0;uchar s1num=0;if(menu==0){delayms(5);if(menu==0){while(!menu);s1num++;while(1){if(menu==0){delayms(5);if(menu==0){while(!menu);s1num++;}}// miao=ReadSet1302(0x81);// second=miao;// WriteSet1302(0x80,miao|0x80);write_com(0x0f);//光标闪射if(s1num==1){ //year=ReadSet1302(0x8d);write_com(0x80+4); //年光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(year,1,0x8d,1);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(year,0,0x8d,1);}}}if(s1num==2){//month=ReadSet1302(0x89);write_com(0x80+7); //月光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(month,1,0x89,2);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(month,0,0x89,2);}}}if(s1num==3){ //day=ReadSet1302(0x87);write_com(0x80+10);//日光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(day,1,0x87,3);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(day,0,0x87,3); //写入日寄存器}}}if(s1num==4){ //week=ReadSet1302(0x8b);write_com(0x80+14); //星期光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(week,1,0x8b,4);}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(week,0,0x8b,4);}}}if(s1num==5){// hour=ReadSet1302(0x85)write_com(0x80+0x40+1); //时光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(hour,1,0x85,5);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(hour,0,0x85,5);}}if(s1num==6)//调时间分{ // minute=ReadSet1302(0x83);write_com(0x80+0x40+4);if(add==0){delayms(5);if(add==0){ while(!add);turn_val(minute,1,0x83,6); //写入分寄存器}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(minute,0,0x83,6); //写入分寄存器}}}if(s1num==7)//调时间秒{// second=ReadSet1302(0x81);write_com(0x80+0x40+7);//秒光标if(add==0){delayms(3);if(add==0){ while(!add);if(second==0x60)second=0x00;turn_val(second,1,0x81,7);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(second,0,0x81,7);}}}if(s1num==8){// miao=ReadSet1302(0x81);// second=miao;// WriteSet1302(0x80,second&0x7f);s1num=0;//s1num清零//write_com(0x0c);//光标不闪烁//break;}}} } }。
电子表c语言程序

wrcmd0802(0x06);
wrcmd0802(0x01);
}
void disp0802(uchar x,uchar y,uchar ch)
{
uchar m;
wrcmd0802(0x80+x*0x40+y);
for(m=0;m<=252;m++);
wrdata0802(ch);
if(t!=0xf0)
{
t=P1;
switch(t)
{
case 0xed:minute++;break;
case 0xdd:second++;break;
case 0xbd:keynum=6;break;
case 0x7d:keynum=11;break;
}
if(minute>=60)
minute=0;
void delay(void)
{ uchar i;
for(i=0;i<=200;i++);
}
void key44scan(void)
{
uchar t;
P1=0xfe;
t=P1;
t=t&0xf0;
if(t!=0xf0)
{
delay();
t=P1;
t=t&0xf0;
if(t!=0xf0)
{
t=P1;
switch(t)
E=0;
}
void wrdata0802(uchar shuju)
{
uchar m;
RW=0;
RS=1;
P0=shuju;
for(m=0;m<=2;m++);
51单片机电子时钟C语言程序

EX0=1;
ET0=1;
TR0=1;
yueqh(),riqh();//初始化日月切换
}
void ritiao()//日期的调节函数
{ if(P36==0)//日期加一调节键
{
p36xd();
if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12))
{numyue=1;}
yueqh();
}
if(P37==0)
{
p37xd();
numyue-=1;
if(numyue==0)
{numyue=12;}
yueqh();
}
}
void int0() interrupt 0
{
p32xd();
if(numsec==-1)
{
numsec=59;
}
secqh();
}
}
};
p32xd();
while(P32!=0)//第二次按下p32时,进行分调时
{
for(m=0;m<40;m++)
{
P2=0x00;
P0=table[hou1];
P2=0X20;
delayms(1);
P2=0x00;
P0=table[hou2]&0x7f;
P2=0X10;
delayms(1);
P2=0x00;
P0=table[sec1];
单片机c语言程序设计

单片机c语言程序设计单片机(Microcontroller)是集成了微处理器核心、存储器和外围设备接口等功能单元的集成电路芯片,用于嵌入式系统中的控制任务。
C语言是一种广泛使用的高级编程语言,非常适合用于单片机的程序设计。
下面是一个简单的单片机C语言程序设计示例,演示了如何使用C语言编写单片机程序:#include <reg51.h> // 引入单片机特定的头文件// 定义延时函数void delay(int milliseconds) {int i, j;for(i = 0; i < milliseconds; i++) {for(j = 0; j < 120; j++) {}}}// 主函数void main() {while(1) {P1 = 0xFF; // 将P1口的所有引脚设置为高电平delay(1000); // 延时1秒P1 = 0x00; // 将P1口的所有引脚设置为低电平delay(1000); // 延时1秒}}在这个示例中,我们使用了C语言来编写一个简单的程序,控制单片机的引脚P1。
程序的逻辑如下:1.引入reg51.h头文件,该头文件是用于8051系列单片机的特定头文件。
2.定义了一个延时函数delay,用于控制程序中的延迟。
3.在主函数main中,我们使用一个无限循环while(1) 来不断执行下面的代码块。
4.将P1口的所有引脚设置为高电平 P1 = 0xFF;然后使用delay函数延时1秒。
5.将P1口的所有引脚设置为低电平P1 = 0x00;然后再次使用delay函数延时1秒。
通过上述逻辑,这个程序会不断地交替将P1引脚设置为高电平和低电平,每次延时1秒,实现了一个简单的LED闪烁的功能。
具体的单片机和开发环境可能有所不同,程序中的头文件和寄存器定义可能会有所差异。
在实际的单片机C语言程序设计中,需要根据所使用的单片机型号和开发环境来进行对应的载入头文件和编写代码。
简单的单片机程序(C语言)

一、单片机第一个灯闪烁(1)#include<reg52.h>sbit d1=P1^0;unsigned int a;void main(){while(1){a=50000;d1=0;while(a--);a=50000;d1=1;while(a--);}}(2)子函数的调用#include<reg52.h>#define uint unsigned int#define uchar unsigned char sbit D1=P1^0;void delay();void main(){ while(1){D1=0;delay();D1=1;delay();}}void delay(){ uint x,y;for(x=100;x>0;x--)for(y=2000;y>0;y--) ; }void delay(uint z)(含参) {uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--)}连续闪烁#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp;void delay(uint);void main(){temp=0xfe;P1=temp;while(1){temp=_crol_(temp,1);delay(600);P1=temp;}}void delay(){uint x,y;for(x=100;x>0;x--)for(y=200;y>0;y--) ;}蜂鸣器响起#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;P1=temp;beep=0;while(1){temp=_crol_(temp,1);delay(600);......流水灯连续亮起每隔一秒#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp;void delay(uint z);void main(){temp=0xfe;P1=temp;while(1){delay(1000);temp=_crol_(temp ,1); //左移一位P1=temp;}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} //延时函数定时器中断流水灯亮、数码管两秒变数#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp,aa,num;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void delay(uint z);void main(){num=0;aa=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;temp=0xfe;P1=temp;dula=1;P0=table[0];dula=0;wela=1;P0=0xc0;wela=0;while(1){delay(1000);temp=_crol_(temp,1);P1=temp;/* if(aa==40){aa=0;num++;if(num==16)num=0;dula=1;P0=table[num];dula=0;} */}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==40){aa=0;num++;if(num==16)num=0;dula=1;P0=table[num];dula=0;}}数码管的流水显示#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp,aa,numdu,numwe;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};void delay(uint z);void main(){numdu=0;numwe=0;aa=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256; //50000代表1微秒乘50000=50毫秒EA=1;ET0=1;TR0=1;while(1){//delay(1000);// temp=_crol_(temp,1);// P1=temp;if(aa==20){aa=0;numdu++;if(numdu==7)numdu=1;dula=1;P0=table[numdu];dula=0;wela=1;P0=tablewe[numwe];wela=0;numwe++;if(numwe==6)numwe=0;}}}/*void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} */void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}两位数的分离写在两个数码管上例子12(应用子函数)#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar temp,numdu,shi,ge;void display(uchar shi,uchar ge);sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void delay(uint z);void main(){numdu=0;temp=12;shi=temp/10;ge=temp%10;while(1)display(shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar shi,uchar ge){dula=1;P0=table[shi];dula=0;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table[ge];dula=0;wela=1;P0=0xfe;wela=0;delay(5);}数码管动态显示从零隔一秒加一次#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};uchar temp,shi,ge,aa;void display(uchar shi,uchar ge);sbit dula=P2^6;sbit wela=P2^7;void init() ;void delay(uint z);void main(){init() ;while(1)if(aa==20)aa=0;temp++;if(temp==100){temp=0;}shi=temp/10;ge=temp%10;display(shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar shi,uchar ge) {dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table[ge];dula=0;wela=1;P0=0xfe;wela=0;delay(5);}void init(){wela=0;dula=0;temp=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}第四课练习3 #include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0,t1,bai,shi,ge,flag,flag1;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f ,0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71,0x36,0x76,0x38,0x3f,0};void display(uchar aa,uchar bb,ucharcc,uchar bai,uchar shi,uchar ge); uint shu;void init();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){init();while(1){if(flag1!=1)display(7,6,5,bai,shi,ge);elsedisplay(16,17,18,18,19,20);}}void init(){shu=432;temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器TH1=(65536-50000)/256;TL1=(65536-50000)%256;//T1定时器(500ms里不用)EA=1;//kai zong 中断ET0=1;ET1=1;TR0=1;// 定时器0打开TR1=1;// 定时器1打开}void timer0() interrupt 1 //定时器0的中断的中断函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0++;if(flag!=1){if(t0==10){t0=1;temp=_crol_(temp,1); //位移P1=temp;}}else{if(t0%4==0){P1=~P1;}if(t0==60){TR0=0;P1=0xff;flag1=1;}}}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t1++;if(t1==2){t1=0;shu--;bai=shu/100;shi=shu%100/10;ge=shu%10;if(shu==398){TR0=0;//控制流水灯关闭TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;flag=1;t0=0;P1=0xff;TR1=0;}}}void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) {dula=1;P0=table[aa];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[bb];dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[cc];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[bai];dula=0;wela=1;P0=0xf7;wela=0;delay(1);dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[ge];dula=0;wela=1;P0=0xdf;wela=0;delay(1);}利用定时器0以500MS速度进行流水灯从上至下移动#include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0;void init() ;void main(){init();while(1){}}void init(){temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器EA=1;//kai zong 中断ET0=1;TR0=1;// 定时器0打开}void timer0() interrupt 1 //定时器0的中断的中断函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0++;if(t0==10){t0=1;temp=_crol_(temp,1); //位移P1=temp;}} /* void init(),void timer0() interrupt 1利用定时器0以500MS速度进行流水灯从上至下移动*/利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数#include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0,t1,bai,shi,ge;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f ,0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void display(uchar aa,uchar bb,ucharcc,uchar bai,uchar shi,uchar ge);uint shu;void init();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){init();while(1){display(7,6,5,bai,shi,ge);}}void init(){shu=432;temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器TH1=(65536-50000)/256;TL1=(65536-50000)%256;//T1定时器(500ms里不用)EA=1;//kai zong 中断ET0=1;ET1=1;TR0=1;// 定时器0打开TR1=1;// 定时器1打开}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t1++;if(t1==2){t1=0;shu--;bai=shu/100;shi=shu%100/10;ge=shu%10;if(shu==398){TR0=0;//控制流水灯关闭TR1=0;}}}void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) {dula=1;P0=table[aa];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[bb];dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[cc];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[bai];dula=0;wela=1;P0=0xf7;wela=0;delay(1);dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[ge];dula=0;wela=1;P0=0xdf;wela=0;delay(1);}第五节/一、用键盘点亮第一个流水灯#include<reg52.h>sbit d1=P1^0;sbit key1=p3^4;void main(){P3=0xff;while(1){if(key1==0)d1=0;elsed1=1;}}或#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f ,0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71}; sbit d1=P1^0;sbit key1=P3^4;sbit dula=P2 ^6;sbit wela=P2^7;uchar num;void main(){wela=1;P0=0xfe;wela=0;P3=0xff;while(1){if(key1==0){d1=0;num++;if (num==10)num=0;}elsed1=1;dula=1;P0=table[num];dula=0;}} //用键盘点亮第一个流水灯按下16个矩阵键盘依次在数码管上显示0-15 #include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f ,0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71,0}; sbit dula=P2 ^6;sbit wela=P2^7;sbit key1=P3^4;uchar num,temp,num1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar keyscan();void main(){num= 17;dula=0;P0=0;dula=1;wela=1;P0=0xc0;wela=0;while(1){num1=keyscan();dula=1;P0=table[num1-1];dula=0;}}uchar keyscan(){P3=0xfe;//1temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xfd; //2temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xfb; //3temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xf7; //4temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14 ;break;case 0xb7:num=15 ;break;case 0x77:num=16;break;}while(1){temp=P3;temp=temp&0xf0;}}}return num;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
else
if (j==0xff)
{
j=0xf7;
}
}
}
P0 =j ;
P1 = *btime[i];
if (i == 1)
{
if (dianUP>=20)
dianUP=0;
else
{
if (dianUP<=10)
dian = 1;
else
dian=0;
}
}
delay(500);
j=h;
}
else
{
bshi1++;
btime[1] = &temp[bshi1];
}
}
if(place==2)
{
if(bfen2==9)
{
bfen2=0;
btime[2]=&temp[bfen2];
}
else
{
bfen2++;
btime[2] = &temp[bfen2];
}
}
if(place==3)
{
if(bfen1==9)
i++;
}
j = 0xfe;
}
if(X==2&&Y==0)
{
j = 0xfe;
for (i = 0; i <= 3;)
{
P0 =j ;
P1 = *stime[i];
if (i == 2)
{
if (dianUP>=20)
dianUP=0;
else
{
if (dianUP<=10)
dian = 1;
else
}
}
}
if (X==3&&Y==1)
{
if(place==0)
{
if(bshi2==9)
{
bshi2=0;
btime[0]=&temp[bshi2];
}
else
{
bshi2++;
btime[0] = &temp[bshi2];
}
}
if(place==1)
{
if(bshi1==9)
{
bshi1=0;
btime[1]=&temp[bshi1];
}
}
if(place==3)
{
if(fen1==9)
{
fen1=0;
time[3]=&temp[fen1];
}
else
{
fen1++;
time[3] = &temp[fen1];
}
}
}
if (X==2&&Y==1)
{
if(place==0)
{
if(sshi2==9)
{
sshi2=0;
stime[0]=&temp[sshi2];
else
{
if (dianUP<=10)
dian = 1;
else
dian=0;
}
}
delay(500);
j = _crol_(j, 1);
i++;
}
j = 0xfe;
}
if (X==3&&Y==1)
{
for (i = 0; i <= 3;)
{
if (place==0)
{
if (UP>=20)
UP=0;
{
place++;
if (place>3)
place=0;
}
if(X==3&&Y==0)
Y=1;
if(X==2&&Y==0)
Y=1;
if (X==1&&Y==0)
{
ET0=0;
TR0=0;
Y=1;
}
delay(10000);
}
if (Del==0)
{
delay(10000);
Beep=0;
delay(5000);
else
{
if (UP<=10)
{
if (j==0xfe)
j=0xff;
}
else
if (j==0xff)
{
j=0xfe;
}
}
}
if (place==1)
{
if (UP>=20)
UP=0;
else
{
if (UP<=10)
{
if (j==0xfd)
j=0xff;
}
else
if (j==0xff)
{
j=0xfd;
{
bfen1=9;
btime[3]=&temp[bfen1];
}
else
{
bfen1--;
btime[3] = &temp[bfen1];
}
}
}
if (X==2&&Y==0)
{
start=0;
if (Beep==0)
{
Beep=1;
flag=0;
}
}
delay(10000);
}
if (Add==0)
{
fen1=9;
time[3]=&temp[fen1];
}
else
{
fen1--;
time[3] = &temp[fen1];
}
}
}
if (X==2&&Y==1)
{
if(place==0)
{
if(sshi2==0)
{
sshi2=9;
stime[0]=&temp[sshi2];
}
else
{
sshi2--;
{
if(shi1==9)
{
shi1=0;
time[1]=&temp[shi1];
}
else
{
shi1++;
time[1] = &temp[shi1];
}
}
if(place==2)
{
if(fen2==5)
{
fen2=0;
time[2]=&temp[fen2];
}
else
{
fen2++;
time[2] = &temp[fen2];
{
bfen1=0;
btime[3]=&temp[bfen1];
}
else
{
bfen1++;
btime[3] = &temp[bfen1];
}
}
}
if (X==2&&Y==0)
start=1;
delay(10000);
}
}
void FLESH()
{
uint i,h=0xfe;
if (X==1&&Y==0)
Beep=1;
if (X==1&&Y==1)
{
if(place==0)
{
if(shi2==0)
{
shi2=2;
time[0]=&temp[shi2];
}
else
{
shi2--;
time[0] = &temp[shi2];
}
}
if(place==1)
{
if(shi1==0)
{
shi1=9;
time[1]=&temp[shi1];
}
}
}
if (place==2)
{
if (UP>=20)
UP=0;
else
{
if (UP<=10)
{
if (j==0xfb)
j=0xff;
}
else
if (j==0xff)
{
j=0xfb;
}
}
}
if (place==3)
{
if (UP>=20)
UP=0;
else
{
if (UP<=10)
{
if (j==0xf7)
}
else
{
bshi1--;
btime[1] = &temp[bshi1];
}
}
if(place==2)
{
if(bfen2==0)
{
bfen2=9;
btime[2]=&temp[bfen2];
}
else
{
bfen2--;
btime[2] = &temp[bfen2];
}
}
if(place==3)
{
if(bfen1==0)
}
else
{
sshi2++;
stime[0] = &temp[sshi2];
}
}
if(place==1)
{
if(sshi1==9)
{
sshi1=0;
stime[1]=&temp[sshi1];
}
else
{
sshi1++;
stime[1] = &temp[sshi1];
}
}
if(place==2)
{
if(sfen2==9)