51单片机c语言程序

51单片机c语言程序,第1张

答:楼主先搞清C51中定义数据的类型。

char型 8位(-127到128);int型16位-32727到+32728(两个字节)

unsigned char是8位但从0到255,unsignde int 16位从0到65535;

楼主程序中的TH0/TL0是8位uchar型;tmp是16位uint型。

tmp=TL0|(TH0<<8);

这句在执行时先进行类型转换,把TL0/TH0暂时转换成16位uint型数据,(高位补0),再给TH0左移8位,和TL0相“或”,得到的是16位uint数据,赋给tmp

/

/ MCU: AT89S52

/ MCU-crystal: 12M

/ Version: 01

/ Last Updata: 2009-2-21

/ Author:

/ Description:

/ 使用定时器0,定时中断2ms一次对数码管显示扫描;

/ 三个位管要以扫描方式显示,使用共阳管,计数速度为1S;

/ 段A-H接到P017,位选为 P10,1,2;

/ 流水也以计数方式从200到250在P2口显示,低电平有效;

//

#include <reg52h>

unsigned char code num_disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};//共阳数字字形0到9

unsigned char code bit_sel[]={0xfb,0xfd,0xfe};//低电平有效数字个十百位选择

unsigned char buf[3]={0,0,2};//计算中的个十百位暂时存放处

unsigned char one,ten,second;//个十位变量和流水灯显示3秒的时间变量

unsigned char rate;//扫描速度,调整以适应显示效果

unsigned char stop=0, flag=1,flag1=0;//闪烁3秒的标志位,用于主函数对中断的关断参数传递

unsigned int t,tt;//2ms变量

unsigned char rate;//与变量t同步,辅助赋值变

/主函数/

main(void)

{

TMOD=0X01;

TH0=0xf8;//定时2ms

TL0=0x30;

ET0=1;

EA=1;

TR0=1;

while(1)

{ if(stop==1)//判断stop信号,为1后便关闭定时器

{ TR0=0;

ET0=0;

EA=0;

}

}

}

/中断/

void timer0() interrupt 1

{

TH0=0xf8;//重新赋值定时2ms

TL0=0x30;

if(flag==0)//定义用于判断计数是否到了250,若到了则不再计数,转向else执行流水灯闪烁任务

{

t++;

if(t==500)

{ t=0;

one++;

P2=200+ten10+one; //在P2口的流水等,也是从200开始计数。

if(one==10)

{ one=0;

ten++;

if(ten==5)

{ flag=1;//转向执行闪烁任务

}

}

}

}

else//flag已经==1;转向else执行流水灯闪烁任务

{ tt++;

if(tt==500)

{ tt=0;

second++;

P2=~P2;//流水灯全部以1S速度闪烁

if(second==3)stop=1;//判断3秒时间到,关闭中断,停止闪烁,数码管熄灭

}

}

rate++;

P0=0XFF;//消隐

if(rate==3)rate=0;

P0=num_disp[buf[rate]];

P1=bit_sel[rate];

buf[0]=one;

buf[1]=ten;

//因为百位没有变,所以不用赋值

}

通过中断的方式,使用定时器0来提供1KHz的方波,蜂鸣器引脚定义为P10。代码如下:

#include

<reg51h>

#define

u8

unsigned

char

sbit

BEEP=P1^0;

void

main

{

EA=1;//开总中断

IT0=1;//打开定时器0源中断允许开关

TMOD=0x01;//选择定时器0工作在方式0

TR0=1;//启动定时器0

TH1=(65536-1000)/256;//赋值,定时1ms

TL1=(65536-1000)%256;

while(1)

{;}

}

void

TIM()

interrupt

1

{

TH1=(65536-1000)/256;

TL1=(65536-1000)%256;

BEEP=~BEEP;//蜂鸣器引脚输出1KHz方波

}

//第一个实验:

//假设8个LED阴极指向单片机,D11连接P01,D12连接P02  D18连接P07

//假设K1按键在P23引脚

#include<reg51h>

#include<intrinsh>

sbit k1=P2^3;//假设K1按键在P23引脚

void main()

{

P0=0xfe;

while(1)

{

if(k1==0)

{

while(k1==0);

P0=_crol_(P0,1);

}

}

}

//第二个实验:

//假设8个LED阴极指向单片机,D11连接P01,D12连接P02  D18连接P07

#include<reg51h>

char led[]={0xfe,0xff,0xfd,0xff,0xfb,0xff,0xf7,0xff,0xef,0xff,0xdf,0xff,0xbf,0xff,0x7f,0xff};

void main()

{

char i=0;

char counter=0;

TMOD=0x01;//T0 工作方式1

TH0=(655356-50000)/256;//延时50ms

TL0=(655356-50000)%256;//延时50ms

TR0=1;//启动T0

while(1)

{

if(TF0==1)//查询

{

TH0=(655356-50000)/256;//重新延时50ms

TL0=(655356-50000)%256;//重新延时50ms

counter++;

if(counter==10)//延时05秒

{

counter=0;//重新开始新一轮05秒延时

i++;

if(i==16)

{

i=0;

}

P0=led[i];//点灯

}

}

}

}

以下是我编的简易计算器程序,基本成功

//44键盘检测程序,按下键后相应的代码显示在液晶屏上

//显示5位后,第6次显示 *** 作符号

//再显示下一个数

// 键值与功能对应表

//键值 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零

#include<reg52h>

sbit beep=P2^3;

sbit lcden=P3^4;

sbit rs=P3^5;

sbit rw=P3^6;

#define uint unsigned int

#define ulint unsigned long int

#define uchar unsigned char

#define lcddata P0

ulint bb,dd,ee,ff;

uchar d,flag1;

uchar fd1,fd2;

uchar b1=16,b2=16,b3=16,b4=16,b5=16;

uchar d1=16,d2=16,d3=16,d4=16,d5=16;

uchar f1=16,f2=16,f3=16,f4=16,f5=16,f6=16,f7=16,f8=16,f9=16,f10=16;

uchar key,keyval,c,temp;

void Delay1ms(uint i) //1ms延时程序

{

uint j;

for(;i>0;i--)

{

for(j=0;j<125;j++)

{;}

}

}

void write_com(uchar com)

{

lcddata=com;

rs=0;

rw = 0;

lcden=0;

Delay1ms(10);

lcden=1;

Delay1ms(10);

lcden=0;

}

void write_date(uchar date)

{

lcddata=date;

rs=1;

rw=0;

lcden=0;

Delay1ms(10);

lcden=1;

Delay1ms(10);

lcden=0;

}

void init2()

{

rw=0;

write_com(0x38);

Delay1ms(10);

write_com(0x0f);

Delay1ms(10);

write_com(0x06);

Delay1ms(10);

write_com(0x01);

Delay1ms(10);

}

void display1(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第1个数显示程序

{

init2();

write_com(0x80);//第1行,第1字

Delay1ms(10);

write_date(0x30+A1);

Delay1ms(10);

write_date(0x30+A2);

Delay1ms(10);

write_date(0x30+A3);

Delay1ms(10);

write_date(0x30+A4);

Delay1ms(10);

write_date(0x30+A5);

Delay1ms(10);

}

void display2(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第2个数显示程序

{

write_com(0x88);//第1行,第1字

Delay1ms(10);

write_date(0x30+A1);

Delay1ms(10);

write_date(0x30+A2);

Delay1ms(10);

write_date(0x30+A3);

Delay1ms(10);

write_date(0x30+A4);

Delay1ms(10);

write_date(0x30+A5);

Delay1ms(10);

}

void display3(uchar a) // *** 作符号显示程序

{

write_com(0x86);//第1行,第1字

Delay1ms(10);

switch(a)

{

case 10:

write_date('+');

Delay1ms(10);

case 11:

write_date('-');

Delay1ms(10);

case 12:

write_date('x');

Delay1ms(10);

case 13:

write_date('/');

Delay1ms(10);

}

}

void display4(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5,uchar A6,uchar A7,uchar A8,uchar A9,uchar A10,uchar A11,uchar A12) //结果显示程序

{

write_com(0x80+0x40);//第2行,第1字

Delay1ms(10);

if (flag1==0)

{

write_date('-');

}

else write_date('+');

Delay1ms(10);

write_date(0x30+A1);

Delay1ms(10);

write_date(0x30+A2);

Delay1ms(10);

write_date(0x30+A3);

Delay1ms(10);

write_date(0x30+A4);

Delay1ms(10);

write_date(0x30+A5);

Delay1ms(10);

write_date(0x30+A6);

Delay1ms(10);

write_date(0x30+A7);

Delay1ms(10);

write_date(0x30+A8);

Delay1ms(10);

write_date(0x30+A9);

Delay1ms(10);

write_date(0x30+A10);

Delay1ms(10);

write_date('');

Delay1ms(10);

write_date(0x30+A11);

Delay1ms(10);

write_date(0x30+A12);

Delay1ms(10);

}

uchar keyscan()

{

key=16;

P3=0xef;//P37输出1个低电平

temp=P3; //读取

temp=temp&0x0f;//屏蔽高4位

if(temp!=0x0f)

{

Delay1ms(10);

if(temp!=0x0f)

{

temp=P3;

switch(temp)

{

case 0xee:

key=0;

break;

case 0xed:

key=4;

break;

case 0xeb:

key=8;

break;

case 0xe7:

key=12;

break;

}

while(temp!=0x0f)

{

temp=P3;

temp=temp&0x0f;

beep=0;

}

beep=1;

}

}

P3=0xdf;

temp=P3;

temp=temp&0x0f;

if(temp!=0x0f)

{

Delay1ms(10);

if(temp!=0x0f)

{

temp=P3;

switch(temp)

{

case 0xde:

key=1;

break;

case 0xdd:

key=5;

break;

case 0xdb:

key=9;

break;

case 0xd7:

key=13;

break;

}

while(temp!=0x0f)

{

temp=P3;

temp=temp&0x0f;

beep=0;

}

beep=1;

}

}

P3=0xbf;

temp=P3;

temp=temp&0x0f;

if(temp!=0x0f)

{

Delay1ms(10);

if(temp!=0x0f)

{

temp=P3;

switch(temp)

{

case 0xbe:

key=2;

break;

case 0xbd:

key=6;

break;

case 0xbb:

key=10;

break;

case 0xb7:

key=14;

break;

}

while(temp!=0x0f)

{

temp=P3;

temp=temp&0x0f;

beep=0;

}

beep=1;

}

}

P3=0x7f;

temp=P3;

temp=temp&0x0f;

if(temp!=0x0f)

{

Delay1ms(10);

if(temp!=0x0f)

{

temp=P3;

switch(temp)

{

case 0x7e:

key=3;

break;

case 0x7d:

key=7;

break;

case 0x7b:

key=11;

break;

case 0x77:

key=15;

break;

}

while(temp!=0x0f)

{

temp=P3;

temp=temp&0x0f;

beep=0;

}

beep=1;

}

}

return(key);

}

void main()

{ while(1)

{

c=1;

while(c<6)//输入第1个5 位数

{

keyval=keyscan();

if(keyval<10)

{

switch(c)

{

case 1:b1=keyval; break;

case 2:b2=keyval; break;

case 3:b3=keyval; break;

case 4:b4=keyval; break;

case 5:b5=keyval; break;

}

c++;

}

display1(b1,b2,b3,b4,b5);

}

while(c==6) //输入计算符号

{

keyval=keyscan();

if((keyval>=10)&&(keyval<14)) //可去一层括号,因逻辑运算优先级较低

{

d=keyval;

}

c=1;

display3(d);

}

while(c<6) //输入第2个5 位数

{

keyval=keyscan();

if(keyval<10)

{

switch(c)

{

case 1:d1=keyval; break;

case 2:d2=keyval; break;

case 3:d3=keyval; break;

case 4:d4=keyval; break;// 除

case 5:d5=keyval; break;

}

c++;

}

display2(d1,d2,d3,d4,d5);

}

bb= b110000+b21000+b3100+b410+b5;

dd=d110000+d11000+d3100+d410+d5;

while(keyval!=14) //等待按下"="

{

keyval=keyscan();

}

Delay1ms(10);

switch(d)

{

case 10:ee=bb+dd; break;//+

case 11:

flag1=1;

if(bb>=dd)

{

ee=bb-dd; //-

flag1=0;

}

else ee=dd-bb;

break;

case 12:ee=bbdd; break;//可能会溢出

case 13:ee=bb/dd; //除法小数部分会丢失,保留2位

ff=bb%dd;

fd1=ff10/dd;

fd2=ff100/dd%10;

break;

}

f10=ee/1000000000%10;

f9=ee/100000000%10;

f8=ee/10000000%10;

f7=ee/1000000%10;

f6=ee/100000%10;

f5=ee/10000%10;

f4=ee/1000%10;

f3=ee/100%10;

f2=ee/10%10;

f1=ee%10;

display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2);

while(keyval!=15)

{

keyval=keyscan();

}

b1=0;b2=0;b3=0;b4=0;b5=0;

d1=0;d2=0;d3=0;d4=0;d5=0;

bb=0;dd=0;ee=0;

init2();

}

}

以上就是关于51单片机c语言程序全部的内容,包括:51单片机c语言程序、用C语言编写8051单片机程序、51单片机蜂鸣器发出1KHz的信号的c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9868262.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存