⑴ 我问一个c语言和单片机的问题麻烦高人帮我写下备注
#include <reg51.h>//头文件,一般是51的片子的
#define seg P2 //定义seg为P2口
#define segBit P3 // 同上
unsigned char code Table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e};
//共阳数码管的编码,自左向右一次是0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
void delay(unsigned char n)//延时函数,
{
unsigned char i;
for(i=0; i<n;i++);
}
main()
{
unsigned char num=0;
unsigned char i;
while(1)//进行键盘扫描
{
P1=0xff;//将P1口做输入口
if((P1&0x40)!=0x40)
{
delay(10);//软件去抖
if((P1&0x40)!=0x40)
{
while((P1&0x40)!=0x40);
num++;
}
}
for(i=0;i<4;i++)
{
P3=~(0x01<<i);//估计是选择需要点亮的数码管
P2=Table[num+i];//数码管要显示的数
delay(20);
}
}
}
for语句里面的内容是不是反了???呵呵呵。。俺也是新手,不是很了解。
⑵ 单片机c语言,这份代码我看不懂,打打注释
/*
题目:同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。
*/
/*********************************************************/
#include<reg52.h>//52单片机头文件
#include<intrins.h>//包含有左右循环移位子函数的库
#defineuintunsignedint//宏定义
#defineucharunsignedchar//宏定义
sbitbeep=P2^3;//应该是蜂鸣器吧采的
uchartt;//自定义计数全局变量
uintfre,flag;//自定义全局变量
voidmain() //主函数
{
fre=50000;//设置主频50KHZ
beep=0;//应该是蜂鸣器关闭
TMOD=0x11;//设置定时器0,定时器1为工作方式1---16位计时器
TH0=(65536-fre)/256;//T0定时器高位计数设置60
TL0=(65536-fre)%256;//T0定时器低位计数设置
TH1=(65536-50000)/256;//T1定时器高位计数设置
TL1=(65536-50000)%256;//T1定时器低位计数设置
EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
TR1=1;//启动定时器1
TR0=1;//启动定时器0
while(1);//等待中断产生
}
voidtimer0()interrupt1//定时器0中断
{
TR0=0;//进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失
TH0=(65536-fre)/256;//重置定时器高位计数
TL0=(65536-fre)%256;//重置定时器低位计数
tt++;//累加,为了下面逻辑
//依据flag设置主频及翻转蜂鸣器
if(flag<40)
if(tt==10)
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=40&&flag<80)
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=80&&flag<120)
{
tt=0;
fre=10000;
beep=~beep;
}
if(flag>=120&&flag<160)
{
tt=0;
fre=5000;
beep=~beep;
}
if(flag>=160&&flag<200)
{
tt=0;
fre=2500;
beep=~beep;
}
if(flag>=200&&flag<240)
{
tt=0;
fre=1250;
beep=~beep;
}
if(flag>=240&&flag<280)
{
tt=0;
fre=625;
beep=~beep;
}
if(flag>=280&&flag<320)
{
tt=0;
fre=312;
beep=~beep;
}
if(flag>=320&&flag<360)
{
tt=0;
fre=156;
beep=~beep;
}
TR0=1;//T0使能
}
voidtimer1()interrupt3//定时器1中断用来产生2秒时间定时
{
TH1=(65536-50000)/256;//重置定时器高位计数
TL1=(65536-50000)%256;//重置定时器低位计数
flag++;//主频重置flag
if(flag==360)
{
flag=0;
fre=50000;
}
TR1=1;//这里少了个T1使能
}
⑶ C语言单片机电子表注释在线等!!
你好!
很多语句都是重复的
1、下面定义数码管段变量
unsigned char ledreg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//
2、定义时分秒的变量
unsigned char dismod=0,setmod=0,hour=12,min=0,sec=0,count=0;
3、延时函数
void delay()
4、主函数
void main()
5、1号中断函数
void intt0() interrupt 1
6、0号中断函数
void intt0() interrupt 0
7、2号中断函数
void intt0() interrupt 2
⑷ 51单片机C语言程序注释标注(写全)
#include<reg51.h>//调用头文件reg51.h
voidmain()//主函数
{
unsignedchar//无符号字符型
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//定义一个数组LED数码管译码用的码表
while(1)//主循环
{
P2=P2|0x07;//P2口与0x07按位进行或运算
while(P2&0x07==0x07);//如果P2扣低三位为111则原地等待
switch(P2&0x07)//获取P2低三位值并且据此执行响应的操作
{
0x06:P0=tab[0x0D];break;//P2低三位为06H,数码管显示“d”
0x05:P0=tab[0x0E];break;//P2低三位为05H,数码管显示“E”
0x03:P0=tab[0x0F];break;//P2低三位为03H,数码管显示“F”
}
}
}
⑸ 单片机C语言,求大侠们,把每一项的注解标到后面,谢谢。
#include <reg52.h> //调用头文件reg52.h
sbit RS=P2^6; //位定义 把P2的第六位定义为RS 以后操作RS等同于操作P2^6
sbit RW=P2^5; //同上
sbit E=P2^7; //同上
unsigned char busy; //把变量busy定义为 无符号字符变量
void delay(unsigned char asf) //这是个延时函数 括号内asf 为延时的时间
{while(asf--);}//当asf>=1时一直在这循环,直到asf<1.
lcd_busy()//这是写一个函数 不过前面应该加上void 变为 void lcd_busy()
{RS=0;RW=1;E=1;P0=0X80;delay(0xff);//把0赋值给RS 把1赋值给RW 把1赋值给E。P0口输出0x80 延时0xff这么长时间。
if(P0==0X00)//if判断语句 当P0=0x00时执行下面busy=0x00语句
busy=0x00; //把0赋值给busy
else //如果上面的if判断不成立则执行busy=0x01
busy=0x01;//同上
}
write_cmd(unsigned char cmd)//创建子函数 口号内为定义cmd为无符号字符型变量
{
busy=1; //同上
while(busy)因为busy=1 所以会一直执行下面大括号内的语句 你这少了个括号
{
lcd_busy(); //调用lcd_busy()这个函数 在上面了
RS=0;RW=0;E=0;P0=cmd;//前三个是赋值语句和上面一样,后面是把cmd的值给P0
delay(0xff);延时函数 同上
E=1;//普通赋值
delay(0xff);延时函数 同上
E=0;//普通的赋值
}
lcd_cmd()//同上创建子函数
{
write_cmd(0x38);调用上面的write_cmd(unsigned char cmd)函数其中cmd被赋值为0x38
write_cmd(0x08);//同上
write_cmd(0x01);//同上
write_cmd(0x06);//同上
write_cmd(0x0c);//同上
write_cmd(0x84);//同上
}
lcd_date()//这个函数参考上面的lcd_busy()
{
busy=1;
while(busy)
lcd_busy();
RS=1;RW=0;E=0;P0=0X62;
delay(0xff);E=1;delay(0xff);E=0;
}
main()主函数
{lcd_cmd();lcd_date();while(1);}分别调用lcd_cmd();lcd_date();这两个子函数。while(1)死循环,函数执行到这就 一直执行这个。
⑹ 51单片机c语言程序备注,打不了这么多字见者与我联系,可谈价格
这个可以用定时器来做,比如检查某键,按键时间超过2秒后一个变量开始累加知道键释放为止。实现方法如下:#include#defineuintunsignedint#defineucharunsignedcharuintv=0,time=0;sbitkey=P1^0;voidt0isr()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;time++;if((key==0)&&(time>40)v++;//如果按键时间超过2秒且键未释放,变量+1if(key==1)time=0;//如果键释放,时间复位}main(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;while(1);}
⑺ 求C语言 单片机 数字钟注释
#include<reg52.h>
sbit ksec=P3^0; //定义P3.0端口
sbit kmin=P3^1;
sbit khour=P3^2;
unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;
unsigned int num=0,sec=0,min=0,hour=0; //时分秒的初值
unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int z) //延时程序,
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan();
void display();
void main()
{TMOD=0x01; //T/CO 工作在定时器方式1
TH0=(65536-50000)/256; //预置计数初值
TL0=(65536-50000)%256;
EA=1; //CPU开中断
ET0=1; //T/CO开中断
TR0=1; //启动T/CO开始定时
while(1)
{display();
keyscan();
}
}
void time0() interrupt 1 //T/CO中断服务程序入口
{num++;
TH0=(65536-50000)/256; //计数初值重装载
TL0=(65536-50000)%256;
}
void display()
{if(num==20) //当时间计数到1秒,秒数加一
{num=0;
sec++;
if(sec==60) //秒数计数到60,分钟数加一,秒钟数返0
{sec=0;
min++;
if(min==60)
{min=0;
hour++;
if(hour==24)
{hour=0;
min=0;
sec=0;
}
}
}
}
⑻ 在线等单片机程序C语言注释
不难啊,认真点,把拼音还有变量的英文翻译出来,看下的话就知道了,看你贴的代码,功能应该是获取温度,湿度,光照强度,然后串口打印的吧?,然后串口接收到的数据,通过digitalWrite控制个什么,这个函数暂时看不出不知道做什么。
⑼ 单片机 C语言 这个程序的大致意思望备注 谢谢!!!
#include"AT89X52.h"
unsignedcharSHUMA[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsignedcharKeyScan(void)//独立按键检测
{
if(P3_1==0) //P3.1为键K1
{
return1;
}
elseif(P3_0==0)//P3.0为键K2
{
return2;
}
elseif(P3_2==0)//P3.2为键K3
{
return3;
}
elseif(P3_3==0)//P3.3为键K4
{
return4;
}
else
{
return0;//没有按键返回0
}
}
voidDisplay(unsignedcharNum)//数码管显示程序
{
P2_4=0;P2_3=0;P2_2=0;//段选控制位
P0=SHUMA[Num];//位码送P0口
}
voidmain(void)
{
while(1)
{
if(KeyScan()==1)//按键K1按下
{
Display(1);//显示“1”
}
elseif(KeyScan()==2)//按键K2按下
{
Display(2);//显示“2”
}
elseif(KeyScan()==3)//按键K3按下
{
Display(3);//显示“3”
}
elseif(KeyScan()==4)//按键K4按下
{
Display(4);//显示“4”
}
else
{
Display(0);//没有按键显示“0”
}
}
}
⑽ 求单片机 数字钟 c语言代码注释
#include<reg51.h>
unsigned char code su[11]={0x3f,0x06,0x5b,0X4F,0x66,0X6D,0x7d,0x07,0x7f,0x6f,0x40};//数码管显示
unsigned char xian[8]={0,0,10,0,0,10,0,0};
unsigned char sen=0,min=0,hou=0,sen2=0,min2=0,hou2=0,sen3=59,min3=59,hou3=23,num;//变量定义
//--------引脚定义
sbit ks=P1^4; //秒按键
sbit km=P1^5; //分按键
sbit kh=P1^6; //时按键
sbit ds=P1^7;
sbit bb=P3^4;
//-------8个数码管位显示接口
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
bit jp1,jp2,jp3;//位定义
int n=0,jp4;
//----演示程序
void daly()
{
unsigned char j;
for(j=60;j;j--);//for循环
}
//------数码管显示
void show()
{
xian[0]=hou/10; //时的十位
xian[1]=hou%10; //时的个位
xian[3]=min/10; //分的十位
xian[4]=min%10; //分的个位
xian[6]=sen/10; //秒的十位
xian[7]=sen%10; //秒的个位
P0=su[xian[7]]; //八段数码管显示秒的个位
P20=0; //动态显示,打开第一个数码管
daly(); //延时
P20=1; //动态显示,关闭第一个数码管
P0=su[xian[6]];//八段数码管显示秒的十位
P21=0;//动态显示,打开第二个数码管
daly();//延时
P21=1;//动态显示,打开第二个数码管
//--------------------
P0=su[xian[5]];//注:你xian[3]xian[5]都为从定义
P22=0;
daly();
P22=1;
//-------------分个位的显示
P0=su[xian[4]];
P23=0;
daly();
P23=1;
//-----------
P0=su[xian[3]];//注:你xian[3]xian[5]都为从定义
P24=0;
daly();
P24=1;
//------------分十位的显示
P0=su[xian[2]];
P25=0;
daly();
P25=1;
//-------------时个位的显示
P0=su[xian[1]];
P26=0;
daly();
P26=1;
//-----------时十位的显示
P0=su[xian[0]];
P27=0;
daly();
P27=1;
}
//---------按键程序
void key()
{
if((ks==0)&&(jp1==0))
{
jp1=1;//秒按键生效
daly();//消抖
if(ks==0) sen++; //秒加1
}
else if((ks==1)&&(jp1==1)) jp1=0;//秒按键未生效
if(sen==60)//等于60时
{
min++;//分加1
sen=0;//秒清零
}
if((km==0)&&(jp2==0))
{
jp2=1;//分按键生效
daly();//消抖
if(km==0) min++;//分加1
}
else if((km==1)&&(jp2==1)) jp2=0;//分按键未生效
if(min==60)//等于60时
{
hou++;//时加1
min=0;//分清零
}
if((kh==0)&&(jp3==0))
{
jp3=1;//时按键生效
daly(); //消抖
if(kh==0) hou++;//时加1
}
else if((kh==1)&&(jp3==1)) jp3=0;//时按键未生效
if(hou==24) hou=0;//时为24时,清零
if(ds==0)//定时操作
{
daly();//消抖
while(ds==0);
daly();
if(ds==1) jp4++;//定时按键生效,加一
if(jp4>1) jp4=0;//JP4只能是一。
/*注:就本人感觉而言这两句就是废话,一句就能完事:if(ds==1) jp4=1;*/
}
}
//-------从功能上看这是定时
dings()
{
EA=0; //关闭中断
TR0=0;//T0停止计数
hou2=hou;//把现有的时分秒,保留储存在hou2,min2,sen2
min2=min;
sen2=sen;
hou=0; //清零
min=0;
sen=0;
while(jp4==1) //等待直到按键生效
{
hou3=hou; //把现有的时分秒,保留储存在hou3,min3,sen3
min3=min;
sen3=sen;
show(); //现实
key();//按键扫描
hou3=hou;//把按键后更改的时分秒,也就是定时时间,保留储存在hou3,min3,sen3
min3=min;
sen3=sen;
}
hou=hou2;//把远有的时间分别还原
min=min2;
sen=sen2;
EA=1;//开中断
TR0=1;//T0计数
}
void main()
{
TMOD=0x01;//定时器0方式1
TH0=45535>>8;//赋初值
TL0=45535;
EA=1; //允许中断
ET0=1;//T0中断使能
EX1=1;//外部中断1
TR0=1;//T0开始计数
hou3=99;
min3=99;
sen3=99;
while(1)
{
show();//显示
key();//按键程序
dings();//定时操作
if(((hou*60+min))*60+sen>=((hou3*60+min3))*60+sen3 )//判断是否到了定时时间
{
bb=0;//蜂鸣器鸣叫(也可能是其他音乐芯片)
num++;
if(num>=500) //鸣叫延时
{
bb=1; //蜂鸣器关闭
num=0; //延时计数清零
jp4=0;//位清零
hou3=99;//重新赋值
min3=99;
sen3=99;
}
}
}
}
void_time0_(void)interrupt 1
{
TL0=45535; //定时器0重新赋值
TH0=45535>>8;
if(++n==50) //1秒
{
n=0;
sen++; //秒加1
if(sen==60) //加到60
{
min++;
sen=0;
}//分加1
if(min==60)//加到60
{
hou++;
min=0;
}//时加1
if(hou==24) hou=0;//24时,时变成0
}
}
说实话,这个程序编写的很烂。