config.h
[C] 纯文本查看 复制代码 //--------------------------------------------------------------
/*本代码严格遵循微软代码风格约定
//---------------------------------------------------------------
代码风格约定:
局部变量: 小写可(加下划线)
float sum = 0.0f;
float sum_count = 0;
全局变量: g_开头加小驼峰(可加下划线)
int g_maxStudents = 100;
float g_averageScore = 0.0f;
函数: 大驼峰(可加下划线)
int CalculateSum(int x, int y);
int Calculate_Sum(int x, int y);
宏定义: 全大写
#define PI 3.14159265358979323846
*/
//----------------------------------------------------------------
/*程序说明:
降龙棍~
//-------------------------------------------------------------------------------------------
定时器0:
T0计数器.代码中的 TMOD 寄存器设置为 0x04使用的是外部计数模式2,计数器触发的引脚是 T0(即 P3.4 引脚)
P34 引脚是定时器0的外部计数脉冲输入引脚。
这意味着 P34 引脚上的电平变化将触发定时器0的计数器计数。
定时器0被设置为外部计数模式,因此定时器0的计数脉冲源就来自于 P34 引脚,当 P34 引脚上的电平发生上升沿时,
定时器0的计数器就会加 1。这种外部计数模式可用于测量外部脉冲信号的频率、周期、占空比等特征,或者用于实现定时器功能。
//-------------------------------------------------------------------------------------------
默认脉冲触发引脚
Timer0:T0(P3.4)
Timer1:T1(P3.5)
其余3个定时器 请参考stc官方手册进行编写
*引脚说明:
P34 引脚是定时器0的外部计数脉冲输入引脚
数码管位:P27
数码管段:P26
~74HC573,4位数码管接线在P0口,数码管采用共阴极
同步89开发板的时钟,这里为了与89开发板同步做实验统一用11.0592晶振
*/
#ifndef __CONFIG_H__
#define __CONFIG_H__
#include <STC32G.H>
/*定义无符号整数类型*/ #define ULONG unsigned long
extern ULONG g_num;
// 编程框架函数声明
void Sys_Init();
void Sys_Draw();
void User_Updata();
void Sys_Updata();
// 用户函数声明
#endif
display.h
[C] 纯文本查看 复制代码 #ifndef __DISPLAY_H__
#define __DISPLAY_H__
#include "config.h"
#define SEGPORT P0
void Seg_Scan(ULONG val);
void Show_Duan(char wei, char val);
void Delay1ms();
#endif
init.h
[C] 纯文本查看 复制代码 #ifndef __INIT_H__
#define __INIT_H__
#include "config.h"
void Init0_Counter_0();
void Init1_Counter_1();
#endif
main.c
[C] 纯文本查看 复制代码
#include "config.h"
#include "display.h"
#include "init.h"
ULONG g_num=0;
void main()
{
// 采用框架式编程
// 1.定义数据
// 2.系统初始化数据
Sys_Init(); // 初始化
while (1)
{
// 3.系统数据绘制
Sys_Draw();
// ----------------------------------------4.数据更新
// 4.1用户干预更新数据
User_Updata();
// 4.2 系统自动更新数据
Sys_Updata();
}
}
// 系统式编程框架-----------------------------------------------
/*初始化函数*/
void Sys_Init()
{
Init1_Counter_1();
}
/*绘制处理数据*/
void Sys_Draw()
{
Seg_Scan(g_num);
}
/*用户干预更新数据*/
void User_Updata()
{
}
/*系统更新数据*/
void Sys_Updata()
{
}
// 下面数用户函数实现区域-----------------------------------
display.c
[C] 纯文本查看 复制代码 #include "display.h"
sbit g_duan = P2 ^ 6; // 定义段引脚
sbit g_wei = P2 ^ 7; // 定义位引脚
unsigned char code g_duan_Data[] = {
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, // 熄灭
0x00 // 自定义
};
/*数码管位表*/
unsigned char code g_wei_Data[] = {
0xfe, // 1111 1110 b
0xfd, // 1111 1101 b
0xfb, // 1111 1011 b
0xf7, // 1111 0111 b
0xef, // 1110 1111 b
0xdf, // 1101 1111 b
0xbf, // 1011 1111 b
0x7f // 0111 1111 b
};
/*显示一个段值到数码管上
*参数1,duan 需要显示到哪一个段上0-7
*参数2,val 需要显示什么值0-9
*/
void Show_Duan(char wei, char val)
{
SEGPORT = 0xff; // 清断码
g_wei = 1; // 打开位选
SEGPORT = g_wei_Data[wei]; // 选择位
g_wei = 0; // 关闭位选
SEGPORT = 0xff; // 清断码
g_duan = 1; // 打开段选
SEGPORT = g_duan_Data[val]; // 选择段
g_duan = 0; // 关闭段选
}
/*数码管扫描函数
*参数1:数码管需要显示的函数
*/
void Seg_Scan(ULONG val)
{
char i;
char VAL_arr[8];
char count = 0;
if (val ==0)
{
Show_Duan((char)(7), 0);
}
while (val != 0)
{
VAL_arr[count] = val % 10;
val = val / 10;
count++;
for (i = 0; i < count; i++)
{
Delay1ms();
Show_Duan((char)(7 - i), VAL_arr[i]);
}
}
}
void Delay1ms() //@11.0592MHz
{
unsigned long i;
_nop_();
_nop_();
_nop_();
i = 551UL;
while (i)
i--;
}
init.c
[C] 纯文本查看 复制代码
#include "init.h"
/*定时器0作为计数器初始化*/
void Init0_Counter_0()
{
EAXFR = 1; // 使能访问 XFR
CKCON = 0x00; // 设置外部数据总线速度为最快
WTST = 0x00; // 设置程序代码等待参数,赋值为 0 可将 CPU 执行程序的速度设置为最快
// 设置各个引脚为普通I/O模式
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
/*
TL0 和 TH0 是定时器0的低8位和高8位计数器寄存器,
用于设定定时器0的计数初值。
在该代码中,将 TL0 和 TH0 都设置为 0xff,意味着定时器0的计数初值为 0xffff,
即定时器0从 0xffff 开始计数,每计数一次减一,直到计数器清零,此时会产生一次定时器0中断。
由于定时器0在外部计数模式下,
其计数脉冲源来自于外部引脚 T0,当 T0 引脚的电平发生一个上升沿时,
定时器0计数器加 1。因此,当外部的 T0 引脚接入一个脉冲信号源时,每个脉冲信号会使定时器0计数器加 1,当计数器计数到 0xffff 时,
就会产生一次定时器0中断。由于本代码将 TL0 和 TH0 都设置为 0xff,相当于定时器0的计数器初值为最大值,这样可以使定时器0最大延时。
*/
TMOD = 0x04; // 设置定时器0为外部计数模式2
TL0 = 0xff; // 设置定时器0初值为0xffff
TH0 = 0xff;
TR0 = 1; // 启动定时器
ET0 = 1; // 使能定时器中断
EA = 1; // 使能总中断
}
/*定时器1作为计数器初始化*/
void Init1_Counter_1()
{
EAXFR = 1; // 使能访问 XFR
CKCON = 0x00; // 设置外部数据总线速度为最快
WTST = 0x00; // 设置程序代码等待参数,
// 赋值为 0 可将 CPU 执行程序的速度设置为最快
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
TMOD = 0x40; // 外部计数模式
TL1 = 0xff;
TH1 = 0xff;
TR1 = 1; // 启动定时器
ET1 = 1; // 使能定时器中断
EA = 1;
}
void T0_Isr() interrupt 1 // 定义定时器0中断服务函数
{
g_num++; // 外部脉冲统计
}
void T1_Isr() interrupt 3 // 定义定时器1中断服务函数
{
g_num++; // 外部脉冲统计
}
|