
#define DataPort P0
sbit LATCH1=P2^2;
sbit LATCH2=P2^3;------这些是给引脚或者端口起个别名,好记。
---------------------------------
unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char TempData[8];
void Delay(unsigned int t);
void Display(unsigned char FirstBit,unsigned char Num);-----------------------这些是全局变量和函数声明。
---------------------------------------
其他是函数了。函数一般根据功能进行封装的代码序列。
相信很多初学者都有同样的疑问,也有同样的希望。就是用C++语言来写单片机程序的源代码。现在我来解释一下单片机的源代码程序几乎没有人用C++来写的。\x0d\1 假设一下你现在用C++写完了一个程序代码。那么你要让单片机认识必须要编译吧,对吧 。请问你有合适的编译软件来编译你的代码吗?\x0d\2 就算有编译器能编译,你能保证它的代码效率一定能给单片机用吗?\x0d\ 单片机的ROM是K级的水平,执行指令的速度也远远小于PC。绝对不能和PC机相比的。这个就决定了单片机编程时很多时候要考虑它的代码效率和代码大小问题。所以一般情况下对于单片机编程我们之用汇编语言或者C语言。就算是用C写程序也要注意代码的效率等问题。\x0d\ 还有就是只有很大型的项目及应用程序开发才有可能有C++来写程序。一般的系统文件,应用程序都是用C来写的。有的系统代码甚至要用汇编语言来写。\x0d\举个生活中的例子:如果你从家里去公司上班你一般的出行方式是什么?\x0d\1坐公车 2骑车 3自己开车 4坐地铁 5走过去。如果谁说他是做直升飞机去上班的。那要么这个人脑子不正常,要么就是太有钱了炫富。如果你要打苍蝇用苍蝇拍子就行了。如果要你用巡航导d来打苍蝇,你认为可能吗?\x0d\ 所以我们单片机写程序的话一般就是汇编语言和C语言。几乎没有人用C++语言的。
#include <AT89X51H>
//数码管位代码表(P0口)//
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//数码管段代码表(P2口,共阴且高位接a,低位接h笔段)//
unsigned char code dispcode[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,
0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00};
//8位数据缓冲器//
unsigned char dispbuf[8];
unsigned char temp[8];
unsigned char dispcount;
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;
//初始化模块//
void initial(void){
TMOD=0x15;
TH0=0;
TL0=0;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
TR1=0;
TR0=0;
ET0=1;
ET1=1;
EA=1;
}
////
//显示模块//
void dataDisplay(){
unsigned char i;
for(i=0;i<8;i++){
temp[i]=0;
}
i=0;
while(x/10){
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<8;i++){
dispbuf[i]=temp[i];
}
P2=dispcode[dispbuf[dispcount]];
P0=dispbit[dispcount];
dispcount++;
if(dispcount==8){
dispcount=0;
}
}
////
//信号频率测量模块//
float frequency(float freq){
initial();
TR0=1;TR1=1;
if(timecount==250){
TR0=0;
freq=T0count65536+TH0256+TL0;
return(freq);
}
}
////
//信号周期测量模块//
float cycle(float count){
initial();
if(P3_4==1){
TR0=1;TR1=1;
if(P3_4==0){
TR0=0;
count=1000000/(timecount4000+TH1256+TL1-61536);
}
}
return(count);
}
////
//定时中断服务程序1//
void t1(void) interrupt 3 using 0{
//initial();
//TR0=1;
//TR1=1;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
timecount++;
}
////
//定时中断服务程序2//
void t0(void) interrupt 1 using 0{
//initial();
//TR0=1;
//TR1=1;
T0count++;
}
////
//主函数//
void main(void){
while(1){
x=frequency(x);
if(x<100){
x=cycle(x);
}
dataDisplay();
}
}
////
/
题目:同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波
设晶振频率为12MHz。
/
//
#include<reg52h> //52单片机头文件
#include <intrinsh> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit beep=P2^3;//应该是蜂鸣器吧采的
uchar tt;//自定义计数全局变量
uint fre,flag;//自定义全局变量
void main() //主函数
{
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);//等待中断产生
}
void timer0() interrupt 1 //定时器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使能
}
void timer1() interrupt 3 //定时器1中断用来产生2秒时间定时
{
TH1=(65536-50000)/256;//重置定时器高位计数
TL1=(65536-50000)%256;//重置定时器低位计数
flag++;//主频重置flag
if(flag==360)
{
flag=0;
fre=50000;
}
TR1=1;//这里少了个T1使能
}
以下用C语言和注释进行解释
ORG 0000H//以下程序代码从0X0000开始
AJMP MAIN//跳转到程序代码0x1000
ORG 1000H//以下程序代码从0x1000开始
MAIN: MOV R0,#DTTA1;//R0=DTTA1; 给R0赋值
MOV DPTR,#DTTA2;//DPTR=DTTA2; 给DPTR赋值,外部RAM需要DPTR寄存器传送
LOOP:MOV A,@R0;//A=(unsigned char)R0; R0地址的数据传送到累加器
CJNE A,'#',L1;//if(A != '#') goto L1;
AJMP E//goto E;
L1:CJNE A'',L1//if(A != '') goto L1;
AJMP E//goto E;
MOV @DPTR,A//(unsigned char)DPTR = A;
INC DPTR//DPTR ++;
INC RO//R0 ++;
DJNZ R7,LOOP//if((--R7) != 0) goto LOOP;
E:END//结束
有个错误在里面,L1:CJNE A,'',L1这句,应该改成L1:CJNE A,'',L2,然后把MOV @DPTR,A前面加上标号L2:
否则程序会一直卡在L1:CJNE A'',L1这里。
DJNZ R7,LOOP这句虽然看懂了,但是R7没有指明什么意义。感觉像是数据长度。相当于拷贝R7个退出,或者遇到#退出。
以上就是关于请问以下有关单片机的C语言程序代码的各语句含义(详细)全部的内容,包括:请问以下有关单片机的C语言程序代码的各语句含义(详细)、用c++怎样编写51单片机程序、单片机频率计原理程序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)