STC89c52单片机 计算器C语言程序

合集下载

基于STC89C52的简易计算器设计..

基于STC89C52的简易计算器设计..

福建电力职业技术学院课程设计课程名称:《智能仪器》题目:基于STC89C52的简易计算器设计专业班次:姓名:学号:指导教师:学期:2011-2012学年第2学期日期:2012.2目录目录1.引言 (1)1.1 设计意义 (1)1.2 设计任务和主要内容 (1)2. 硬件设计 (2)2.1 系统框图 (2)2.2 最小系统 (2)2.3 矩阵键盘 (3)2.4 LCD1602 (4)3. 软件设计 (5)3.1矩阵键盘扫描原理 (5)3.2 LCD1602的软件设计 (6)3.3 主程序设计 (8)3.4 源程序 (9)3.5 调试结果 (9)4. 设计小结 (9)参考文献 (10)附录 (10)1.引言随着社会的发展,人们生活水平的提高,单片机的应用越来越贴近生活了,人们常用单片机来实现一些简单的电子设计。

计算器在人们的日常生活中是不可或缺的电子产品之一,目前市场上的计算器基本可以满足我们的日常需求,但它还在发展之中,我们要继续研究出更加强大的计算器。

基于这样的理念,本设计采用单片机来设计简易计算器。

本设计是以STC89C52为单片机,LCD为显示器设计的简易计算器,所设计的计算器将完成两位数的加、减、乘、除等功能。

1.1 设计意义通过本次课程设计,进一步掌握单片机知识,知道AT89S52单片机的原理、编程和各种功能的应用,了解简易计算器的工作原理,初步掌握计算器的硬软件设计、编写、调试和仿真,充分提高动手能力和排除故障的能力,同时通过课程设计加深我们对单片机的认识和兴趣,发挥我们的创新能力和动手能力。

1.2 设计任务和主要内容本设计要制作的就是单片机于生活中最为常见的一种应用——简易计算器,以STC89C52单片机作为核心来进行的数字计算器模拟系统设计,可以完成计算器的键盘输入,进行加、减、乘、除两位数范围内的基本四则运算,并在LCD 上显示相应的结果。

设计电路采用AT89C51单片机为主要控制电路,显示采用LCD静态显示,软件方面使用C语言编程,并用PROTUES仿真。

STC89C52单片机的一些程序,包括串口通信,定时中断

STC89C52单片机的一些程序,包括串口通信,定时中断

针对STC89C52RC单片机的一些程序基本串口通信程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define SEND 0#define RECEIVE 1uchar flag_Serial = SEND;uchar Rx_Buf;sbit SMG = P1^7;//0 1 2 3 4 5 6 7 8 9 a b c d e fuchar code Show[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19,0x11,0xc1,0x63,0x85,0x61,0x71};void Serial_Init();void Serial_send();void Display();void Delay_1ms(uchar z);/****************************************************/ //main function///****************************************************/ void main(){Serial_Init();while(1){switch(flag_Serial){case SEND:flag_Serial = RECEIVE;Serial_send();break;case RECEIVE:Display();break;}}}/****************************************************/ //serial initial///****************************************************/ void Serial_Init(){TMOD = 0X20; //work in mode 2PCON = 0X00;SCON = 0X50;TH1 = 0XFD; //BRUD 9600TL1 = 0XFD;TR1 = 1; //open interrupt 1ES = 1; //open the serialEA = 1; //open the key interruptflag_Serial = SEND;SMG = 0;}/****************************************************/ //serial interrupt function///****************************************************/ void Serial() interrupt 4 using 2{EA = 0;if(RI!=0&&flag_Serial==RECEIVE){RI = 0;Rx_Buf = SBUF;flag_Serial = SEND;}EA = 1;}/****************************************************/ //mcu send data to serial///****************************************************/ void Serial_send(){SBUF = Rx_Buf;while(TI==0);TI=0;}/****************************************************/ //display the data by SMG///****************************************************/ void Display(){P2 = Show[Rx_Buf];Delay_1ms(3);}/****************************************************/ //delay for z*1ms///****************************************************/ void Delay_1ms(uchar z){uchar i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}串口通信,按键加减#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define SEND 0#define RECEIVE 1sbit KEY1 = P1^4;sbit KEY2 = P1^5;sbit LED1 = P1^0;sbit LED2 = P1^1;sbit SMG = P1^7;uchar flag_Serial = SEND;uchar Rx_Buf;uchar Smg_Buf;//0 1 2 3 4 5 6 7 8 9 a b c d e fuchar code Show[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19,0x11,0xc1,0x63,0x85,0x61,0x71};void Serial_Init();void Serial_send();void Display();void Delay_1ms(uchar z);void Scan();/****************************************************/ //main function///****************************************************/ void main(){Serial_Init();while(1){switch(flag_Serial){case SEND:flag_Serial = RECEIVE;Serial_send();break;case RECEIVE:Display();break;}Scan();}}/****************************************************/ //serial initial///****************************************************/ void Serial_Init(){TMOD = 0X20; //work in mode 2PCON = 0X00;SCON = 0X50;TH1 = 0XFD; //BRUD 9600TL1 = 0XFD;TR1 = 1; //open interrupt 1ES = 1; //open the serialEA = 1; //open the key interruptflag_Serial = SEND;SMG = 0;}/****************************************************/ //serial interrupt function///****************************************************/ void Serial() interrupt 4 using 2{EA = 0;if(RI!=0&&flag_Serial==RECEIVE){RI = 0;Rx_Buf = SBUF;flag_Serial = SEND;}EA = 1;}/****************************************************/ //mcu send data to serial///****************************************************/ void Serial_send(){SBUF = Rx_Buf;while(TI==0);TI=0;}/****************************************************/ //display the data by SMG///****************************************************/ void Display(){P2 = Show[Rx_Buf];Delay_1ms(3);}/****************************************************/ //delay for z*1ms/****************************************************/ void Delay_1ms(uchar z){uchar i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}/****************************************************/ //scan the keys///****************************************************/ void Scan(){if(KEY1==0){Delay_1ms(10);if(KEY1==0){LED1 = ~LED1;Rx_Buf++;if(Rx_Buf==16)Rx_Buf = 0;Display();while(KEY1==0);}}if(KEY2==0){Delay_1ms(10);if(KEY2==0){LED2 = ~LED2;if(Rx_Buf==0)Rx_Buf = 15;elseRx_Buf--;Display();while(KEY2==0);}}}串口通信,按键加减提示音,(利用定时中断)快速加减提示音#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define SEND 0#define RECEIVE 1#define NORMAL 0#define INCREASE 1#define DECREASE 2sbit KEY1 = P1^4;sbit KEY2 = P1^5;sbit LED1 = P1^0;sbit LED2 = P1^1;sbit SMG = P1^7;sbit SPEAKER = P1^6;uchar flag_Serial = SEND;uchar Rx_Buf;uchar count_2s;uchar flag_KS;//0 1 2 3 4 5 6 7 8 9 a b c d e fuchar code Show[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19,0x11,0xc1,0x63,0x85,0x61,0x71};void Serial_Init();void Serial_send();void Display();void Delay_1ms(uchar z);void Scan();/****************************************************/ //main function///****************************************************/ void main(){Serial_Init();while(1){switch(flag_Serial){case SEND:flag_Serial = RECEIVE;Serial_send();break;case RECEIVE:Display();break;}Scan();}}/****************************************************/ //serial initial///****************************************************/ void Serial_Init(){TMOD = 0X21; //work in mode 2PCON = 0X00;SCON = 0X50;TH1 = 0XFD; //BRUD 9600TL1 = 0XFD;TR1 = 1; //open interrupt 1ES = 1; //open the serialTH0 = (65536-50000)/256;TL0 = (65536-50000)%256;ET0 = 1;TR0 = 0;EA = 1; //open the key interruptflag_Serial = SEND;SMG = 0;}/****************************************************/ //serial interrupt function///****************************************************/ void Serial() interrupt 4{EA = 0;if(RI!=0&&flag_Serial==RECEIVE){RI = 0;Rx_Buf = SBUF;flag_Serial = SEND;}EA = 1;}/****************************************************/ //interrupt zero function///****************************************************/ void Timer0() interrupt 1{TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;count_2s++;if(count_2s==40) //50ms*40=2s{count_2s=0;if(KEY1==0)flag_KS = INCREASE;elseflag_KS = DECREASE;}}/****************************************************/ //mcu send data to serial///****************************************************/ void Serial_send(){SBUF = Rx_Buf;while(TI==0);TI=0;}/****************************************************/ //display the data by SMG///****************************************************/void Display(){P2 = Show[Rx_Buf];}/****************************************************/ //delay for z*1ms///****************************************************/ void Delay_1ms(uchar z){uchar i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}/****************************************************/ //scan the keys///****************************************************/ void Scan(){if(KEY1==0){Delay_1ms(10);if(KEY1==0){LED1 = 0;SPEAKER = 0;Delay_1ms(250);SPEAKER = 1;Delay_1ms(250);LED1 = 1;flag_Serial = SEND;Rx_Buf++;if(Rx_Buf==16)Rx_Buf = 0;Display();while(KEY1==0){TR0 = 1;ES = 0;if(flag_KS==INCREASE && count_2s==4){count_2s=0;Rx_Buf++;if(Rx_Buf==16)Rx_Buf = 0;SPEAKER = 0 ;LED1 = 0 ;Delay_1ms(200);SPEAKER = 1 ;LED1 = 1 ;Delay_1ms(200);Display();}}flag_KS = NORMAL;ES = 1;TR0 = 0;}}if(KEY2==0){Delay_1ms(10);if(KEY2==0){LED2 = 0;SPEAKER = 0;Delay_1ms(125);SPEAKER = 1;Delay_1ms(250);LED2 = 1;flag_Serial = SEND;if(Rx_Buf==0)Rx_Buf = 15;elseRx_Buf--;Display();while(KEY2==0){TR0 = 1;ES = 0;if(flag_KS==DECREASE && count_2s==4){count_2s=0;if(Rx_Buf==0)Rx_Buf = 15;elseRx_Buf--;SPEAKER = 0 ;LED2 = 0 ;Delay_1ms(200);SPEAKER = 1 ;LED2 = 1 ;Delay_1ms(200);Display();}}flag_KS = NORMAL;ES = 1;TR0 = 0;}}}。

基于89c52单片机的智能计算器程序

基于89c52单片机的智能计算器程序
Main.c
#include<reg52.h>
#include"lcd.h"
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit led=P3^7;
sbit beep=P2^0;
uint8 key,num;
uint8 fuhao;//定义具体的那个符号,是加减还是乘除。
else
{
//led=1;
b=b*10+dat1[num];
}
}
else
{
flag=1;
fuhao=3;//带表乘号*
}
lcdwrd(0x30+dat1[num]);
}
P1=0xf7;//令第四行为0,判断哪一列按下
if(P1!=0xf7)
{
delay(1000);
if(P1!=0xf7)
{
key=P1&0xf0;
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==2) //减
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
void delay(uint16 i)
{
while(i--);
}
void lcdwrc(uint8 c)
{
LcdWriteCom(c);

数字时钟_89C52_单片机C语言程序

数字时钟_89C52_单片机C语言程序
/*列扫描控制 LED1位 2位 3位 4位 5位 6位 7位 8位*/
uchar MON[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
uchar A;
uchar BIN=0; /* 【BIN】作为倒计时开始的标志 */
TH0 = (65536 - 10000) / 256; /*给定计时器高位赋予 初值=15536/256*/
TL0 = (65536 - 10000) % 256; /*给定计时器低位赋予 初值=15536%256 */
ET0 = 1; /*打开定时器外部终断0允许 ET1是中断器1的开关*/
P2 = C[4];
Delay(1);
P0 = Code[Msec%10]; /*第五位的数字显示【分】的【个】位 */
P2 = C[5];
Delay(1);
Delay(1);
P0 = 0x40; /*第六位符号【-】的显示 */
P2 = C[6];
Delay(1);
P2 = C[2];
Delay(1);
if(x/50==0)
P0 = 0x40; /*第三位符号【-】的显示 */
else
P0 = 0x00;
P2 = C[3];
Delay(1);
P0 = Code[min/10]; /*第四位的数字的显示【分】的【十】位 */
uchar month=7;
uchar month2;
uchar day=19;
uchar set1 = 1; /* set1=1 是调节 时分秒 set1=2时时调节 年月日 set=3时事调节闹钟 */

电子设计-基于STC89C52RC单片机的简易计算器设计.docx

电子设计-基于STC89C52RC单片机的简易计算器设计.docx

电子设计实验名称:基于STC89C52RC单片机的简易计算器设计姓名:学号:指导老师:一、可行性研究■-二、方案述.....2.1、功能介■■■..3 (4)、设可彳亍性分析:1.2.1经济可行性由于只是实验性质的编程,所以在设计和开发都不需要过多的经费,但是系 统投入运行以后,硕件维护和损耗所造成的耗费是必须的,但是数目也不会很大。

基本功能 .......... 扩展功能 ..........2.2、总体设计方案…… 总体设计思路•- 方案论证与比较系统组成 ........... 三、详细设计 .............1. 各个模块设计…… 输入模块: 运算模块: 显示模块: 阀件电设计 2.键盘扫描•….单片机控制…LCD 1602 显硬件连接121213 14 153.元件的介绍 ........ STC89C52单片机组成 复位和复位电路…•…LCD 1602 显示5 ■5 •6器•……4.PCB 设计以及结果显示五、总结 ...... ....... 附录主要程序代码 .............19 222425所以经过初步分析,经济上基本上是可行的1.2.2技术可行性在技术方面,因为都学习了C语言,硕件课程设计等课程,对于开发语言C语言也有一定的掌控能力,应该能够完成相应的任务。

1.2.3运行可行性该成果简单易操作,非常容易使用。

1.2.4法律可行性由于我们需要完成的功能相对简单,没有太多涉及到很专业方面的内容,更没有计划将系统利用到商业用途,所以不存在侵权或者版权纠纷方面的问题。

125结论该系统的软硬件都比较容易理解和实现,所以,具有实现一计算器的可行性。

二、设计方案简述2.1功能概述系统基本功能:(1)由于设计的计算器要进行四则运算,为了得到较好的显示效果,经综合分析后,最后采用LCD显示数据和结果。

(2)采用键盘输入方式,键盘包括数字键(0〜9)、符号键(+、-、X、清除键(onV )和等号键(=),故只需要16个按键即口J,设计中采用集成的计算 键盘。

STC89C52+PT2313 C语言程序源代码

STC89C52+PT2313 C语言程序源代码
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
write_com(temp+j);
delay_ms(2);
sbit rw=P2^1;
sbit en=P2^2;
bit flag;
uint time;
static uchar long_press_count=0,vol=0,bass=7,treble=7;
static char left=0,right=0;
static uchar input_flag=0;
/* 0x88= 10001000 ,由tone[]与0x88求和来计算bass&treble增益
0x00 0000 -14dB
0x01 0001 -12dB
0x02 0010 -10dB
0x03 0011 -8dB
0x04 0100 -6dB
{
uint x,y;
for(x=i;i>0;i--)
for(y=123;y>0;y--);
}
//开始信号
void start()
{
sda=1;
delay();
scl=1;
void write_7313(uchar dat)
{
start();
write_i2c(SC7313_ADD);
while(!respons());
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char

c单片机C语言编写的PWM程序

c单片机C语言编写的PWM程序

89c51单片机C语言编写的PWM程序PWM, 单片机, C语言, 程序, 编写分享到:新浪微博 QQ空间开心网人人网说明:本程序使用STC89C52RC单片机,22.1184MHz晶振,要使用本程序需要自己修改,我是用来控制直流电机的,外接了L298驱动电路,有问题或意见请回复,谢谢^_^#include "reg52.H"#include "MyType.h"//=============L298端口定义===============sbit ENA = P3^6;?//左轮驱动使能sbit IN1 = P0^3;?//左轮黑线(-)sbit IN2 = P0^4;?//左轮红线(+)sbit IN3 = P0^5;?//右轮红线(-)sbit IN4 = P0^6;?//右轮黑线(+)sbit ENB = P3^7;?//右轮驱动使能//=============PWM================#define PWM_COUST 100?//PWM细分等份uchar MOTO_speed1;??//左边电机转速uchar MOTO_speed2; ??//右边电机转速uchar PWM_abs1;???//左边电机取绝对值后占空比uchar PWM_abs2;???//左边电机取绝对值后占空比?uchar PWM_var1=20;??//左边电机直走速度(不同的电机,此参数不同)uchar PWM_var2=20;??//右边电机直走速度uchar PWMAnd = 0;??//PWM自增变量/****************************************************************** 名称:motor(char speed1,char speed2);功能:同时调节电机的转速参数:speed1:电机1的PWM值;speed2:电机2的PWM值?? speed>0.正转;speed<0.反转(-100~100)调用:extern int abs(int val); 取绝对值返回:/******************************************************************/ void motor(char speed1,char speed2){??//==============左边电机=============?if (speed1>0)??{??IN1 =0;IN2 =1;//正转??}???else if (speed1<0)??{??IN1 =1;IN2 =0;//反转??}?//==============右边电机=============?if (speed2>0)??{??IN3 =1;IN4 =0;//正转??}?else if (speed2<0)??{??IN3 =0;IN4 =1;//反转??}}/******************************************************************名称:motor_PWM();功能:PWM占空比输出参数:无调用:无返回:无/******************************************************************/void motor_PWM (){?uchar PWM_abs1;?uchar PWM_abs2;?PWM_abs1=MOTO_speed1;?PWM_abs2=MOTO_speed2;?if (PWM_abs1>PWMAnd) ENA=1;??? //左边电机占空比输出??else ENA=0;?if (PWM_abs2>PWMAnd) ENB=1;??? //右边电机占空比输出??else ENB=0;?if (PWMAnd>=PWM_COUST) PWMAnd=0;? //PWM计数清零??else PWMAnd+=1;}???/******************************************************************名称:void TIME_Init ();功能:定时器初始化指令:调用:无返回:无/******************************************************************/void TIME_Init ()?{//=========定时器T2初始化 PWM==================?T2CON = 0x00;? ?T2MOD = 0x00;? ?RCAP2H = 0xff;?//定时0.1ms? ?RCAP2L = 0x47;? ?TH2 = 0xff;? ?TL2 = 0x47;?ET2 = 1;??//定时器2中断开?TR2 = 1;??//PWM定时器关,PWM周期为10ms?}/******************************************************************名称:void PWM_Time2 () interrupt 5功能:T2中断,PWM控制参数:调用:motor_PWM();//PWM占空比输出返回:/******************************************************************/?void PWM_Time2 () interrupt 5{? ?TR2 = 0;?TF2 = 0;?ET2 = 0;?//定时器0中断禁止?motor_PWM();//PWM占空比输出?ET2 = 1;?//定时中断0开启?TR2 = 1;}main(){TIME_Init ()?;motor(50,50);//左右电机的转速都是50}。

AT89C52单片机简易计算器

AT89C52单片机简易计算器
lnumnow=lnumnow*10+2;
flag=2;
}
if(P3_4==0)//0
{
if(flag==1)
{
lnumbefore=lnumnow;lnumnow=0;digit=0;
}
if(flag==4)
{
lnumnow=0;
}
digit++;
lnumnow=lnumnow*10;
flag=2;
flag=2;
}
if(P3_4==0&&flag!=1)//=
{
switch(signal)
{
case '+':
lnumnow=lnumnow+lnumbefore;
lnumbefore=lnumnow;
break;
case '-':
lnumnow=lnumbefore-lnumnow;
lnumbefore=lnumnow;
break;
}
signal=0;
if(P3_7==0)//除
{
signal='/';
flag=1;
digit=0;
}
if(P3_6==0)//乘
{
flag=1;
signal='*';
digit=0;
}
if(P3_5==0)//减
{
flag=1;
signal='-';
digit=0;
}
if(P3_4==0)//加
lnumnow=lnumnow*10+4;
flag=2;
}

应用STC89C52设计的算器 Microsoft Word 文档

应用STC89C52设计的算器 Microsoft Word 文档

;//+**************************************************************************** ****;//*P2.0-P2.3做数码管位选信号,分别对应从右至左四个数码管;//*P0.0-P0.7做数码管段选信号,分别对应abcdefgh段;//*P1.0-P1.2做矩阵键盘行线,对应0、1、2行;//*P1.4-P1.7做矩阵键盘列线,对应0、1、2、3、4列;//***************************************************************************** ***ORG 0000HZ0 EQU 4FH ;输出的实际键值Z1 EQU 50H ;输出缓冲区,第一个数码管Z2 EQU 51H ;输出缓冲区,第二个数码管Z3 EQU 52H ;输出缓冲区,第三个数码管Z4 EQU 53H ;输出缓冲区,第四个数码管Z5 EQU 54H ;原始键值保存地址BAI EQU 55H ;进制转换,百位SHI EQU 56H ;进制转换,十位SHU1 EQU 60H ;输入的第一个数值,用十进制表示SUAN EQU 61H ;运算符存放地址,用键值表示SHU2 EQU 62H ;输入的第二个数值,用十进制表示JIEG EQU 63H ;结果存放地址,用十进制表示AJMP STARTORG 0100HSTART: ;初始化MOV Z0,#00MOV Z1,#00MOV Z2,#00MOV Z3,#00MOV Z4,#00MOV Z5,#00MOV BAI,#64 ;定义为8进制MOV SHI,#8 ;定义为8进制MOV SHU1,#00MOV SUAN,#00MOV SHU2,#00MOV JIEG,#00MAIN:ACALL KEY ;调用是否有键按下子程序JNZ JIANZHI ;若有键按下则跳转到键值计算子程序ACALL SHUCHU ;若无键按下则调用显示子程序AJMP MAIN;//****************************判断是否有键按下子程序******************************KEY:MOV A,#0F0HMOV P1,AMOV A,P1CPL AANL A,#0F0HRET;//***************************有键按下判断是哪个键并计算键值***********************JIANZHI:ACALL KEY ;再次调用键是否按下子程序JNZ LIE ;若还保持在按下状态AJMP MAIN ;若键闭合则调回主程序LIE: ;判断列值,并将列值赋给R5MOV P2,#0FFH ;关闭数码管的位选信号MOV R3,#0FEHMOV R5,#4 ;列值从左到右依次为1、2、3、4LIE0:MOV A,R3RR AMOV R3,AMOV P1,AMOV A,P1CPL AANL A,#0FHJNZ HANGDJNZ R5,LIE0AJMP MAINHANG: ;判断行值,并将行值赋给R1MOV R4,#0F7HMOV R1,#3 ;行值从上到下依次为1、2、3HANG0:MOV A,R4RR AMOV R4,AMOV P1,AMOV A,P1CPL AANL A,#0F0HJNZ JIANZHI0DJNZ R1,HANG0AJMP MAINJIANZHI0: ;计算键值,并将键值送至原始键值存储单元Z5MOV A,R5 ;计算方法,键值=(行值-1)*4+(列值-1)DEC AMOV R5,AMOV A,R1DEC AMOV R1,AMOV A,R1MOV B,#4MUL ABADD A,R5MOV Z5,A ;原始键值保存在Z5中WAIT:ACALL KEYJZ DINGYI ;若键松开则调用键功能数值定义子程序AJMP W AIT ;若键没有松开则等待EXIT:ACALL YIWEIAJMP MAIN;////************************定义每个键的功能或数值子程序****************************DINGYI:MOV A,Z5JIAN0:CJNE A,#0,JIAN1 ;MOV Z0,#0 ;若修改键值则修改此处的源操作数AJMP EXIT ;若定义功能键则修改跳转子程序JIAN1:CJNE A,#1,JIAN2MOV Z0,#1 ;把实际键值送至实际键值存储单元Z0AJMP EXITJIAN2:CJNE A,#2,JIAN3MOV Z0,#2AJMP EXITJIAN3:CJNE A,#3,JIAN4MOV Z0,#3AJMP EXITJIAN4:CJNE A,#4,JIAN5MOV Z0,#4AJMP EXITJIAN5:CJNE A,#5,JIAN6MOV Z0,#5AJMP EXITJIAN6:CJNE A,#6,JIAN7MOV Z0,#6AJMP EXITJIAN7:CJNE A,#7,JIAN8MOV Z0,#7AJMP EXITJIAN8:CJNE A,#8,JIAN9MOV SUAN,AAJMP SHUZHI1JIAN9:CJNE A,#9,JIAN10MOV SUAN,AAJMP SHUZHI1JIAN10:CJNE A,#10,JIAN11AJMP QINGJIAN11:CJNE A,#11,EXITAJMP SHUZHI2AJMP EXIT;//************************计算输入的第一个数的值子程序****************************SHUZHI1:MOV A,Z3MOV B,BAIMUL ABMOV R0,AMOV A,Z2MOV B,SHIMUL ABADD A,R0ADD A,Z1MOV SHU1,AMOV Z0,#0MOV Z1,#0MOV Z2,#0MOV Z3,#0AJMP MAIN;//************************计算输入的第二个数的值子程序****************************SHUZHI2:MOV A,Z3MOV B,BAIMUL ABMOV R0,AMOV A,Z2MOV B,SHIMUL ABADD A,R0ADD A,Z1MOV SHU2,AMOV Z0,#0MOV Z1,#0MOV Z2,#0MOV Z3,#0AJMP DENG;//************************进制转换子程序*************************************** JINZHI:MOV A,JIEGMOV B,BAIDIV ABMOV Z2,A ;百位存放在Z2,最后调用一次以为程序MOV A,BMOV B,SHIDIV ABMOV Z0,B ;个位存放在Z0,最后调用一次以为程序MOV Z1,A ;十位存放在Z1,最后调用一次以为程序MOV Z3,#0RET;//************************加法子程序**********************************************JIA:MOV A,SHU1ADD A,SHU2MOV JIEG,AAJMP DENG0;//************************减法子程序**********************************************JIAN:MOV A,SHU1SUBB A,SHU2MOV JIEG,AAJMP DENG0;//************************乘法子程序**********************************************CHENG:MOV A,SHU1MOV B,SHU2MUL ABMOV JIEG,AAJMP DENG0;//************************除法子程序**********************************************CHU:MOV A,SHU1MOV B,SHU2DIV ABMOV JIEG,AAJMP DENG0;//************************清零子程序**********************************************QING:AJMP START;//************************等号子程序**********************************************DENG:MOV A,SUAN ;判断运算符存放的地址里的数值并跳转SUBB A,#8JZ JIAMOV A,SUANSUBB A,#9JZ CHENGDENG0:ACALL JINZHIAJMP EXIT;//************************移位子程序**********************************************YIWEI: ;把Z3,Z2,Z1,Z0里的各个数字依次向左移一位MOV R0,Z0MOV R1,Z1MOV R2,Z2MOV R3,Z3MOV Z3,R2MOV Z2,R1MOV Z1,R0RET;//************************输出显示子程序******************************************SHUCHU:CLR P2.0 ;显示第一个数码管,从数右边第一个数码管MOV DPTR,#TABMOV A,Z1 ;显示个位数,正反显示修改此处MOVC A,@A+DPTRMOV P0,AACALL DELAYSETB P2.0CLR P2.1 ;显示第二个数码管,从数右边第二个数码管MOV DPTR,#TABMOV A,Z2 ;显示十位数,正反显示修改此处MOVC A,@A+DPTRMOV P0,AACALL DELAYSETB P2.1CLR P2.2 ;显示第三个数码管,从数右边第三个数码管MOV DPTR,#TABMOV A,Z3 ;显示百位数,正反显示修改此处MOVC A,@A+DPTRMOV P0,AACALL DELAYSETB P2.2CLR P2.3 ;显示第四个数码管,从数右边第四个数码管MOV DPTR,#TABMOV A,Z4MOVC A,@A+DPTRMOV P0,AACALL DELAYSETB P2.3RET;//************************共阳极八段数码管****************************************TAB:DB 0C0H,0F9H,0A4H,0B0HDB 099H,092H,082H,0F8HDB 080H,090H,088H,083HDB 0C6H,0A1H,086H,084H;//************************用于动态显示延时子程序**********************************DELAY:MOV R4,#5D1:MOV R3,#239DJNZ R3,$DJNZ R4,D1RETEND。

89C52单片机液晶汉字显示c语言程序

89C52单片机液晶汉字显示c语言程序

89C52单片机液晶汉字显示c语言程序*液晶屏分为4行*12列汉字,全部使用模拟接口方式。

/* TGLCMLIMIT64A接口程序(模拟方式);**********************单片机液晶汉字显示c语言程序*****************************************************;连线图:;*LCM---89C52* *LCM---89C52* *LCM-------89C52* *LCM----------89C52* *;*DB0---P0.0* *DB4---P0.4* *D/I-------P2.6* *CS1----------P2.4* *;*DB1---P0.1* *DB5---P0.5* *R/W-------P2.7* *CS2----------P2.5* *;*DB2---P0.2* *DB6---P0.6* *RST--------VCC* *CS3----------P3.2* *;*DB3---P0.3* *DB7---P0.7* *E---------P2.3* *;注:89C52的晶振频率为12MHz *;*****************************单片机液晶汉字显示c语言程序**********************************************///画线部分请参照avr的c程序。

/*#pragma src /*生成ASM文件开关,必要时打开*/#include<REG52.H>#include<math.h>#include<INTRINS.H>#define Uchar unsigned char/***********液晶显示器接口引脚定义***************/sbit Elcm= P2^3; //sbit CS1LCM= P2^4; //sbit CS2LCM= P2^5; //sbit CS3LCM= P3^2; /*这个连接只是做实验的临时接法。

STC89C52单片机用C语言设计的密码锁(含电路图,功能操作说明)M

STC89C52单片机用C语言设计的密码锁(含电路图,功能操作说明)M

P2 = 0xfb; P0 = table[h6]; delay1(1);// P0=0XFF;
delay2(1);
delay1(1);//
P2 = 0xf7; P0 = table[h5];
P0=0XFF;
delay1(1);// delay2(1);
P2=0xEF; P0=table[h4];
P0=0XFF;
glob_b[m2] = 2; delay(150);
uchar j; m = key_scan2();
switch(glob_c) { case 0x00:
break; case 0xee:
break; case 0xed:
glob_b[m2] = 3; delay(150);
glob_b[m2] = 4; delay(150);
uchar w1,w2;
P1=0X0F;
//
//
//
//
glob_k=0;
//
} }
//按键密码输入值函数 void value1(void) { // uchar m;
uchar i; //
if(key==1) //key=1 表示有按键按下 {
w1=P1&0X0F; if(w1!=0x0f) {
if(K1==0) {
delay(2);
出 6 位密码
} if(K2==0)
{
}
//确定键
if(K1==0) { glob_k=0; key5=1; get_6dat(); //读
}
delay(2); if(K2==0) { key4++;
//表示第二次按下就把设定的密码输入 iic

89C52PWM输出程序(C语言)

89C52PWM输出程序(C语言)

89C52 PWM输出程序(C语言)2009-09-15 18:55:10来源: 作者: 【大中小】浏览:52次评论:0条#include <reg52.h> //Keil header file name#include "use.h"#include "Ver.h"//extern void LedOut(unsigned char *pLed);#define Pmax 55000 //55000 //42666(18.4320)#define Ki 2.2 //i=2//----------------------------sbit PwinPin=P3^5;//----------------------------typedef union{unsigned int Pwm; //pwm的数据unsigned char PwmUse[2]; //[0]=H;[1]=L}PWM;//----------------------------PWM PwmData;unsigned int PwmBak;//----------------------------unsigned char PwmF=0; //输出的1,0的标志/*****************************************PWM计算,输出t0=T50ms(b0/[fs-fo]+Sgn(U)*20%+a1;T50ms=Pwm50+Ah;B0<fo=>0V;Must Bo In(Fo-Fs)*******************************************/void PwmOut(void){float Pwm,i,k,j;k=Pmax+(Mp1.AH+OminH)*Ki;i=(PminL+Mp1.AL)*Ki;//----------------------------//LedOut(LedBuf); //LED显示输出//----------------------------j=(LedMenu.B-Mp1.Fo)/(Mp1.Fs-Mp1.Fo);if(j<0) j=0;if(j>1) j=1;Pwm=j*k; //Bo/(Fs-Fo)*Pkj=Pwm*0.8+k*0.2+i; //先计算if(Mp1.U==1) {Pwm=j;}else Pwm=Pwm+i;TR0=0;PwmBak=(unsigned int)Pwm; //更新数据 TR0=1;}//-------------------------------void Init_Pwm(void){PwmData.Pwm=0;PwmPin=0; //输出0 (地点平)// PwmOut();}//定时器0 中断处理 pwmout()void T0_Do(void) interrupt 1{TR0=0;if(PwmF==0) //输出高电平{PwmData.Pwm=-PwmBak;TH0=PwmData.PwmUse[0];TL0=PwmData.PwmUse[1];PwmPin=1; //0 输出PwmF=1;}else{PwmData.Pwm=-PwmData.Pwm;TH0=PwmData.PwmUse[0];TL0=PwmData.PwmUse[1];PwmPin=0; //1 输出PwmF=0;}TR0=1;}。

STC89C52RC单片机过亿计数器的实现

STC89C52RC单片机过亿计数器的实现

无所不能的单片机,很多朋友问我:单片机计十进制的数计到65535可以,超过65535却怎么写程序都不成功,即使生成了hex文件,但烧入单片机还是难以如愿。

对此,我一并回复,程序如下:#include<reg52.h>//52单片机头文件#include<MATH.H>//含计算头文件#define uchar unsigned char#define uint unsigned int#define ulong unsigned long//long整型无符号,最大只能计到4294967295sbit shiwei1=P3^1;//定义十亿位和亿位两个位显口sbit shiwei0=P3^0;ulong nm,num,num1;/*uchar code table[]={ //共阴数码管表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};*/uchar code table[]={//共阳数码管表0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delayms()//延时子程序{uchar i,j;for(i=5;i>0;i--)for(j=110;j>0;j--);}void display(uchar syi,uchar yi,uchar qwan,uchar bwan,uchar swan,uchar wan,uchar qian,uchar bai,uchar shi,uchar ge) //显示子程序{P0=table[syi];//P0口段显shiwei1=1;delayms();shiwei1=0;P0=table[yi];shiwei0=1;delayms();shiwei0=0;P0=table[qwan];P2=0x80;//P2口位显,10000000delayms();P0=table[bwan];P2=0x40;//1000000delayms();P0=table[swan];P2=0x20; //100000delayms();P0=table[wan];P2=0x10;//10000;delayms();P0=table[qian];P2=0x8;//1000.delayms();P0=table[bai];P2=0x4; //100.delayms();P0=table[shi];P2=0x2;//10.delayms();P0=table[ge];P2=0x1;//1delayms();}uint read()//计算子程序{uchar tl,th1,th2;uint val;while(1){th1=TH0;tl=TL0;th2=TH0;if(th1==th2)break;}val=th1*256+tl;return val; //return为带返回值的函数}void main()//主函数{uchar syi,yi,qwan,bwan,swan,wan,qian,bai,shi,ge;TMOD=0x05; //0000 0101TH0=0;TL0=0;TR0=1;EA=1;ET0=1;while(1){num=num1+read();syi=num/1000000000;yi=num%1000000000/100000000;qwan=num/10000000%100000000;bwan=num/1000000%10000000;swan=num/100000%1000000;wan=num/10000%100000;qian=num/1000%10000;bai=num/100%1000;shi=num/10%100;ge=num%10;display(syi,yi,qwan,bwan,swan,wan,qian,bai,shi,ge);}}void T0_time() interrupt 1{uchar a=0;nm=65535;TH0=0;TL0=0;a++;num1=nm*a;}。

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器

基于STC89C52单片机的计算器随着科技的不断发展,单片机已经成为现代电子设备中的重要组成部分。

STC89C52单片机作为一种常见的单片机,因其高性价比和良好的性能而广泛应用于各种嵌入式系统中。

本文将介绍如何使用STC89C52单片机制作一个简单的计算器。

一、硬件设计1、电源电路:为单片机提供稳定的电源。

2、时钟电路:为单片机提供时钟信号,确保其正常运行。

3、复位电路:在单片机出现异常时,通过复位电路实现系统重启。

4、输入电路:用于接收用户输入的数字和运算符。

5、输出电路:用于显示计算结果。

二、软件设计1、初始化程序:对单片机的各个寄存器进行初始化。

2、显示程序:根据需要显示的内容,编写相应的显示程序。

3、输入程序:接收用户输入的数字和运算符,并将其存储在相应的变量中。

4、计算程序:根据用户输入的运算符,调用相应的函数进行计算,并将结果显示在输出电路中。

三、调试与测试1、硬件调试:检查电路板上的元器件是否连接正确,确保电源、输入和输出电路的正常工作。

2、软件调试:通过串口调试工具,对程序进行调试和修改,确保程序的正确性。

3、综合测试:在完成硬件和软件的调试后,进行综合测试,确保计算器的正常工作。

四、结论本文介绍了基于STC89C52单片机的计算器的硬件和软件设计。

通过使用单片机,可以实现简单的计算器功能,并且具有成本低、易于维护和升级等优点。

在制作过程中,需要注意硬件和软件的调试与测试,以确保系统的稳定性和可靠性。

stc89c52单片机技术资料标题:STC89C52单片机技术资料一、概述STC89C52单片机是一种广泛应用的微控制器,它由深圳宏晶科技有限公司生产。

这款单片机具有高性能、低功耗、高可靠性等特点,适用于各种嵌入式系统开发。

下面将详细介绍STC89C52单片机的技术特性、引脚配置、寄存器映射以及常用开发工具等。

二、STC89C52单片机特性1、工作频率:STC89C52单片机的时钟频率可达到35MHz,能够满足大多数应用场景的需求。

51单片机STC89C52RC上生成CRC16校验码的C语言程序

51单片机STC89C52RC上生成CRC16校验码的C语言程序

/*一段简单的51单片机CRC16校验码生成代码,上机测试通过,给那些想拿来主义的朋友们使用或许有用@Email:***********//*本代码在Keil中测试通过,在STC89C52RC单片机上测试通过*/#include <STC89C5xRC.H>#define uint unsigned int#define uchar unsigned char#define ushort unsigned shortuchar test_DATA[6]={0x01,0x06,0x00,0x01,0x00,0x17}; /////待校验数据,一组6字节的数据ushort CRC16num; ///////////CRC16校验码存储变量/////////////标准CRC16校验查询表,不要问我怎么得来的,就是这么用////////////////////////////////// CRC 高位字节值表*/////////////////////////////////////////// static uchar code auchCRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80,0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;////////////////////////////////// CRC 低位字节值表/////////////////////////////////////static uchar code auchCRCLo[] = {0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04,0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8,0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10,0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C,0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0,0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C,0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54,0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98,0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40};////////////////////////////////////////////////////////////////////////////////////////////////////// ///CRC16校验函数,使用函数需输入待校验数组指针(数组名字咯)与数组字节数,返回值为ushort型16位CRC校验码///ushort CRC16(uchar *puchMsg , ushort usDataLen ){uchar uchCRCHi = 0xFF ; /* 高CRC字节初始化*/uchar uchCRCLo = 0xFF ; /* 低CRC字节初始化*/uint uIndex ; /* CRC循环中的索引*/while (usDataLen--) /* 传输消息缓冲区*/ {uIndex = uchCRCHi ^ *puchMsg++ ; /* */uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex]; /* 计算CRC */uchCRCLo = auchCRCLo[uIndex] ; /* */}return (uchCRCHi << 8 | uchCRCLo) ;}////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////主函数////////////////////////////////////////////////////////void main(){///////////////串口通讯相关设定://******************///////////////////////////////////// PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xFD; //设定定时初值TH1 = 0xFD; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1////////////////////////////////////////////////////////////////////////////////////////////////////////计算出CRC16校验码后通过串口发送,可用串口通讯助手等软件察看CRC16校验码////本例计算出的正确的CRC16校验码数值为:0x9804//while(1){CRC16num=CRC16(test_DATA,6);SBUF=CRC16num>>8;while (!TI);TI=0;SBUF=CRC16num;while (!TI);TI=0;}}//////////////////////////////////////////////////////////////////////////////////////////////////////。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STC89c52单片机计算器C语言程序STC89C52单片机计算器C语言程序下面是STC89C52单片机计算器的C语言程序,适用于P2位选P0段选时钟12MHZ。

程序代码如下:includedefine uchar unsigned chardefine uint unsigned intuchar Led[17] = {0x3f。

0x06.0x5b。

0x4f。

0x66.0x6d。

0x7d。

0x07.0x7f。

0x6f。

0x77.0x7c。

0x39.0x5e。

0x79.0x71.0x00};long float Number[]={0,0,0,0};uchar A[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};long int D[] = {0,0,0,0,0,0,0,0};uchar code C[] = {0x0.0xFE。

0xFD。

0xFB。

0xF7.0xEF。

0xDF。

0xBF。

0x7F};uchar k=16;uchar b;long float Out_put;uchar e=0;uchar g=0;uchar L=0;uchar g1=0;uchar g2=0;uchar g3=0;uchar g4=0;char j=-1;uchar m=0;uchar n=0;uchar x=0;程序中包含了头文件和宏定义,以及数码管段选、数码管显示位控制寄存器、数码管显示内容寄存器、数码管位选、按键控制变量等各种变量。

其中,Led数组存储了数码管的段选值,Number数组存储了数字,A数组存储了数码管的位选值,D数组存储了数码管的显示内容,C数组存储了数码管的位选值,k、b、Out_put、e、g、L、g1、g2、g3、g4、j、m、n、x 等变量用于按键控制和运算。

代码中没有明显的格式错误,可以直接使用。

下面是已经修改过的文章:uchar xo = 0./*控制开始计数小数点的变量*/long int result;void Delay(uint o) {uint i。

j;for(i = 0.i < o。

i++) {for(j = 0.j < 121.j++) {void show(long float Out_put) { uchar r;uchar k;long int q。

p;uchar s = 0;uchar i;long int temp;temp = Out_put;if((Out_put - temp)。

= 0) { result = Out_put * ;r = 4;else {result = Out_put;r = 0;p = result;if(m == 1) {if(result < 0) { result = -result;p = result;q = result;for(i = 1.i <= 8.i++) { q = q / 10;if(q == 0) {k = i;i = 9;P0 = 0x40;P2 = C[8 - k]; Delay(1);负号的显示P0 = 0x80;P2 = C[r];Delay(1);P0 = 0x00;result = p;P0 = Led[result % 10];P2 = C[8];result = result / 10;Delay(1);if((result % 10 == 0) && (result % 100 == 0) && (result % 1000 == 0) && (result % == 0) && (result % == 0) && (result % xxxxxxx == 0)) {P0 = 0x00;else {P0 = Led[result % 10];P2 = C[7];result = result / 10;Delay(1);if((result % 10 == 0) && (result % 100 == 0) && (result % 1000 == 0) && (result % == 0) && (result % == 0)) { P0 = 0x00;文章已经没有明显的格式错误和段落问题。

稍作修改,将变量名和注释变成英文,可以提高代码的可读性。

void display_result() {显示结果if (result == 0) {P0 = 0x00;else {P0 = Led[result % 10];P2 = C[6];result = result / 10;Delay(1);if ((result % 10 == 0) && (result % 100 == 0) && (result % 1000 == 0) && (result % == 0)) {P0 = 0x00;else {P0 = Led[result % 10];P2 = C[5];result = result / 10;Delay(1);if ((result % 10 == 0) && (result % 100 == 0) && (result % 1000 == 0)) {P0 = 0x00;else {P0 = Led[result % 10];P2 = C[4];result = result / 10;Delay(1);if ((result % 10 == 0) && (result % 100 == 0)) {P0 = 0x00;else {P0 = Led[result % 10];P2 = C[3];result = result / 10;Delay(1);if (result % 10 == 0) {P0 = 0x00;else {P0 = Led[result % 10]; P2 = C[2];result = result / 10; Delay(1);if (result == 0) {P0 = 0x00;else {P0 = Led[result % 10]; P2 = C[1];result = result / 10; Delay(1);void input_decimal() { 输入小数加小数点uchar i;if (k。

= 0 && k <= 9) { switch (e) {case 8:D[7] = D[6];A[7] = A[6];case 7:D[6] = D[5];A[6] = A[5];case 6:D[5] = D[4];A[5] = A[4];case 5:D[4] = D[3];A[4] = A[3];case 4:D[3] = D[2];A[3] = A[2];case 3:D[2] = D[1];A[2] = A[1];case 2:D[1] = D[0];A[1] = A[0];case 1:if (n == 0) {D[0] = k;A[0] = Led[k];if (xo == 1) {x++;if (n == 1) {A[0] = Led[k] | 0x80; xo = 1;n = 0;The following code is used to XXX。

The code includes a switch statement that checks the value of the variable k。

which represents the n to be performed。

If k is een 11 and 15 and b is equal to 1.the switch XXX on the n being performed。

The code also includes a n called Key_scan()。

which scans the keyboard for input。

The n saves the state of the keyboard when a key is pressed and then determines which key was pressed based on the saved state。

If a number key is pressed。

the n calls the In_put() n to input the number.XXX of the code。

some minor changes have been made。

The formatting errors have been corrected。

and some paragraphs that XXX.The code includes a switch XXX the value of the variable k。

which represents the n to be performed。

If k is een 11 and 15 and b is equal to 1.the switch XXX.The code also includes a n called Key_scan()。

which scans the keyboard for input。

The n saves the state of the keyboardwhen a key is pressed and then determines which key was pressed based on the saved state。

If a number key is pressed。

the n calls the In_put() n to input the number.Overall。

the code is XXX and to input numbers from the keyboard。

The code could be improved by adding more comments to explain the purpose of each n and variable。

nally。

the code could be XXX.以下是格式错误已经删除后的文章:在程序设计中,数字和字符的转换是一个很常见的任务。

在C语言中,可以通过ASCII码表将字符转换为对应的数字。

相关文档
最新文档