51_频率计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | /**********************51单片机学习例程************************ * 平台:Keil U4 + STC89C52 * 名称: 频率计 * 编写:Tony * 日期:2022-3-5 * QQ : 674749794 * 晶体:12MHZ * 变更记录:无 ******************************************************************/ #include <reg51.h> #include "lcd.h" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //--定义LCD显示的文字--// uchar code EN_CHAR1[16]={ " CYMOMETER " }; uchar code EN_CHAR2[16]={ "FREQ: HZ" }; //--声明全局函数--// void Timer_Configuration(); //初始化定时器 //--定义全局变量--// ulong Freq; //用来存放要显示的频率值 ulong TimeCount; //用于计算1S钟的 //sbit LSA=P2^2; //sbit LSB=P2^3; //sbit LSC=P2^4; //138译码器,数码管的位选 //#define GE {LSA=1;LSB=1;LSC=1;} //打开个位位选端 //#define SHI {LSA=0;LSB=1;LSC=1;} //打开十位位选端 /******************************************* *函数名 :main *功 能 :主函数 *输 入 :无 *输 出 :无 *******************************************/ void main() { uchar i, freqValue[6]; LcdInit(); Timer_Configuration(); //显示要写的字母 for (i=0; i<16; i++) { LcdWriteData(EN_CHAR1[i]); } LcdWriteCom(0x80+0x40); for (i=0; i<16; i++) { LcdWriteData(EN_CHAR2[i]); } while (1) { if (TR0==0) //当计数器提下的时候,表明计数完毕,定时器0定时1S { Freq=Freq+TL1; //频率的计数是计数器1 Freq=Freq+(TH1*256); LcdWriteCom(0xc8); //--求频率的个十百千万十万位 freqValue[0]= '0' +Freq%1000000/100000; freqValue[1]= '0' +Freq%100000/10000; freqValue[2]= '0' +Freq%10000/1000; freqValue[3]= '0' +Freq%1000/100; freqValue[4]= '0' +Freq%100/10; freqValue[5]= '0' +Freq%10; //--显示求得的数值 for (i=0;i<5;i++) //从最高位开始查找不为0的数开始显示(最低位为0显示0) { if (freqValue[i]==0x30) { freqValue[i]=0x20; //若为0则赋值空格键 } else { break ; } } for (i=0;i<6;i++) { LcdWriteData(freqValue[i]); } //--显示完,重新计算下一次频率。--// Freq=0; //将计算的频率清零 TH1=0; //将计数器的值清零 TL1=0; TR0=1; //开启定时器 TR1=1; //开启计数器 } } } /******************************************* *函数名 :Timer_Configuration *功 能 :配置定时/计数器T0和T1 *输 入 :无 *输 出 :无 *******************************************/ void Timer_Configuration() { //--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--// //--定时器T0做定时器,工作方式1(16位定时器),只由TRx打开定时器--// TMOD=0x51; //--设置定时器晶振为12MHZ时定时50ms--// TH0=0x3C; TL0=0xB0; //--打开中断-// ET0=1; ET1=1; EA=1; //--打开定时器*/ TR0=1; TR1=1; } /******************************************* *函数名 :Timer0 *功 能 :定时器0的中断函数 *输 入 :无 *输 出 :无 *******************************************/ void Timer0() interrupt 1 { TimeCount++; if (TimeCount==20) //计时到1S { TR0=0; TR1=0; TimeCount=0; } //--12MHZ设置定时50ms的初值--// TH0=0x3C; TL0=0xB0; } /******************************************* *函数名 :Timer1 *功 能 :定时器1的中断函数 *输 入 :无 *输 出 :无 *******************************************/ void Timer1() interrupt 3 { //--进入一次中断,表明计数到了65536--// Freq=Freq+65536; } |
VR1最小:
VR1最大
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具