单片机电子表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;}。
单片机数字电压表设计c语言程序
单片机数字电压表设计c语言程序
本文将介绍如何使用C语言编写单片机数字电压表的程序。
首先,需要了解单片机的基本原理和电路连接方式。
单片机是一种小型的计算机芯片,可以用来控制各种电子设备。
在电压表中,我们需要将单片机连接到电压传感器和显示器上。
电压传感器将测量的电压信号转换为数字信号,然后传输给单片机。
单片机将这个数字信号转换为显示器上的数字。
为了实现这个功能,我们需要编写一些基本的C语言程序。
首先,我们需要初始化单片机的IO口,以便将其连接到电压传
感器和显示器上。
然后,我们需要配置单片机的ADC模块,以便可以读取电压传感器产生的模拟信号。
一旦我们读取了这个模拟信号,我们需要将其转换为数字信号,并将其保存在单片机的内存中。
然后,我们需要将这个数字信号转换为适合显示器的格式,并在显示器上显示出来。
这些都是单片机数字电压表程序的基本步骤。
当然,实际编码过程中可能会涉及到更多的细节和技巧。
但是,只要我们掌握了基本的编程原理和方法,我们就可以轻松地编写出高效、稳定的单片机数字电压表程序。
- 1 -。
51单片机C语言电子时钟程序设计程序
主程序:#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;#define yh 0x80#define er 0x80+0x40//液晶屏的与C51之间的引脚连接定义sbit rs=P2^0;sbit en=P2^2;sbit rw=P2^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了sbit led=P2^6; //LCD背光开关//DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P1^1;sbit SCLK=P1^0;sbit RST=P1^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;//校时按键与C51的引脚连接定义sbit key1=P1^5; //设置键sbit key2=P1^6; //加键sbit key3=P1^7; //减键sbit buzzer=P1^3; //蜂鸣器,通过三极管9012驱动,端口低电平响/**************************************************************/uchar code tab1[]={"20 - - "}; //年显示的固定字符uchar code tab2[]={" : : "}; //时间显示的固定字符//延时函数,后面经常调用void delay(uint xms) //延时函数,有参函数{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}/********液晶写入指令函数与写入数据函数,以后可调用**************/write_1602com(uchar com) //****液晶写入指令函数****{rs=0; //数据/指令选择置为指令rw=0; //读写选择置为写P0=com; //送入数据delay(1);en=1; //拉高使能端,为制造有效的下降沿做准备delay(1);en=0; //en由高变低,产生下降沿,液晶执行命令}write_1602dat(uchar dat) //***液晶写入数据函数****{rs=1; //数据/指令选择置为数据rw=0; //读写选择置为写P0=dat; //送入数据delay(1);en=1; //en置高电平,为制造下降沿做准备delay(1);en=0; //en由高变低,产生下降沿,液晶执行命令}lcd_init() //***液晶初始化函数****{write_1602com(0x38); //设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c); //开显示不显示光标write_1602com(0x06); //整屏不移动,光标自动右移write_1602com(0x01); //清显示write_1602com(yh+1); //日历显示固定符号从第一行第1个位置之后开始显示for(a=0;a<14;a++){write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分//delay(3);}write_1602com(er+2); //时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a<8;a++){write_1602dat(tab2[a]); //写显示时间固定符号,两个冒号//delay(3);}}/*********************over***********************//***************DS1302有关子函数********************/void write_byte(uchar dat)//写一个字节{ACC=dat;RST=1;for(a=8;a>0;a--){IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>>1;}}uchar read_byte() //读一个字节{RST=1;for(a=8;a>0;a--){ACC7=IO;SCLK=1;SCLK=0;ACC=ACC>>1;}return (ACC);}//----------------------------------------void write_1302(uchar add,uchar dat) //向1302芯片写函数,指定写入地址,数据{RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;}uchar read_1302(uchar add) //从1302读数据函数,指定读取数据来源地址{uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);}uchar BCD_Decimal(uchar bcd) //BCD码转十进制函数,输入BCD,返回十进制{uchar Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));}//--------------------------------------void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4){RST=0;SCLK=0;write_1302(0x8e,0x00); //允许写,禁止写保护//write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00//write_1302(0x82,0x00); //向DS1302内写分寄存器82H写入初始分数据00//write_1302(0x84,0x12); //向DS1302内写小时寄存器84H写入初始小时数据12//write_1302(0x8a,0x04); //向DS1302内写周寄存器8aH写入初始周数据4//write_1302(0x86,0x07); //向DS1302内写日期寄存器86H写入初始日期数据07//write_1302(0x88,0x01); //向DS1302内写月份寄存器88H写入初始月份数据01//write_1302(0x8c,0x10); //向DS1302内写年份寄存器8cH写入初始年份数据10write_1302(0x8e,0x80); //打开写保护}//温度显示子函数void write_temp(uchar add,uchar dat) //向LCD写温度数据,并指定显示位置{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(er+add); //er是头文件规定的值0x80+0x40write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码write_1602dat(0xdf); //显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码}//时分秒显示子函数void write_sfm(uchar add,uchar dat) //向LCD写时分秒,有显示位置加、现示数据,两个参数{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(er+add); //er是头文件规定的值0x80+0x40write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码}//年月日显示子函数void write_nyr(uchar add,uchar dat) //向LCD写年月日,有显示位置加数、显示数据,两个参数{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(yh+add); //设定显示位置为第一个位置+addwrite_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码}void write_week(uchar week) //写星期函数{write_1602com(yh+0x0c); //星期字符的显示位置switch(week){case 1:write_1602dat('M'); //星期数为1时,显示write_1602dat('O');write_1602dat('N');break;case 2:write_1602dat('T'); //星期数据为2时显示write_1602dat('U');write_1602dat('E');break;case 3:write_1602dat('W'); //星期数据为3时显示write_1602dat('E');write_1602dat('D');break;case 4:write_1602dat('T'); //星期数据为4是显示write_1602dat('H');write_1602dat('U');break;case 5:write_1602dat('F'); //星期数据为5时显示write_1602dat('R');write_1602dat('I');break;case 6:write_1602dat('S'); //星期数据为6时显示write_1602dat('T');write_1602dat('A');break;case 7:write_1602dat('S'); //星期数据为7时显示write_1602dat('U');write_1602dat('N');break;}}//****************键盘扫描有关函数**********************void keyscan(){if(key1==0) //key1为功能键(设置键){delay(9); //延时,用于消抖动if(key1==0) //延时后再次确认按键按下{buzzer=0; //蜂鸣器短响一次delay(20);buzzer=1;while(!key1);key1n++;if(key1n==9)key1n=1; //设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环switch(key1n){case 1: TR0=0; //关闭定时器//TR1=0;write_1602com(er+0x09); //设置按键按动一次,秒位置显示光标write_1602com(0x0f); //设置光标为闪烁temp=(miao)/10*16+(miao)%10; //秒数据写入DS1302write_1302(0x8e,0x00);write_1302(0x80,0x80|temp);//miaowrite_1302(0x8e,0x80);break;case 2: write_1602com(er+6); //按2次fen位置显示光标//write_1602com(0x0f);break;case 3: write_1602com(er+3); //按动3次,shi//write_1602com(0x0f);break;case 4: write_1602com(yh+0x0e); //按动4次,week//write_1602com(0x0f);break;case 5: write_1602com(yh+0x0a); //按动5次,ri//write_1602com(0x0f);break;case 6: write_1602com(yh+0x07); //按动6次,yue//write_1602com(0x0f);break;case 7: write_1602com(yh+0x04); //按动7次,nian//write_1602com(0x0f);break;case 8:write_1602com(0x0c); //按动到第8次,设置光标不闪烁TR0=1;//打开定时器temp=(miao)/10*16+(miao)%10;write_1302(0x8e,0x00);write_1302(0x80,0x00|temp);//miao数据写入DS1302write_1302(0x8e,0x80);break;}}}//------------------------------加键key2----------------------------if(key1n!=0) //当key1按下以下。
单片机电子表程序
display();
while(!keyinc); //松开去抖
}
if(keydec==0) //P0.1=0,keyinc键被按下?
{
delay_50us(200); //延时一会儿再测
if(keydec==0) //确实按下了
{ switch(hm)
}
display();
while(!keydec); //松开去抖
}
}
void changenum()
{
if(num==20)
{
num=0;
if(Stopgo) s++;//让“ClockSet”来控制是否数字加1
}
if(s>=60)
delay(10);
P1 = d[s/10];
P2 = w[1];
delay(10);
P1 = d[10]; //显示“-”
P2 = w[2];
delay(10);
P2 = w[5];
delay(10);
delay(10);
P1 = d[m%10];
TL0=(65535-50000)%256;
EA=1; //开总中断开关
ET0=1; //开定时器0中断开关
TR0=1; //开始定时
}
void main()
{
init_timer(); //调用定时器初始化函数
ExInt0init(); //调用外部中断0初始化函数
hm = 0x01; //让标识hms=0x01
while(!SetH); //松开去抖
}
STC单片机C语言程序设计STC单片机C语言编程入门
STC单片机C语言程序设计STC单片机C语言编程入门STC单片机是一种非常常见的单片机型号,广泛应用于各种电子设备中。
学习STC单片机的C语言编程能够帮助我们更好地理解和掌握单片机的工作原理,从而能够进行各种功能的实现。
以下是STC单片机C语言程序设计入门的一些基本内容。
1.环境搭建2.了解单片机的IO口和寄存器在学习C语言编程之前,我们需要了解STC单片机的IO口以及寄存器的概念。
IO口是单片机与外部设备进行数据交互的接口,而寄存器则是用来存储和控制单片机各个功能模块的寄存器。
了解IO口和寄存器的作用和使用方法,是进行C语言编程的基础。
3.学习C语言编程基础知识在进行STC单片机的C语言编程之前,我们还需要学习C语言的基础知识,包括数据类型、运算符、控制语句、数组、函数等。
学好C语言的基础知识,对于后续的单片机编程非常重要。
4.学习STC单片机常用库函数5.学习编写简单的实例程序通过编写简单的实例程序,例如LED的闪烁、按键的检测等,可以帮助我们更好地理解和掌握C语言在STC单片机上的应用。
通过不断进行实践,逐步提高自己的编程能力。
6.学习调试和优化程序在编写程序的过程中,难免会遇到一些错误和问题。
学习调试程序的方法和技巧,可以帮助我们快速解决问题。
同时,还需要学习优化程序的方法,如减少内存占用、提高程序执行效率等,从而使程序更加稳定和高效。
总结起来,STC单片机C语言程序设计入门需要掌握以下几个方面的知识:搭建开发环境、了解单片机的IO口和寄存器、学习C语言编程基础知识、学习STC单片机常用库函数、学习编写实例程序、学习调试和优化程序。
通过不断学习和实践,我们可以逐步掌握STC单片机的C语言编程,实现各种有趣的功能。
单片机学习项目 (9) 电子表程序设计
单片机学习项目项目9-电子表程序设计一:电路仿真根据功能需要,电子表电路含6位数码管、4个按键和一个继电器驱动电路,如图4-4-1所示。
读者可在P3.3口接一个继电器驱动电路,控制一只灯泡或一个电铃作为闹铃输出。
二:程序设计电子表程序采用模块化设计,可以先根据电子表的功能需求对程序进行模块划分,这个过程单片机程序模块化设计的基本设计步骤。
电子表程序包含一个主程序和一个按键子程序,主程序调用子程序。
一、按键子程序key.c根据功能要求,按键key1按下进入时间、定闹调整状态,由于需要对不同对象进行调整,并且要控制所调整的对象闪烁显示,因此需要设定一个记录key1按下次数的状态变量,比如key1_flag。
未按下key1时, key1_flag值为0,电子表正常走时;第一次按下key1,key1_flag为1,进入调时状态,同时小时闪烁;再按下key1,key1_flag为2,此时调分钟,分钟闪烁;依次按下KEY1,可以分别进入其他时间调整。
由于本项目中的电子表只需调整5个对象,key1_flag值增加到6时预置为1,重新进入调时状态。
按键功能分配见表4-5-1所示。
(时)、min(分)、sec(秒),调整中间变量hour_t、min_t、sec_t以及定闹所使用的变量hour_r(定闹时)、min_r(定闹分)。
按键程序key.c设计清单如下:/**********************************************************///按键子程序/**********************************************************/#include<reg51.h>sbit key1 = P1^4;sbit key2 = P1^5;sbit key3 = P1^6;sbit key4 = P1^7;bit key1_s,key2_s,key3_s,key4_s; //按键按下状态unsigned char hour = 12,min = 30,sec =30; //正在走的时间变量char hour_t,min_t,sec_t; //调整的中间时间变量unsigned char min_r,hour_r; //定闹的时间变量unsigned char key1_flag; //调整控制变量,控制调整对象、控制显示对象/***********************简单延时函数************************/void delay(unsigned int x){while(x--);}/*************************按键函数**************************/void key(void){////////////按键key1处理///////////////if(key1 == 0){delay(300);if(key1 == 0);key1_s = 1;}if(key1 == 1 && key1_s == 1){key1_s = 0;key1_flag++;if(key1_flag >= 6)key1_flag = 1;hour_t = hour;//把正在走的时间给调整值min_t = min;sec_t = sec;}////////////按键key2处理///////////////if(key2 == 0){delay(300);if(key2 == 0);key2_s = 1;}if(key2 == 1 && key2_s == 1){key2_s = 0;if(key1_flag == 1)hour_t++;if(hour_t >= 24)hour_t = 0;hour = hour_t; //把调整后的时间给走的时间 if(key1_flag == 2)min_t++;if(min_t >= 60)min_t = 0;min = min_t;if(key1_flag == 3)sec_t++;if(sec_t >= 60)sec_t = 0;sec = sec_t;if(key1_flag == 4)hour_r++;if(hour_r >= 24)hour = 0;if(key1_flag == 5)min_r++;if(min_r >= 24)min_r = 0;}////////////按键key3处理///////////////if(key3 == 0){delay(300);if(key3 == 0);key3_s = 1;}if(key3 == 1 && key3_s == 1){key3_s = 0;if(key1_flag == 1)hour_t--;if(hour_t <= 0)hour_t = 23;hour = hour_t;if(key1_flag == 2)min_t--;if(min_t <= 0)min_t = 59;min = min_t;if(key1_flag == 3)sec_t--;if(sec_t <= 0)sec_t = 59;sec = sec_t;if(key1_flag == 4)hour_r--;if(hour_r <= 0)hour = 23;if(key1_flag == 5)min_r--;if(min_r <= 0)min_r = 59;}////////////按键key4处理///////////////if(key4 == 0){delay(300);if(key4 == 0);key4_s = 1;}if(key4 == 1 && key4_s == 1){key1_flag = 0;key4_s = 0;}}按键子程序保存在key.c文件中,用于主程序调用。
基于C51单片机的电子表(内附完整程序源码)
基于C51单片机的电子表(内附完整程序源码)电子科学与技术系科研训练中文题目:基于C51单片机为主控芯片的电子时钟英文题目: Based on C51 single chip microcomputer as main control chipof electronic watch姓名:王****学号:**********专业名称:电子科学与技术指导教师:郑国旭基于C51单片机为主控芯片的电子表作者哈尔滨理工大学电子科学与技术系[内容摘要]本文论述了用C51单片机制作电子表的方法和过程,电路图以及程序源代码。
包括时间基准的选取和实现;1602液晶显示屏的驱动和编程;独立键盘的使用和编程;单片机内部时间中断的原理及编程。
[关键词] C51单片机;时间基准; 1602液晶显示屏;编程Based on C51 single chip microcomputer as maincontrol chip of electronic watch[Abstract]This paper discusses the using C51 production method and process of digital watches, circuit diagram and the program source code. Including the selection of time benchmark and implementation; 1602 LCD driver and programming; The use of independent keyboard and programming; The principle and programming of single chip microcomputer internal timeinterrupt.[Keywords] C51 production;Time benchmark;1602 LCD;programming目录1 引言 (1)2 相关文献综述 (1)3 元件简述及应用 (1)3.1 STC89C51RC单片机简介及其应用 (2)3.1.1 STC89C51RC单片机简介 (2)3.1.2 STC89C51RC单片机应用 (2)3.2 1602液晶屏简介及其应用 (3)3.2.1 1602液晶屏简介 (3)3.2.2 1602液晶屏应用 (4)4硬件电路构建 (5)4.1中控部分以及时间基准部分 (6)4.2按键交互部分 (7)4.3液晶显示部分 (8)5 软件程序编程 (9)5.1计算类函数代码 (9)5.1.1闰年计算函数 (9)5.1.2日期清零函数 (9)5.1.3星期计算函数 (10)5.2独立按键函数 (11)5.2.1 S1数位选择按键 (11)5.2.2 S2数值加一按键 (12)5.2.3 S3数值减一按键 (14)5.3计时器函数 (15)5.3.1计时器初始化函数 (15)5.3.2计时器中断函数 (16)5.4全部源代码 (18)6结论 (29)1 引言单片机是一种集成电路芯片,是采用超大规模集成电路技术,把具有数据处理能力的中央处理器CPU、随机存储器RAM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上,构成的一块小而完整的计算机系统。
单片机C语言 电子时钟程序[1]
单片机C语言电子时钟程序[1]单片机c语言-电子时钟程序[1]#include#defineuintunsignedint#defineucharunsignedcharunsignedcharkey2;bitding =1;unsignedchargetkey(void);uchara,n=0,shi,fen,miao;voiddelay01s(void);ucharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};ucharled1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//存有小数点的voidinit();//函数声明voiddelay(unsignedcharz);//函数声明voiddisplay();//函数声明//函数声明voidmain()//函数声明{p1=0xfe;//对p1口赋初值init();//函数调用while(1){//函数调用key2=getkey();switch(key2){case1:shi++;if(shi==24){shi=0;}break;case2:fen++;if(fen==60){fen=0;}break;case3:if(fen!=0)fen--;if(fen==24){fen=0;}break;case4:ding=~ding;default:break;}display();//函数调用}}voidinit(){tmod=0x01;//定时器工作方式选择和赋初值th0=(65536-50000)/256;tl0=(65536-50000)%6;ea=1;//开总中断et0=1;//开定时器中断tr0=1;//启动定时器}voidtimer0()interrupt1//中断服务程序{if(ding==1){th0=(65536-50000)/256;//中断时间50mstl0=(65536-50000)%6;//定时器重新赋初值a++;if(a==10){n=~n;}if(a==20){n=~n;a=0;p1=p1<<1|p1>>7;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}}}}}}voiddisplay()//表明程序{p0=led[shi/10];p2=((p2&0x0f)|0x70);delay(4);if(n==0){p0=led[shi];}else{p0=led1[shi];}p2=((p2&0x0f)|0xb0);delay(4);p0=led[fen/10];p2=((p2&0x0f)|0xd0);delay(4);p0=led[fen];p2=((p2&0x0f)|0xe0);delay(4);}/**********获得键值子程序**********************/unsignedcharbool;//bool是否松键的标志unsignedchargetkey(void){unsignedchartemp,key=0;p2=(p2&0xff)|0x0f;if((p2&0xff)!=((p2&0xff)|0x0f))//有键按下{//delay01s();if(((p2&0xff)!=((p2&0xff)|0x0f))&&(bool==0))//有键按下{temp=~(p2|0xf0);if(temp==1)key=1;elseif(temp==2)key=2;elseif(temp==4)key=3;elseif(temp==8)key=4;bool=1;}}if(((p2&0xff)==((p2&0xff)|0x0f))&&(bool==1)){bool=0;}returnkey;//回到1~16键值}/********延时程序******/voiddelay01s(void){unsignedcharj,k;for(j=5;j>0;j--)//198{for(k=15;k>0;k--)//248{;}}}voiddelay(unsignedcharz){unsignedchari,j,k;for(i=z;i>0;i--)for(j=25;j>0;j--)for(k=20;k>0;k--);} //定义变量。
单片机电子表C语言程序
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);
{
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];
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
ET1 = 1;
TR1 = 1;
EX0=1;
for (i = 0; i <= 3; i++) { time[i] = &temp[0]; }
for (i = 0; i <= 3; i++) { stime[i] = &temp[0]; }
- 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)